使用 Ravenscar 在嵌入式设备上执行多任务

jsi*_*let 3 ada spark-ada

我正在使用 Ravenscar 配置文件构建一个利用任务的应用程序。

举一个简单的例子,我有一个任务有一个屏障,因此它仅在屏障为 True 时执行。

但是,我注意到,如果主控制线程正在执行,然后屏障设置为 true(从而释放),则任务将阻止主线程的执行,直到屏障再次关闭。

我正在研究 NRF52840 芯片。我应该注意,每当我将应用程序(没有修改)定位到 Native 时,这个问题就不会发生,并且任务不会阻止执行。

为了在嵌入式设备上启用 ravenscar(完整)RTS 的并行执行,我需要做些什么吗?

一些额外的颜色:如果我向任务循环添加延迟,它确实允许主控制线程运行。

这可能是优先级上限协议的问题吗?板上的处理器只有一个核心,所以我想知道这是否可能是问题所在——也就是说,该任务不允许主任务抢占,除非它正在休眠。

Sim*_*ght 5

您的主要计划和任务的相对优先级是什么?我不知道 AdaCore\xe2x80x99s 运行时,但 xe2x80x99s 至少可能环境任务(执行主程序)的优先级可能低于您的任务。

\n\n

当启用\xe2\x80\x99s 时,你的任务会做什么?如果它只是旋转(从运行时\xe2\x80\x99s的角度来看 - 即没有延迟或对受保护条目的调用),那么一旦它进入就绪队列,为什么要放弃它呢?如果\xe2\x80\x99只有一个核心,则没有其他相同或较低优先级的任务可以执行。

\n\n

NRF52840 围绕 ARM M4 芯片构建,该芯片具有单核,而您的台式机很可能具有多核。

\n\n

设置主程序\xe2\x80\x99s优先级的方法是,例如:

\n\n
with System;\nprocedure T\nwith Priority => System.Default_Priority - 1\nis\n...\n
Run Code Online (Sandbox Code Playgroud)\n