【问题标题】:Multi-Tasking on Embedded Devices with Ravenscar使用 Ravenscar 在嵌入式设备上执行多任务
【发布时间】:2019-11-16 19:17:55
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: ada spark-ada


    【解决方案1】:

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

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

    NRF52840 围绕 ARM M4 芯片构建,该芯片具有单核,而您的桌面很可能具有多个核。

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

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

    【讨论】:

    • 我认为你成功了。愚蠢的问题,但是如何设置主要任务的优先级?我看到这是如何为任务完成的,但不是主要任务。
    • 您的个人资料显示,“我是一名退休的程序员,自 1985 年以来一直使用 Ada 工作,并且仍然发现有趣的 Ada 相关项目。目前正在使用 TinyFPGA BX 在 Verilog 中迈出第一步。” 1. 你在工作中使用过“Spark-Ada”吗? 2. 你用 Verilog 做得怎么样?
    【解决方案2】:

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

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

    【讨论】:

    • 所有没有指定优先级的任务都有 System.Default_Priority 的优先级,包括环境任务。很可能这两个任务具有相同的优先级。
    • 我原以为环境任务的优先级是System.Default_Priority,就像任何其他任务一样。
    • 是的,我已经检查过了,看来这是正确的。谢谢你指出。在我的系统上,Default_Priority 为 15(这解释了为什么设置任何优先级都有效(我没有达到 15 的高度!))。我会在上面修改我的 cmets,以免误导任何未来的搜索者......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多