OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 191|回复: 10

挂起任务再恢复任务,为什么会触发事件

[复制链接]

5

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2011-5-11
在线时间
25 小时
发表于 2025-2-5 14:15:57 | 显示全部楼层 |阅读模式
FreeRTOS任务1内在一直等待事件发生,再执行后面的程序。
但如果其它任务内,挂起任务1后,再恢复任务1,为什么会自动触发事件发生,运行后面的程序了,而不是一直等待事件发生。

任务1:
// 一直等待事件发生,再执行后面程序
osEventFlagsWait(myEvent_Handle, EVENT_FLAG1 | EVENT_FLAG2, osFlagsWaitAny, osWaitForever);

//后面程序....


任务2:

按键1,挂起任务。osThreadSuspend(任务1);

按键2,恢复任务。osThreadResume(任务1);


尝试使用osEventFlagsClear(myEvent_Handle, EVENT_FLAG1 | EVENT_FLAG2);   多个地方加了,也不行。


学习这件事情,不是缺乏时间,而是缺乏努力!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13041
金钱
13041
注册时间
2012-11-26
在线时间
3805 小时
发表于 2025-2-5 15:10:21 | 显示全部楼层
帮顶   至今没用过事件功能
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2011-5-11
在线时间
25 小时
 楼主| 发表于 2025-2-6 09:13:45 | 显示全部楼层
jermy_z 发表于 2025-2-5 15:10
帮顶   至今没用过事件功能

很简单的,就是设置一些事情,再判断发生过哪些事情。可以等待多个事情一起发生,或者单独发生,也相当于任务间传递信息。
学习这件事情,不是缺乏时间,而是缺乏努力!
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13041
金钱
13041
注册时间
2012-11-26
在线时间
3805 小时
发表于 2025-2-6 09:27:40 | 显示全部楼层
lyg407 发表于 2025-2-6 09:13
很简单的,就是设置一些事情,再判断发生过哪些事情。可以等待多个事情一起发生,或者单独发生,也相当于 ...

嗯  但是项目中基本上不用这玩意    基本都是信号量与消息队列
学无止境
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13041
金钱
13041
注册时间
2012-11-26
在线时间
3805 小时
发表于 2025-2-6 09:34:40 | 显示全部楼层
lyg407 发表于 2025-2-6 09:13
很简单的,就是设置一些事情,再判断发生过哪些事情。可以等待多个事情一起发生,或者单独发生,也相当于 ...

没研究过freertos的内核实现,但是猜测挂起时,应该不是从任务第一句挂起的,应该是从挂起时刻执行的语句挂起,你可以弄两个最简单的任务测试下,多打印些rttview测试语句测试下
学无止境
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2011-5-11
在线时间
25 小时
 楼主| 发表于 2025-2-6 09:46:17 | 显示全部楼层
jermy_z 发表于 2025-2-6 09:34
没研究过freertos的内核实现,但是猜测挂起时,应该不是从任务第一句挂起的,应该是从挂起时刻执行的语句 ...

谢谢。

现在是有查看源码,发现挂起任务内,是有移除事件列表操作。

可能需要在恢复任务时,重新加上添加事件列表中。 还在寻找解决拌饭。
学习这件事情,不是缺乏时间,而是缺乏努力!
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2011-5-11
在线时间
25 小时
 楼主| 发表于 2025-2-6 15:01:22 | 显示全部楼层
  

尝试使用osEventFlagsClear(myEvent_Handle, EVENT_FLAG1 | EVENT_FLAG2);   多个地方加了,也不行。

恢复任务同时再初始化事件一遍, MyEvent_Handle = osEventFlagsNew(&myEvent_attributes);   不行

恢复任务同时再等待一次事件 osEventFlagsWait(myEvent_Handle, EVENT_FLAG1 | EVENT_FLAG2, osFlagsWaitAny, 0);  超时改为0 也不行。

目前解决办法:不采用事件方式,改为队列,或者信号量传递信息,测试了,都不会出现问题。
学习这件事情,不是缺乏时间,而是缺乏努力!
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13041
金钱
13041
注册时间
2012-11-26
在线时间
3805 小时
发表于 2025-2-6 16:26:39 | 显示全部楼层
lyg407 发表于 2025-2-6 15:01
尝试使用osEventFlagsClear(myEvent_Handle, EVENT_FLAG1 | EVENT_FLAG2);   多个地方加了,也不 ...

嗯   能实现需求就行
学无止境
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2011-5-11
在线时间
25 小时
 楼主| 发表于 2025-2-6 22:26:59 | 显示全部楼层
jermy_z 发表于 2025-2-6 16:26
嗯   能实现需求就行

根据安富莱的eric2013指点提示,学习到了事件的正确使用方法。


  1. #define BIT_0   ( 1 << 0 )
  2. #define BIT_4   ( 1 << 4 )

  3. void aFunction( EventGroupHandle_t xEventGroup )
  4. {
  5.     EventBits_t uxBits;
  6.     const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;

  7.     /* Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
  8.        the event group. Clear the bits before exiting. */
  9.     uxBits = xEventGroupWaitBits(
  10.                xEventGroup,   /* The event group being tested. */
  11.                BIT_0 | BIT_4, /* The bits within the event group to wait for. */
  12.                pdTRUE,        /* BIT_0 & BIT_4 should be cleared before returning. */
  13.                pdFALSE,       /* Don't wait for both bits, either bit will do. */
  14.                xTicksToWait );/* Wait a maximum of 100ms for either bit to be set. */

  15.     if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
  16.     {
  17.         /* xEventGroupWaitBits() returned because both bits were set. */
  18.     }
  19.     else if( ( uxBits & BIT_0 ) != 0 )
  20.     {
  21.         /* xEventGroupWaitBits() returned because just BIT_0 was set. */
  22.     }
  23.     else if( ( uxBits & BIT_4 ) != 0 )
  24.     {
  25.         /* xEventGroupWaitBits() returned because just BIT_4 was set. */
  26.     }
  27.     else
  28.     {
  29.         /* xEventGroupWaitBits() returned because xTicksToWait ticks passed
  30.            without either BIT_0 or BIT_4 becoming set. */
  31.     }
  32. }
复制代码


也去查了下API手册,

应该是对事件返回的值进行判断。正常是返回对应事件位,后续可以判断这个事件位。

挂起任务后,返回的是osFlagsErrorTimeout   0xFFFFFFFE  错误代码

另注意:如果按照上述代码判断方式,假如用Bit2=1 判断 时  &  错误代码, 也会 !=0  。

判断方法,需另写即可。
学习这件事情,不是缺乏时间,而是缺乏努力!
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13041
金钱
13041
注册时间
2012-11-26
在线时间
3805 小时
发表于 2025-2-8 11:49:16 | 显示全部楼层
lyg407 发表于 2025-2-6 22:26
根据安富莱的eric2013指点提示,学习到了事件的正确使用方法。

嗯,看你等待时间是osWaitForever,理论上不会超时的,按照应用场景,多判断吧,看用哪个功能最好,哈哈
学无止境
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2011-5-11
在线时间
25 小时
 楼主| 发表于 2025-2-8 20:02:58 | 显示全部楼层
jermy_z 发表于 2025-2-8 11:49
嗯,看你等待时间是osWaitForever,理论上不会超时的,按照应用场景,多判断吧,看用哪个功能最好,哈哈

是的,我的程序是 , osWaitForever ,但是挂起程序,再起恢复程序,就会返回超时了。

所以,要对返回值,再进行判断。
学习这件事情,不是缺乏时间,而是缺乏努力!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-14 14:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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