0

介绍

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 中失败了?

4

0 回答 0