介绍
Lua 基于setjmp
/longjmp
函数实现协程。我在将 lua 移植到这些 RTOS 环境时发现了一些问题:
1. Zephyr RTOS:失败
标题
MISRA C 2012规则 21.4 指出:
不应使用标准头文件 <setjmp.h>
当我调用 setjmp/longjmp 函数时,它表明发生了 MPU 故障,尽管CONFIG_MPU=n
设置在prj.conf
.
2. Mbed OS:成功
我调用了lua API,main()
它在程序中不包含其他线程或任务。还可以。但我不测试多线程案例。
3. FreeRTOS:尚未测试,但可能没问题
NodeMCU 和 Lua RTOS 等开源项目使用 Lua 和 FreeRTOS 作为其基本框架。但我不确定他们是否在 FreeRTOS 多任务情况下进行了测试。
我在 FreeRTOS 论坛上找到了一个关于这个问题的帖子。一位 FreeRTOS 开发人员说他不知道。另一个人指出,由于冲突寄存器更改,可能会导致 ISR 或任务上下文切换中的意外行为。
我的问题
setjmp
如果我在/使用期间禁用了所有中断longjmp
,是否可以避免setjmp
/longjmp
和 ISR/任务切换冲突时出现意外行为?为什么
setjmp
/longjmp
在 Zephyr RTOS 中失败了?