赞
踩
官方教程地址:
(下文摘自官方教程)
一、概述
该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调度器。
- void main (void)
- {
- osKernelInitialize ();
- IODIR1 = 0x00FF0000; // Do any C code you want
- Init_Thread(); //Create a Thread
- osKernelStart(); //Start the RTOS
- }
当线程被创建时,它们也被分配了一个优先级。如果有许多线程准备运行,并且它们都具有相同的优先级,那么将以循环方式为它们分配运行时间。然而,如果一个具有更高优先级的线程准备运行,RTOS调度器将取消当前正在运行的线程的调度,并启动高优先级的线程运行。这被称为基于优先级的抢占式调度。在分配优先级时,您必须小心,因为高优先级线程将继续运行,直到它进入等待状态,或者直到具有同等或更高优先级的线程准备运行。
可以从另一个函数或线程自己的代码中提升或降低线程的优先级:
- osStatus osThreadSetPriority(threadID, priority);
- osPriority osThreadGetPriority(threadID);
也可删除某一任务:
osStatus = osThreadTerminate (threadID1);
还有一个线程切换的特殊情况,正在运行的线程将控制权传递给下一个具有相同优先级的就绪线程:
osStatus osThreadYield();//switch to next ready to run thread
三、线程创建问题
创建线程结构,并将线程实例的数量设置为2:
osThreadDef(thread1, osPriorityNormal, 2, 0);
然后,我们可以创建分配给不同线程句柄的线程的两个实例。还传递了一个参数,以允许每个实例标识它负责哪个UART:
- ThreadID_1_0 = osThreadCreate(osThread(thread1), UART1);
- ThreadID_1_1 = osThreadCreate(osThread(thread1), UART2);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。