《嵌入式系统及应用 (26).pdf》由会员分享,可在线阅读,更多相关《嵌入式系统及应用 (26).pdf(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式系统及应用嵌入式系统及应用第二十六讲 实时操作系统的简明实例【课本第12.3节】实时操作系统实时操作系统(Real Time Operation System,RTOS)是应用于嵌入式系统中的一)是应用于嵌入式系统中的一种系统软件,在嵌入式产品开发中,可以根据硬件资源、软件复杂程度、可移植性需种系统软件,在嵌入式产品开发中,可以根据硬件资源、软件复杂程度、可移植性需求、研发人员的知识结构等各个侧面综合考虑是否使用操作系统,若使用操作系统,选求、研发人员的知识结构等各个侧面综合考虑是否使用操作系统,若使用操作系统,选择哪种操作系统。择哪种操作系统。嵌入式系统及应用嵌入式系统及应用12.3
2、实时操作系统的简明实例12.3.1 无无操作系统与实时操作系统操作系统与实时操作系统无无操作系统(操作系统(No Operating System,NOS)的嵌入式系统中,在系统)的嵌入式系统中,在系统复位后,首先复位后,首先,进行堆栈、中断向量、系统时钟、内存变量、部分硬件模进行堆栈、中断向量、系统时钟、内存变量、部分硬件模块等初始化工作,然后进入“无限循环”块等初始化工作,然后进入“无限循环”。在在无限循环中,无限循环中,CPU一般根据一些全局变量的值决定执行各种功能程一般根据一些全局变量的值决定执行各种功能程序(线程),这是第一条运行路线。若发生中断,将响应中断,执行中断序(线程),这是
3、第一条运行路线。若发生中断,将响应中断,执行中断服务程序(服务程序(Interrupt Service Routines,ISR),这是第二条运行路线,执),这是第二条运行路线,执行完行完ISR后,返回中断处继续执行后,返回中断处继续执行。第第2 2页页 共共2222页页基于基于RTOS的编程模式下,有两条的编程模式下,有两条线路线路:一一条是线程线,编程时把一个较大工程分解成几个较小工程(被称之条是线程线,编程时把一个较大工程分解成几个较小工程(被称之为线程或任务),有个调度者,负责这些线程的为线程或任务),有个调度者,负责这些线程的执行执行;另另一条线路是中断线,与一条线路是中断线,与NO
4、S情况一致,若发生中断,将响应中断,情况一致,若发生中断,将响应中断,执行中断服务程序执行中断服务程序ISR,然后中断处继续执行,然后中断处继续执行。嵌入式系统及应用嵌入式系统及应用第第3 3页页 共共2222页页RTOS是一个标准内核,包括是一个标准内核,包括芯片初始化芯片初始化、设备驱动设备驱动及及数据结构的格式数据结构的格式化化,应用层,应用层程序员不程序员不直接对硬件设备和资源进行操作直接对硬件设备和资源进行操作,通过,通过标准调用方法标准调用方法实现对硬件的操作,所有的线程由实现对硬件的操作,所有的线程由RTOS内核负责调度内核负责调度。RTOS是一段嵌入在目标代码中的程序,系统复位
5、后首先执行它,用户是一段嵌入在目标代码中的程序,系统复位后首先执行它,用户的其他应用程序(线程)都建立在的其他应用程序(线程)都建立在RTOS之上之上。RTOS将将CPU时间、中断、时间、中断、I/O、定时器等资源都包装起来,留给用户、定时器等资源都包装起来,留给用户一个标准的应用程序编程接口(一个标准的应用程序编程接口(Application Programming Interface,API),并根据各个线程的优先级,合理地在不同线程之间分配),并根据各个线程的优先级,合理地在不同线程之间分配CPU时间时间。嵌入式系统及应用嵌入式系统及应用第第4 4页页 共共2222页页RTOS的基本功能
6、可以简单地概括为:的基本功能可以简单地概括为:RTOS为每个线程建立一个为每个线程建立一个可执行的环境,方便线程间的传递消息,在中断服务程序可执行的环境,方便线程间的传递消息,在中断服务程序ISR与线程与线程之间传递事件,区分线程执行的优先级,管理内存,维护时钟及中断之间传递事件,区分线程执行的优先级,管理内存,维护时钟及中断系统,并协调多个线程对同一个系统,并协调多个线程对同一个I/O设备的调用。简而言之就是:设备的调用。简而言之就是:线程线程管理与调度、线程间的通信与同步、存储管理、时间管理、中断处理管理与调度、线程间的通信与同步、存储管理、时间管理、中断处理等等。嵌入式系统及应用嵌入式系
7、统及应用第第5 5页页 共共2222页页嵌入式系统及应用嵌入式系统及应用12.3.2 RTOSRTOS中的常用基本概念中的常用基本概念在在RTOS基础上编程基础上编程,芯片启动过程先运行的一段程序代码芯片启动过程先运行的一段程序代码,开辟好用户开辟好用户线程的运行环境线程的运行环境,准备好对线程进行调度准备好对线程进行调度,这段程序代码就是这段程序代码就是RTOS的内的内核核。RTOS一般由一般由内核内核与与扩展部分扩展部分组成组成,通常内核的最通常内核的最主要功能是线程调主要功能是线程调度度,扩展部分的最主要功能是扩展部分的最主要功能是提供应用程序编程接口提供应用程序编程接口API。第第6
8、6页页 共共2222页页嵌入式系统及应用嵌入式系统及应用1调度调度多多线程系统中,线程系统中,RTOS内核负责管理线程,或者说为每个线程分配内核负责管理线程,或者说为每个线程分配CPU时间,时间,并且负责线程间的通信并且负责线程间的通信。调度调度就是决定轮到哪个线程该运行了,它是内核最重要职责。每个线程根据就是决定轮到哪个线程该运行了,它是内核最重要职责。每个线程根据其重要程度的不同,被赋予一定的优先级。不同的调度算法对其重要程度的不同,被赋予一定的优先级。不同的调度算法对RTOS的性能有较大的性能有较大影响影响。基于基于优先级的调度算法是优先级的调度算法是RTOS常用的调度算法,核心思想是,
9、常用的调度算法,核心思想是,总是让处于就总是让处于就绪态的、优先级最高的线程先运行绪态的、优先级最高的线程先运行。然而何时高优先级线程掌握。然而何时高优先级线程掌握CPU的使用权,的使用权,由使用的内核类型确定,基于优先级的内核有由使用的内核类型确定,基于优先级的内核有不可抢占型不可抢占型和和可抢占型可抢占型两种类型两种类型。第第7 7页页 共共2222页页嵌入式系统及应用嵌入式系统及应用2时钟节拍时钟节拍(时间嘀嗒时间嘀嗒)时钟时钟节拍(节拍(clock tick),有时中文也直接译为时钟嘀嗒,它是特定的),有时中文也直接译为时钟嘀嗒,它是特定的周期性中断,通过定时器产生周期性的中断,以便内
10、核判断是否有更高优周期性中断,通过定时器产生周期性的中断,以便内核判断是否有更高优先级的线程已进入就绪状态先级的线程已进入就绪状态。第第8 8页页 共共2222页页嵌入式系统及应用嵌入式系统及应用3线程的基本线程的基本含义含义线程线程是是RTOS中最重要概念之一中最重要概念之一。在在RTOS下下,把一个复杂的嵌入式把一个复杂的嵌入式应用工程按一定规则分解成一个个功能清晰的小工程应用工程按一定规则分解成一个个功能清晰的小工程,然后设定各个小然后设定各个小工程的运行规则工程的运行规则,交给交给RTOS管理管理,这就是基于这就是基于RTOS编程的基本思想编程的基本思想。这一个个小工程被称之为这一个个
11、小工程被称之为“线程线程(Thread)”,RTOS管理这些线程管理这些线程,被称之为被称之为“调度调度(Scheduling)”。第第9 9页页 共共2222页页嵌入式系统及应用嵌入式系统及应用从从线程调度角度线程调度角度理解理解:RTOS中的线程是一个功能清晰的小程序,是中的线程是一个功能清晰的小程序,是RTOS调度的基本单元调度的基本单元;从从RTOS的软件设计角度来的软件设计角度来理解理解:就是就是在软件设计时,需要根据具体应在软件设计时,需要根据具体应用,划分出独立的、相互作用的程序集合,这样的程序集合就被称之为线用,划分出独立的、相互作用的程序集合,这样的程序集合就被称之为线程,每
12、个线程都被赋予一定的优先级程,每个线程都被赋予一定的优先级;从从CPU角度角度理解理解:在在单单CPU下,某一时刻下,某一时刻CPU只会处理(执行)一个线只会处理(执行)一个线程,或说只有一个线程占用程,或说只有一个线程占用CPU。RTOS内核的关键功能就是以合理的方式内核的关键功能就是以合理的方式为系统中的每个线程分配时间(即调度),使之得以运行为系统中的每个线程分配时间(即调度),使之得以运行。第第1010页页 共共2222页页嵌入式系统及应用嵌入式系统及应用4线程的上下文及线程线程的上下文及线程切换切换线程线程的上下文(的上下文(Context),即),即CPU内寄存器内寄存器。当多线程
13、内核决定运。当多线程内核决定运行另外的线程时,它保存正在运行线程的当前上下文,这些内容保存在随行另外的线程时,它保存正在运行线程的当前上下文,这些内容保存在随机存储器(机存储器(Random Access Memory,RAM)中的线程当前状况保存区,)中的线程当前状况保存区,也就是线程自己的堆栈之中。入栈工作完成以后,就把下一个将要运行线也就是线程自己的堆栈之中。入栈工作完成以后,就把下一个将要运行线程的当前状况从其线程栈中重新装入程的当前状况从其线程栈中重新装入CPU的寄存器,开始下一个线程的运的寄存器,开始下一个线程的运行,这一过程叫做行,这一过程叫做线程切换或上下文切换线程切换或上下文
14、切换。第第1111页页 共共2222页页嵌入式系统及应用嵌入式系统及应用5线程间线程间通信通信线程线程间的通信间的通信是指线程间的信息交换,其作用是实现同步及数据传是指线程间的信息交换,其作用是实现同步及数据传输。输。同步同步是指根据线程间的合作关系,协调不同线程间的执行顺序是指根据线程间的合作关系,协调不同线程间的执行顺序。线程线程间通信的方式主要有间通信的方式主要有事件事件、消息队列消息队列、信号量信号量、互斥量互斥量等等。第第1212页页 共共2222页页嵌入式系统及应用嵌入式系统及应用12.3.3 线程线程的三要素、四种状态及三种基本形式的三要素、四种状态及三种基本形式1线程的三要素线
15、程的三要素:线程函数线程函数、线程堆栈线程堆栈、线程描述符线程描述符1)线程函数线程函数线程函数就是线程要完成具体功能的程序;一个线程线程函数就是线程要完成具体功能的程序;一个线程,对应一段函数对应一段函数代码代码,完成一定功能完成一定功能,可被称之为线程函数可被称之为线程函数。在在被被RTOS内核调度运行内核调度运行前前,必须必须将将要变为要变为线程线程的的函数函数进行进行“登记登记”,即即要给线程要给线程设定优先级设定优先级、设设置线程堆栈大小置线程堆栈大小、给线程编号给线程编号等等。由于任何时刻只能有一个线程在运行由于任何时刻只能有一个线程在运行,CPU被处于激活态的线程所独被处于激活态
16、的线程所独占占,从这个角度看从这个角度看,线程函数与无操作系统线程函数与无操作系统(NOS)中的中的“main”函数函数性质相近性质相近,一般被设计为一般被设计为“永久循环永久循环”,认为线程一直在执行认为线程一直在执行,永远独占永远独占处理器处理器。第第1313页页 共共2222页页嵌入式系统及应用嵌入式系统及应用2)线程堆栈)线程堆栈线程线程堆栈是独立于线程函数之外的堆栈是独立于线程函数之外的RAM,按照“先进后出”策略组织的一,按照“先进后出”策略组织的一段连续段连续存储空间。存储空间。在在 RTOS中被创建的每个线程都有自己私有的堆栈空间,在中被创建的每个线程都有自己私有的堆栈空间,在
17、线程的运行过程中,线程堆栈用于保存线程程序运行过程中的线程的运行过程中,线程堆栈用于保存线程程序运行过程中的局部变量局部变量、线程线程的的上下文上下文、线程线程调用普通函数时会为线程保存返回地址调用普通函数时会为线程保存返回地址等。等。在在多线程系统中,每个线程都认为多线程系统中,每个线程都认为CPU寄存器是自己的,一个线程正在运行寄存器是自己的,一个线程正在运行时,当时,当RTOS内核决定不让当前线程运行,而转去运行别的线程,就要内核决定不让当前线程运行,而转去运行别的线程,就要把把CPU的的当前状态保存在属于该线程的线程堆栈中当前状态保存在属于该线程的线程堆栈中,当,当RTOS内核再次决定
18、让其运行时,内核再次决定让其运行时,就从该线程的线程堆栈中恢复原来的就从该线程的线程堆栈中恢复原来的CPU状态,就像未被暂停过一样状态,就像未被暂停过一样。第第1414页页 共共2222页页嵌入式系统及应用嵌入式系统及应用3)线程描述符线程描述符线程线程被创建时,系统会为每个线程创建一个唯一的被创建时,系统会为每个线程创建一个唯一的线程线程描述符描述符TD,它它相当相当于于线程在线程在RTOS中的中的一个“身份证”一个“身份证”,RTOS就是通过这些就是通过这些“身份证身份证”来管理线程来管理线程和查询线程信息的和查询线程信息的。这个这个概念在不同操作系统名称不同,但含义相同,有的称为线程控制
19、概念在不同操作系统名称不同,但含义相同,有的称为线程控制块块(Thread Control Block,TCB),),有的称为任务控制块(有的称为任务控制块(Task Control Block,TCB),有的称为进程控制块(),有的称为进程控制块(Process Control Block,PCB)。线程函数)。线程函数只有只有配备了相应的线程描述符才能被配备了相应的线程描述符才能被RTOS调度调度。第第1515页页 共共2222页页嵌入式系统及应用嵌入式系统及应用2线程的四种状态:终止态线程的四种状态:终止态、阻塞态阻塞态、就绪态和激活就绪态和激活态态在在任一时刻,线程被创建后所处的状态一
20、定是四种状态之一任一时刻,线程被创建后所处的状态一定是四种状态之一。(1)终止态()终止态(Terminated,Inactive):线程已经完成。:线程已经完成。(2)阻塞态()阻塞态(Blocked):又可称为“挂起态”:又可称为“挂起态”。可能是可能是该该线程需要等待一线程需要等待一段时间或某些情况段时间或某些情况发生才发生才能能变为变为就绪就绪态态。(3)就绪态(就绪态(Ready):线程已经准备好可以被激活,但未进入激活:线程已经准备好可以被激活,但未进入激活态态。(4)激活态(激活态(Active,Running):又称“运行态”:又称“运行态”,拥有,拥有CPU使用权使用权。第第
21、1616页页 共共2222页页嵌入式系统及应用嵌入式系统及应用3线程的基本形式:单次执行、周期执行、资源驱动线程的基本形式:单次执行、周期执行、资源驱动线程线程函数一般分为两个部分:函数一般分为两个部分:初始化部分初始化部分和和线程体线程体部分部分。初始化部分实初始化部分实现对变量的定义现对变量的定义、初始化以及设备的打开等等初始化以及设备的打开等等,线程体部分负责完成该线线程体部分负责完成该线程的基本功能程的基本功能。线程一般结构如下:线程一般结构如下:void task(uint_32 initial_data)/初始化部分初始化部分/线程体部分线程体部分第第1717页页 共共2222页页
22、嵌入式系统及应用嵌入式系统及应用1)单次单次执行执行线程线程是是指线程在创建完之后只会被执行一次指线程在创建完之后只会被执行一次,执行完成后就执行完成后就会被销毁或阻塞的会被销毁或阻塞的线程线程。2)周期周期执行线程执行线程是指需要按照一定周期执行的是指需要按照一定周期执行的线程,内部有线程,内部有永久永久循环循环。3)资源驱动资源驱动型线程型线程是指内部含有等待一定资源的线程。资源是指内部含有等待一定资源的线程。资源主要指信号主要指信号量、事件等线程通信与同步量、事件等线程通信与同步中机制。它是操作系统特有中机制。它是操作系统特有的线程类型,该线程的的线程类型,该线程的执行时间不是确定的,资
23、源可用时,它才会转入就绪态,否则就会被加入等待执行时间不是确定的,资源可用时,它才会转入就绪态,否则就会被加入等待列表中列表中。第第1818页页 共共2222页页嵌入式系统及应用嵌入式系统及应用12.3.4 RTOS下编程实例下编程实例从从应用开发角度,只要能够正确使用延时函数、事件、消息队列、信应用开发角度,只要能够正确使用延时函数、事件、消息队列、信号量、互斥量等,就可以基本使用号量、互斥量等,就可以基本使用RTOS进行编程,本小节的目的是让读进行编程,本小节的目的是让读者通过实例,快速了解者通过实例,快速了解RTOS下编程与下编程与NOS下编程的异同,快速下编程的异同,快速了解了解延时延
24、时函数函数、事件事件、消息队列消息队列、信号量信号量、互斥量互斥量等的应用方法。这些实例基于上等的应用方法。这些实例基于上海睿赛德电子科技有限公司推出的国产实时操作系统海睿赛德电子科技有限公司推出的国产实时操作系统RT-Thread,如表如表12-1所示。开发环境使用所示。开发环境使用AHL-GEC-IDE,硬件,硬件使用使用AHL-STM32L431。第第1919页页 共共2222页页表表12-1 RTOS下编程实例列表下编程实例列表工程名工程名知识要素程序功能.CHCH1212 RTOSRTOS RTOSRTOS0101-DelayDelay延时函数软件控制红、绿、蓝各灯每5秒、10秒、2
25、0秒状态变化,对外表现为三色灯的合成色,经过分析,其实际效果如图3-1所示,即开始时为暗,依次变化为红、绿、黄(红+绿)、蓝、紫(红+蓝)、青(蓝+绿)、白(红+蓝+绿),周而复始.CHCH1212 RTOSRTOS RTOSRTOS0202-EventEvent事件当串口接收到一帧数据(帧头3A+四位数据+帧尾0D 0A)即可控制红灯的亮暗.CHCH1212 RTOSRTOS RTOSRTOS0303-MessageQueueMessageQueue消息队列每当串口接收到一个字节,就将一条完整的消息放入到消息队列中,消息成功放入队列后,消息队列接收线程(run_messagerecv)会通过
26、串口(波特率设置为115200)打印出消息,以及消息队列中消息的数量.CHCH1212 RTOSRTOS RTOSRTOS0404-SemaphoreSemaphore信号量当线程申请、等待和释放信号量时,串口都会输出相应的提示.CHCH1212 RTOSRTOS RTOSRTOS0505-MutexMutex互斥量说明如何通过互斥量来实现线程对资源的独占访问,RTOS01-Delay的样例工程,仍然实现红灯线程每5秒闪烁一次、绿灯线程每10秒闪烁一次和绿灯线程每20秒闪烁一次。在RTOS01-Delay 的样例工程中红灯线程、蓝灯线程和绿灯线程有时会同时亮的情况(出现混合颜色),而本工程通过单色灯互斥量使得每一时刻只有一个灯亮,不出现混合颜色情况嵌入式系统及应用嵌入式系统及应用第第2020页页 共共2222页页嵌入式系统及应用嵌入式系统及应用第第2121页页 共共2222页页嵌入式系统及应用嵌入式系统及应用谢谢谢!谢!第第2222页页 共共2222页页