[STM32] 在FreeRTOS中,为什么不能在中断服务程序中直接使用队列发送函数 xQueueSend()?

[复制链接]
2446|3
hbzjt2011 发表于 2025-9-15 09:24 | 显示全部楼层 |阅读模式
我正在学习FreeRTOS,手册上说中断服务程序(ISR)里不能直接使用 xQueueSend(),而必须使用带FromISR后缀的 xQueueSendFromISR()。
我的理解是,中断需要快进快出,而普通函数可能会引发任务调度。
我想请问一下:

如果我在中断里错误地使用了 xQueueSend(),具体会发生什么?是编译不通过,还是运行时出错?

xQueueSendFromISR() 内部到底做了什么特殊处理,使得它可以在中断中安全使用?
希望能从内核调度和中断上下文的角度解释一下,感谢!
ayb_ice 发表于 2025-9-15 11:33 | 显示全部楼层
可能是
普通函数调用后会立刻触发可能的任务切换,但中断调用的函数必须等最后中断退出后触发可能的任务切换
Ketose 发表于 2025-9-26 10:38 | 显示全部楼层
    xQueueSend():可以指定阻塞时间,当队列满时会等待指定时间
    xQueueSendFromISR():不会阻塞,如果队列满则立即返回
ljxh401 发表于 2025-9-26 11:48 | 显示全部楼层
中断不安全,直接给你切换个任务就 死翘翘了 可能
xQueueSendFromISR 做的是任务切换的一个标识,等中断离开时候再进行切换
您需要登录后才可以回帖 登录 | 注册

本版积分规则

323

主题

2908

帖子

45

粉丝
快速回复 在线客服 返回列表 返回顶部