OpenEdv-开源电子网

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

freeRTOS中的软件定时器的回调函数,不能使用阻塞的操作??

[复制链接]

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
发表于 2023-6-26 10:01:07 | 显示全部楼层 |阅读模式
1金钱
官方解释:定时器回调函数在定时器服务任务的上下文中执行。 因此, 定时器回调函数永远不试图阻塞是至关重要的 。 例如,定时器回调函数在访问队列或信号时,不得调用 vTaskDelay()、 vTaskDelayUntil(),也不得 指定非零阻塞时间。
请问为什么不能执行有阻塞的任务??我把定时器服务守护进程任务的优先级(configTIMER_TASK_PRIORITY)设置为最高也不可以吗?在定时器的回调函数中我使用vTaskDelay(),让其进入阻塞态,阻塞结束后它的优先级最高,定时器守护任务不就给抢占回来了吗!!!是因为用户无法访问定时器守护任务,它的优先级最高它可以抢占别的任务进入执行,若是在中间进入阻塞态,就算优先级再高也无法抢占回来了吗?

最佳答案

查看完整内容[请看2#楼]

定时器的回调函数是在守护任务里面被调用的,守护任务不是转为某个定时器服务的,它还要处理其它的定时器。所以定时器的回调函数不能使用会导致阻塞的函数。如果一个定时器的回调函数主动使用了vTaskDelay()函数,其守护任务会主动进去阻塞状态,就没有办法响应其它已经定时器任务了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
 楼主| 发表于 2023-6-26 10:01:08 | 显示全部楼层
定时器的回调函数是在守护任务里面被调用的,守护任务不是转为某个定时器服务的,它还要处理其它的定时器。所以定时器的回调函数不能使用会导致阻塞的函数。如果一个定时器的回调函数主动使用了vTaskDelay()函数,其守护任务会主动进去阻塞状态,就没有办法响应其它已经定时器任务了。
回复

使用道具 举报

35

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
769
金钱
769
注册时间
2016-3-17
在线时间
178 小时
 楼主| 发表于 2024-3-28 08:48:32 | 显示全部楼层
在我使用的FreeRTOS中,当configUSE_TIMERS被设置为1时,在启动调度器时,会自动创建xTimerCreateTimerTask()任务,此任务的具体代码还没有详细查看,应该只处理与定时器相关的东西。如果此任务的优先级比较高,在不影响其它定时器的情况下,应该还是可以使用阻塞延时函数的吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 11:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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