【发布时间】:2019-09-05 14:05:43
【问题描述】:
我正在尝试找到一种更好的方法来组织嵌入式应用程序的子任务。我对电力电子应用更感兴趣。我不是软件工程师,而是电力电子工程师。但是,在大多数情况下,我需要开发代码。
在这些应用程序中,主程序将处于无限循环中,而控制算法将在 ISR(中断服务程序)中运行。但是,在某些应用程序中,需要额外的低优先级子任务(例如通信、警报处理)。由于时间限制,这些子任务不能在 ISR 例程中运行(控制算法具有更高的优先级)。我想知道处理嵌入式应用程序任务计划的最佳方法。
在下面的代码 sn-p 中,一种简单的方法是将所有子任务放入无限循环中(如果所有子任务具有相同的优先级)。应用程序将定期运行 ISR 例程(例如,每个切换周期)并使用剩余时间以循环方式运行子任务。但是,在这种方法中,所有子任务都将在未知的时间段内运行。因此,我将无法在这些任务中添加计时器例程(增量和检查)。此外,如果软件在低优先级任务中停留(由于某些错误代码),则不会执行其他任务(或将激活看门狗定时器)。
void main(void)
{
Init();
for(;;) /* There is a ISR routine with the control Algorithm*/
{
SubTask1();
SubTask2();
SubTask3();
}
}
可以使用其他 ISR 例程(例如,由定时器模块控制)并控制中断优先级以运行一项特定任务。但是,这种方法需要对设备进行更仔细的研究,才能正确设置所有中断优先级。
你知道更好的方法吗?哪种调度任务方法对嵌入式应用程序最有效?
【问题讨论】:
-
“最佳”算法是最适合您的特定应用程序的算法。从您的描述中无法判断它是什么。有许多不同的调度方案有据可查,您可以阅读这些并选择您最喜欢的一个。
-
获取实时操作系统。 FreeRTOS 几乎总是一个不错的选择。
-
这个范围很广。一种常见的设计方法是不允许任何任务执行忙等待。所以与其拥有
while(!flag) {},不如说是if(!flag) return ;。也就是说,每个没有工作的任务都会优雅地让其他人进入。对于有错误的任务,唯一的解决方案是修复错误。 -
@yhyrcanus 但是如果程序很简单,那就太矫枉过正了。这听起来不像是 RTOS 合理的情况。
-
我第二个'得到一个 RTOS'。
标签: c embedded scheduled-tasks