我正在使用Ravenscar配置文件来构建利用任务的应用程序。
作为一个简单的例子,我有一个任务带有一个障碍,使得它仅在障碍为True时才执行。
但是,我注意到如果主控制线程正在执行,并且将屏障设置为true(因此已释放),任务将阻止执行主线程,直到再次关闭屏障。
我正在研究NRF52840芯片。我应该注意,每当我将应用程序(无修改)定位为Native时,就不会发生此问题,并且任务不会阻止执行。
要在嵌入式设备上为ravenscar(完整)RTS启用并行执行,我需要做些什么吗?
一些其他颜色:如果我在任务循环中添加了延迟,则它确实允许主控制线程运行。
优先级上限协议可能是这个问题吗?板载处理器只有一个内核,所以我想知道这是否是问题所在,也就是说,该任务不允许主任务抢占先机,除非它处于休眠状态。
答案 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似乎可以解决此问题。