嵌入式系统编程:RTOS–自动化调度
今天的目标是使用一种称为循环的简单策略来自动化调度过程,这样MiROS最终可以自主运行所有线程。 在最后一课,您开始构建自己的最小实时操作系统(MiROS)[1]。今天的目标是使用一种称为循环的简单策略来自动化调度过程,这样MiROS最终可...
今天的目标是使用一种称为循环的简单策略来自动化调度过程,这样MiROS最终可以自主运行所有线程。
在最后一课,您开始构建自己的最小实时操作系统(MiROS)[1]。今天的目标是使用一种称为循环的简单策略来自动化调度过程,这样MiROS最终可以自主运行所有线程。
第24课-RTOS第3部分:使用循环策略实现调度自动化
循环调度
循环(RR)是一种简单的调度策略,其中每个系统时钟刻度都以循环顺序切换到下一个线程的上下文结束。在MiROS RTOS的情况下,您已经有了SysTick_Handler()ISR,它在最后调用调度器(OS_sched())。然后,您的工作归结为每次调用调度程序时以循环顺序设置OS_next指针。
起点
在实现一个新功能(如调度器)时,当你得到一些东西时,通常更容易取得进展工作尽早。为此,您不需要立即设计良好且通用的代码。视频显示了一个足够好的起点,包括一个硬编码的if语句,该语句将OS_next指针分配给当前运行的线程之外的另一个闪烁线程。
通过重构来发展设计
一旦你有了工作系统,你可以逐渐进化,保持它工作每走一步。在这个过程中,称为重构,您的目标是在不改变外部行为的情况下改进内部设计。
对于调度器的实现,最重要的设计决策关注的是表示已启动的线程,以便MiROS内核可以按循环顺序排列它们,以有效地保持在OS_sched()函数内设置OS_next指针。
使用断言
每一个不平凡的软件都会做出内部假设。例如,MiROS内核中的“线程注册表”是一个简单的指针数组,其大小最多可容纳32个线程。因此,内核假设应用程序启动的线程数不能超过那么多。如果超过线程数,通常的设计会从OSThread_start()返回错误代码。但是应用程序没有任何合理的方法来处理这样的错误,而不是更改应用程序以启动更少的线程。在这种情况下,使用断言可以简化内核和应用程序,如视频所示。
初始化时间表
初始化时间线是RTOS设计的一个重要方面。内核首先通过调用OS_init()进行初始化。然后是通过BSP_int()初始化Board Support Package,但这应该不在系统未准备好接收中断时启用中断。随后,启动组成应用程序的所有线程。最后,您可以通过OS_run()API将控件传输到内核,该API配置并启用中断,并执行第一次上下文切换。OS_run()被放置在main()的末尾,并且永远不会返回。
结束注释
MiROS RTOS[1]终于自主运行了,有效地为所有线程提供了一个分时环境。但是,您仍然需要对轮询BSP_delay()函数中CPU周期的可怕浪费做点什么。有了上下文切换的魔力,您可以通过将上下文从延迟线程切换开,并在延迟结束后才将上下文切换回,从而显著提高CPU效率。这种高效的等待被称为舞台调度并且将成为下一节RTOS课程的主题。敬请期待!
[1] 米罗·萨梅克,MiROS(MInimal实时操作系统),GitHub公司
<img data-lazy-fallback="1" decoding="async" alt="" style="width: 110px; float: left; margin: 0px 4px 0px 0px;" src="https://uploads.9icnet.com/images/aritcle/20230515/Miro_Samek.jpg">
Miro M.Samek博士是开源QP实时嵌入式框架和免费QM图形模型设计工具的创建者。他还是量子跳跃-提供基于活动对象和层次状态机的现代嵌入式软件,以及用于深度嵌入式软件的可视化建模、自动代码生成和单元测试的工具。Miro教授YouTube上广受欢迎的“现代嵌入式系统编程”视频课程,这是本系列文章的基础。