ada - 使用 Ravenscar 在嵌入式设备上进行多任务处理

标签 ada spark-ada

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

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于ada - 使用 Ravenscar 在嵌入式设备上进行多任务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58894321/

相关文章:

c - 如何将 C 中分配的字符串返回给 Ada 并在 Ada 中释放它?

operator-overloading - Ada Compiler 放弃通过重载运算符的包的实例化

computer-science - 如何修改我的发布条件以达到 Spark 证明的黄金标准 - Ada SPARK

ada - 前置条件和后置条件是否取代了函数验证?

Ada 手册 : difference between annotated and consolidated

Ada 中断处理程序

c++ - undefined symbol : __gnat_rcheck_CE_Invalid_Data when linking ADA with C++

ada - 如何证明这个不变量?

Ada constraint error : Discriminant check failed. 什么意思?

ada - 交换数组索引中潜在的别名违规 SPARK-Ada