当前位置:   article > 正文

RTX操作系统教程[00]

rtx操作系统教程

官方教程地址:

RTX官方教程

(下文摘自官方教程)

一、概述

该RTOS本身由一个支持循环、抢占和协作的程序线程多任务调度程序组成。以及时间和内存管理服务。其他RTOS对象支持线程间通信,包括信号触发、信号量、互斥和邮箱系统。正如我们将看到的,中断处理也可以由RTOS内核调度的优先线程来完成。

(1)

#include <cmsis_os.h>

这个头文件由ARM维护,作为cmis - rtos标准的一部分。对于cmis - rtos Keil RTX,这是默认的API。其他RTOS有自己专有的API,但可能提供包装层来实现CMSIS-RTOS API,这样它们就可以在需要与CMSIS标准兼容的地方使用。

(2)

osThreadId id1,id2,id3;

为了使线程切换过程发生,我们有RTOS的代码开销,我们必须专门一个CPU硬件定时器来提供RTOS的时间参考。此外,每次切换正在运行的线程时,我们必须将所有线程变量的状态保存到线程堆栈中。此外,关于线程的所有运行时信息都存储在线程控制块中,该块由RTOS内核管理。因此,“上下文切换时间”,即保存当前线程状态和加载并启动下一个线程的时间,是一个至关重要的数字,它取决于实时操作系统内核和底层硬件的设计。

二、任务调度与优先级问题

默认情况下,当进入main()并且main()函数成为第一个活动线程时,cmis - rtos调度器将运行。一旦进入main(),我们就可以通过调用osKernelInitialize()来停止调度器任务的切换。当RTOS停止时,我们可以创建更多的线程和其他RTOS对象。一旦系统处于定义的状态,我们可以使用osKernelStart()重新启动RTOS调度器。
 

  1. void main (void)
  2. {
  3. osKernelInitialize ();
  4. IODIR1 = 0x00FF0000; // Do any C code you want
  5. Init_Thread(); //Create a Thread
  6. osKernelStart(); //Start the RTOS
  7. }

当线程被创建时,它们也被分配了一个优先级。如果有许多线程准备运行,并且它们都具有相同的优先级,那么将以循环方式为它们分配运行时间。然而,如果一个具有更高优先级的线程准备运行,RTOS调度器将取消当前正在运行的线程的调度,并启动高优先级的线程运行。这被称为基于优先级的抢占式调度。在分配优先级时,您必须小心,因为高优先级线程将继续运行,直到它进入等待状态,或者直到具有同等或更高优先级的线程准备运行。

可以从另一个函数或线程自己的代码中提升或降低线程的优先级:

  1. osStatus osThreadSetPriority(threadID, priority);
  2. osPriority osThreadGetPriority(threadID);

 也可删除某一任务:

osStatus = osThreadTerminate (threadID1);

 还有一个线程切换的特殊情况,正在运行的线程将控制权传递给下一个具有相同优先级的就绪线程:

osStatus osThreadYield();//switch to next ready to run thread

 三、线程创建问题

创建线程结构,并将线程实例的数量设置为2:

osThreadDef(thread1, osPriorityNormal, 2, 0);

然后,我们可以创建分配给不同线程句柄的线程的两个实例。还传递了一个参数,以允许每个实例标识它负责哪个UART:

  1. ThreadID_1_0 = osThreadCreate(osThread(thread1), UART1);
  2. ThreadID_1_1 = osThreadCreate(osThread(thread1), UART2);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/397939
推荐阅读
相关标签
  

闽ICP备14008679号