ada - 使用 Ravenscar 在嵌入式设备上执行多任务
问题描述
我正在使用 Ravenscar 配置文件来构建一个利用任务的应用程序。
举个简单的例子,我有一个任务有一个障碍,它只在障碍为真时执行。
但是,我注意到如果主控制线程正在执行,然后屏障设置为 true(从而释放),则任务会阻止主线程的执行,直到屏障再次关闭。
我正在研究 NRF52840 芯片。我应该注意,每当我将应用程序(没有修改)定位到 Native 时,这个问题都不会发生,并且任务不会阻止执行。
为了在嵌入式设备上启用 ravenscar(完整)RTS 的并行执行,我需要做些什么吗?
一些额外的颜色:如果我在任务循环中添加延迟,它确实允许主控制线程运行。
这可能是优先上限协议的问题吗?板上的处理器只有一个内核,所以我想知道这是否可能是问题所在——也就是说,除非它正在睡眠,否则该任务不允许主要任务抢占。
解决方案
你的主程序和你的任务的相对优先级是什么?我不了解 AdaCore 的运行时,但至少环境任务(执行主程序)的优先级可能低于您的任务。
您的任务在启用时会做什么?如果它只是旋转(从运行时的角度来看——即没有延迟或调用受保护的条目),那么一旦它进入就绪队列,为什么要放弃它?如果只有一个核心,则没有其他相同或更低优先级的任务可以执行。
NRF52840 围绕 ARM M4 芯片构建,该芯片具有单核,而您的桌面很可能具有多个核。
设置主程序优先级的方法是,例如,
with System;
procedure T
with Priority => System.Default_Priority - 1
is
...
推荐阅读
- laravel - Laravel Sanctum - 在 auth:sanctum 上获得 401,登录后返回令牌
- java - 我什至可以使用列表吗
在 Selenium 中没有 StaleElementException? - javascript - HTML画布代理getContext问题
- raspberry-pi - 将 pi Raspberry 连接到继电器
- sql - 如何在 int 中使用 varchar(max) 转换列
- geospatial - 使用普通克里金法进行空间插值
- content-security-policy - 内容安全策略在允许的域中阻止 URI
- linux - /proc/softirqs 中的 Tasklet 计数在 Linux 中的 USB 操作上迅速增加
- scala - 如何使用 spark scala 以附加模式在单个 JSON 文件下保存多个查询的输出
- python - 准确率为 84%,但预测结果错误