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

Ada 使用Ravenscar在嵌入式设备上执行多任务,ada,spark-ada,Ada,Spark Ada,我正在使用Ravenscar概要文件构建一个利用任务的应用程序 作为一个简单的例子,我有一个任务有一个障碍,它只有在障碍为真时才会执行 但是,我注意到,如果主控制线程正在执行,然后屏障被设置为true(因此被释放),那么任务将阻塞主线程的执行,直到屏障再次关闭 我正在研制NRF52840芯片。我应该注意,每当我将应用程序(没有修改)定位到本机时,这个问题就不会发生,任务也不会阻止执行 为了在嵌入式设备上实现ravenscar(完整)RTS的并行执行,我需要做些什么 一些额外的颜色:如果我向任务的

我正在使用Ravenscar概要文件构建一个利用任务的应用程序

作为一个简单的例子,我有一个任务有一个障碍,它只有在障碍为真时才会执行

但是,我注意到,如果主控制线程正在执行,然后屏障被设置为true(因此被释放),那么任务将阻塞主线程的执行,直到屏障再次关闭

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

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

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


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

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

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

NRF52840是围绕ARM M4芯片构建的,该芯片只有一个内核,而您的桌面很可能有多个内核

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

系统;
程序T
with Priority=>System.Default\u Priority-1
是
...

正如Simon所指出的,问题在于优先级——正如他所指出的,解决方法是为我的任务分配优先级


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

我想你成功了。愚蠢的问题,但我如何设置主要任务的优先级?我看到了如何对任务(而不是主任务)执行此操作。所有没有指定优先级的任务的优先级都为System.Default_priority,包括环境任务。很可能这两个任务具有相同的优先级。我认为环境任务的优先级应该是
系统。默认优先级
,就像任何其他任务一样。是的,我已经检查了这一点,似乎这是正确的。谢谢你指出这一点。在我的系统上,默认的_优先级是15(这解释了为什么设置任何优先级都有效(我没有达到15!))。我会修改我上面的评论,以免误导未来的搜索者。。。