RTOS中setjmp/longjmp函数和ISR的冲突

简介

Lua使用setjmp/ longjmp函数实现了协程。在移植到RTOS环境中时,我发现了一些问题:

1. Zephyr RTOS:失败

标题

_MISRA C 2012_规则21.4指出:

不应使用标准头文件<setjmp.h>

而当我调用setjmp/longjmp函数时,尽管在prj.conf中设置了CONFIG_MPU=n,它仍建议出现了MPU故障。

2. Mbed OS:成功

main()中调用lua API且程序中没有其他线程或任务。正常工作。但我没有测试多线程情况。

3. FreeRTOS:尚未测试,但可能没有问题

像NodeMCU和Lua RTOS这样的开源项目使用Lua和FreeRTOS作为其基本框架。但我不确定它们是否在FreeRTOS多任务情况下进行了测试。

我在FreeRTOS论坛中找到了一个线程讨论了这个问题。FreeRTOS的一个开发者表示他不知道。另一些人指出,由于冲突寄存器的更改,可能会导致ISR或任务上下文切换时产生意外行为。

我的问题

  • 在使用setjmp/longjmp期间关闭所有中断,能否避免在setjmp/ longjmp和ISR/task切换冲突时产生意外行为?

  • 为什么在Zephyr RTOS中setjmp/ longjmp失败?

原文链接 https://stackoverflow.com/questions/70739504

点赞