【发布时间】:2019-12-02 20:44:30
【问题描述】:
我正在 STM32F469 目标上使用 FreeRTOS 内核。 我有一个严重的错误,我想这是由于 VtaskSuspendAll。 我读过这张票:click here 我怎么知道“从寄存器写回内存是原子的”?因为我知道否则它可能是一个问题,我猜我的作品不是原子的。
当我在定时器中断中使用 xEventGroupSetBitsFromISR() 时会出现问题...
我不知道如何调查这个问题。
【问题讨论】:
我正在 STM32F469 目标上使用 FreeRTOS 内核。 我有一个严重的错误,我想这是由于 VtaskSuspendAll。 我读过这张票:click here 我怎么知道“从寄存器写回内存是原子的”?因为我知道否则它可能是一个问题,我猜我的作品不是原子的。
当我在定时器中断中使用 xEventGroupSetBitsFromISR() 时会出现问题...
我不知道如何调查这个问题。
【问题讨论】:
从这里开始https://www.freertos.org/FAQHelp.html,它记录了大量常见问题以及如何发现它们。 STM32 在硬件中设置数字抢占位等方面有一些非常具体的细节。
【讨论】:
根据ARMv7M Architecture Reference Manual,“A3.5.3 ARM 体系结构中的原子性”一章,对字节、半字和字的读写是原子的。读取-修改-写入循环不是原子的。
上述票证:
基本上,关键是每个任务都维护自己的上下文,如果变量不为零,则不会发生上下文切换。所以,只要从寄存器写回内存是原子的,就没有问题。
因此,只要uxSchedulerSuspended 是字节/半字/字,就应该可以访问。
使用 JTAG 调试器,在硬故障处理程序中放置断点,并回溯到故障发生的位置。检查寄存器 CFSR、MMFAR 和 BFAR 以了解更多关于发生的事情。
【讨论】: