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

时间:2019-11-16 19:17:55

标签: ada spark-ada

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

作为一个简单的例子,我有一个任务带有一个障碍,使得它仅在障碍为True时才执行。

但是,我注意到如果主控制线程正在执行,并且将屏障设置为true(因此已释放),任务将阻止执行主线程,直到再次关闭屏障。

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

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

一些其他颜色:如果我在任务循环中添加了延迟,则它确实允许主控制线程运行。

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

2 个答案:

答案 0 :(得分:4)

您的主程序和任务的相对优先顺序是什么?我不了解AdaCore的运行时,但是至少环境任务(执行主程序)的优先级可能比您的任务低。

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

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

例如,设置主程序优先级的方法

with System;
procedure T
with Priority => System.Default_Priority - 1
is
...

答案 1 :(得分:0)

正如西蒙(Simon)指出的那样,问题具有优先权-他指出的解决方案是为我的任务分配优先级。

在我的系统(AdaCore的GNAT 2012)上,默认优先级为15;将任务设置为合理的5似乎可以解决此问题。