硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4518|回复: 4
收起左侧

[FreeRTOS] xEventGroupSetBits返回错误

[复制链接]

1

主题

38

回帖

41

积分

新手上路

THINK

积分
41
发表于 2016-9-19 09:18:40 | 显示全部楼层 |阅读模式
Hi:
我把FREERTOS 移植到STM32F401RE上面,函数库为STM32Cube1.9.0,移植好,跑了个灯,没啥问题。
遇到一个奇怪的问题,在任务间通信的时候。
uxBits=xEventGroupSetBits(myEventGroup,BIT_0);
执行这句话之后返回0,通过单步调试看,确实是0,但是

uxBits=xEventGroupWaitBits(myEventGroup,
                             BIT_0,
                             pdTRUE,
                             pdTRUE,
                             xTickToWait);
这个任务是能收到事件标志的,
问题定位: 查到任务2 加延时,uxBits=xEventGroupSetBits(myEventGroup,BIT_0); 就能返回1,如果任务2不加延时,返回就是0,但是waitBits 是能收到设置的事件标志,不管返回0,还是返回1,好奇怪。

void vTaskTwo(void *pvParameters)
{
  EventBits_t uxBits;
  const TickType_t xTickToWait=100/portTICK_PERIOD_MS;
  printf("\n\r============  start Task2 ============ \n\r");
  while(1)
  {
    uxBits=xEventGroupWaitBits(myEventGroup,
                             BIT_0,
                             pdTRUE,
                             pdTRUE,
                             xTickToWait);
    if((uxBits&BIT_0)==BIT_0)
    {
      printf("\n\r接收到BIT0被置1的消息\n\r");   
    }
    else
    {
      printf("\n\r——————————————没有接收到BIT0被置1的消息——————————————\n\r");
    }
    vTaskDelay(200); /////////////这个地方导致不加延时导事件标志 返回0
  }
}

版主有没有遇到这样的问题?
20160919115459.png

在任务2中,加入任务锁,能解决这个问题,但是按键检测是优先级是6,任务2的优先级是3.也打断不了任务6。好奇怪。
i love ARM
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2016-9-19 17:08:46 | 显示全部楼层
这个问题有点太奇葩,就你给的这些内容来看,没有发现什么问题。

另外你的这个函数uxBits=xEventGroupSetBits(myEventGroup,BIT_0); 是在那个任务里面,是优先级为6的任务吗。
如果是的话,可以在这个函数的前后都加上个串口打印,看看是否有任务切换发生,如果有,说明异常了。
回复

使用道具 举报

1

主题

38

回帖

41

积分

新手上路

THINK

积分
41
 楼主| 发表于 2016-9-20 14:42:40 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个问题有点太奇葩,就你给的这些内容来看,没有发现什么问题。

另外你的这个函数uxBits=xEventGroupSetBits(myEventGroup,BIT_0); 是在那个任务里面,是优先级为6的任务吗。
如果是的话,可以在这个函数的前后都加上个串口打印,看看是否有任务切换发生,如果有,说明异常了。 (2016-09-19 17:08) 
Hi Eric:
很高兴看到的回复,是在任务级别为6的任务里面运行的.
我查了下文档,
这个说明很重要:
void aFunction( EventGroupHandle_t xEventGroup )
{
EventBits_t uxBits;

  /* Set bit 0 and bit 4 in xEventGroup. */
  uxBits = xEventGroupSetBits(
                              xEventGroup,    /* The event group being updated. */
                              BIT_0 | BIT_4 );/* The bits being set. */

  if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
  {
      /* Both bit 0 and bit 4 remained set when the function returned. */
  }
  else if( ( uxBits & BIT_0 ) != 0 )
  {
      /* Bit 0 remained set when the function returned, but bit 4 was
      cleared.  It might be that bit 4 was cleared automatically as a
      task that was waiting for bit 4 was removed from the Blocked
      state. */
  }
It might be that bit 4 was cleared automatically as a task that was waiting for bit 4 was removed
from the Blocked state,有可能被清零,当有任务在等待的时候。
也就是这个函数:
uxBits=xEventGroupWaitBits(myEventGroup,
                             BIT_0,
                             pdTRUE,
                             pdTRUE,
                             xTickToWait);

100ms的等待,而button check 是20ms,能想到的解释是任务2 在执行的时候,任务6 间断的打断的任务2,导致setEventBit 的判断为0.
我在任务2中加入任务锁,不允许打断的情况,可以很好的执行任务的判断。
Tks
i love ARM
回复

使用道具 举报

1

主题

38

回帖

41

积分

新手上路

THINK

积分
41
 楼主| 发表于 2016-9-20 16:01:13 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个问题有点太奇葩,就你给的这些内容来看,没有发现什么问题。

另外你的这个函数uxBits=xEventGroupSetBits(myEventGroup,BIT_0); 是在那个任务里面,是优先级为6的任务吗。
如果是的话,可以在这个函数的前后都加上个串口打印,看看是否有任务切换发生,如果有,说明异常了。 (2016-09-19 17:08) 
我在任务2加上任务锁如下所示:
void vTaskTwo(void *pvParameters)
{
  EventBits_t uxBits;
  const TickType_t xTickToWait=100/portTICK_PERIOD_MS;
  
  while(1)
  {
    vTaskSuspendAll();
    printf("\\r\\n========start Task2==========\\r\\n");
    uxBits=xEventGroupWaitBits(myEventGroup,
                             BIT_0,
                             pdTRUE,
                             pdTRUE,
                             xTickToWait);
   
     
    if((uxBits&BIT_0)==BIT_0)
    {
      printf("\\n\\r接收到BIT0被置1的消息\\n\\r");   
    }
    else
    {
      //printf("\\n\\r——————————————没有接收到BIT0被置1的消息——————————————\\n\\r");
    }
   xTaskResumeAll();
   // vTaskDelay(200);
  }
}

当时我屏蔽了event_groups.c 里面的这句话 configASSERT
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
    {
        //configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
    }
    #endif
如果不屏蔽,会一直卡在ASSERT 里面,屏蔽这句话之后,工程依旧工作正常。
不知道为什么?会ASSERT 不过?
Tks
i love ARM
回复

使用道具 举报

1

主题

38

回帖

41

积分

新手上路

THINK

积分
41
 楼主| 发表于 2016-9-20 16:01:48 | 显示全部楼层
eric2013:
这个问题有点太奇葩,就你给的这些内容来看,没有发现什么问题。

另外你的这个函数uxBits=xEventGroupSetBits(myEventGroup,BIT_0); 是在那个任务里面,是优先级为6的任务吗。
如果是的话,可以在这个函数的前后都加上个串口打印,看看是否有任务切换发生,如果有,说明异常了。
i love ARM
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 07:15 , Processed in 0.173116 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表