嵌入式操作系统设计_v3.0.5R.pptx_第1页
嵌入式操作系统设计_v3.0.5R.pptx_第2页
嵌入式操作系统设计_v3.0.5R.pptx_第3页
嵌入式操作系统设计_v3.0.5R.pptx_第4页
嵌入式操作系统设计_v3.0.5R.pptx_第5页
已阅读5页,还剩147页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式操作系统,主 讲: 王晓荣 Email: ,嵌入式操作系统简介,1,什么是嵌入式操作系统,EOS(Embedded OperatingSystem) 用在嵌入式系统中的操作系统 它在硬件和应用程序之间,通过提供应用程序接口,屏蔽了硬件工作的一些细节,从而提高了应用程序的开发效率,嵌入式操作系统的优缺点,优点: 提高了系统的可靠性 程序设计和扩展更容易 应用程序模块化,设计过程大为简化 缩短了产品的开发周期。 缺点: ROM/RAM开销大 25%的CPU额外负荷 内核费用较高,常见的EOS,Android、Ubuntu、FreeRTOS 、Linux、Windows CE、VxWorks、

2、 、 UCOS、 RT-Thread、mbedOS等 3个以上,EOS市场份额(2013-2014),Inhouse/custom,Inhouse: 公司内部自己开发 Custom:客户定制 市场份额逐年减少,趋势分析,开源OS超越商用OS,趋势分析,Android与FreeRTOS成为主导 Android: 基于Linux的开源非实时操作系统,主要应用于移动设备,由Google公司和开放手机联盟领导开发。 FreeRTOS:轻量、开源、实时、可靠、易用的操作系统。最近在ST新推的STM32Cube中集成了FreeRTOS,影响力进一步提升。,趋势分析,RT-Thread影响扩大 RT-Thr

3、ead :由熊谱翔(bernard)发起并组织的开源项目,结合了VxWorks和ucos两个操作系统的优点,综合性能优于ucos。,趋势分析,mbedOS可能成为黑马 mbedOS :ARM公司2014年底推出的基于 Cortex-M架构的物联网操作系统,可使智能硬件开发进一步简单,可能会一统江湖,但目前还处在早期阶段,稳定性、成本、安全等问题都有待进一步验证。,UCOSII,C/OS-II是一个源码公开、商用收费的实时多任务操作系统。其绝大部分源码是用ANSI C写的,使其可以方便移植并支持大多数类型的处理器。C/OS-II通过了联邦航空局(FAA)商用航行器认证。C/OS-II占用很少的系

4、统资源(几K的 RAM和ROM),并且在高校教学使用是不需要申请许可证。,UCLINUX,uClinux是完全符合GNU/GPL公约的操作系统,完全开放代码。uClinux从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。适用于没有虚拟内存或内存管理单元(MMU)的处理器,例如ARM7TDMI。它通常用于具有很少内存或Flash(几百K)的嵌入式系统。它保留了Linux的大部分优点:稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持、以及标准丰富的API等。,WINCE,Windows CE是微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上

5、型电脑类的电子设备操作,它是精简的Win 95。Windows CE的图形用户界面相当出色。Win CE具有模块化、结构化和基于Win32应用程序接口以及与处理器无关等特点。Win CE不仅继承了传统的Windows图形界面,并且在Win CE平台上可以使用Win 95/98上的编程工具(如Visual Basic、Visual C+等)、使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。,VxWorks,VxWorks操作系统是美国WIND RIVER公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展

6、能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等,甚至在1997年4月登陆火星表面的火星探测器上也使用到了VxWorks。,stm32cube,1,相关软件安装,安装“STM32CubeMX”(需JAVA 支持) 安装“JAVA” 添加MCU组件 详见“软件安装.docx”,例题,led_v0.1 功能:利用cube生成代码框架,编写最简单的代码实现LED亮灭。 步骤见3,课堂练习,在例题基础上,移植嵌入式系统课程中

7、的led模块、delay模块实现led亮灭。,例题,在上一练习基础上,利用cube实现对uart1的支持。,例题,添加printf模块。,freeRTOS简介,1,创始人,2002年由Richard Barry创建。,freeRTOS简介,“小巧,简单,易用”的开源实时操作系统 主要实现:任务管理,(任务间)通讯,硬件接口 “任务管理”大约占核心代码的50% “通讯” 大约占核心代码的40% “硬件接口”大约占核心代码的6%,课堂练习,利用cube实现对freeRTOS的支持。,创建任务,1,例题,os_create_task_v0.1 1P10例1:创建任务 观察运行结果,结果分析(P12)

8、,感觉2个任务同时运行 实际上,每次只有1个任务在运行,HAL,Hardware Abstraction Layer 硬件抽象层,时间片轮转,当优先级相同任务同时运行时,实际上是定时轮流执行。(1P18图4),时间片轮转时间,1 / configTICK_RATE_HZ,思考,为什么串口没有输出?,栈深度,1000word = 4000byte 4k + 4k + 1.5k = 9.5k 3k 解决办法: 1. 将1000改小(190以下) 2. 将3k改大,思考,为什么会出现帧丢失?,例题,os_create_task_v0.2 在v0.1版本上做了如下改动: 利用cube将heap更改为:

9、0 x8000 在任务中增加循环次数的打印输出 观察运行结果,分析,Printf函数执行时,独占了串口缓冲区资源。,访问临界区,taskDISABLE_INTERRUPTS():禁止中断 taskENTER_CRITICAL():进入临界区 vTaskSuspendAll ():禁止调度 成对出现 三对函数在功能上的区别,禁止中断,taskDISABLE_INTERRUPTS() taskENABLE_INTERRUPTS() 最简单、最强大 不再响应任何中断,但对实时性影响巨大。 禁止中断时间尽可能短。,进入临界区,taskENTER_CRITICAL() taskEXIT_CRITICAL

10、() 增加了一个临界区嵌套计数 当进入临界区时,禁止中断 退出所有嵌套的临界区后再使能中断 如果只有1层,效果等同于禁止中断。,禁止调度,vTaskSuspendAll () xTaskResumeAll () 允许中断,但禁止任务调度。,例题,os_create_task_v0.3 在v0.2版本上作如下改动: 在任务中写串口时,加保护。 观察运行结果,课堂练习,例题是在启动调度器之前先完成两个任务的创建。请修改例题,实现在一个任务中创建另一个任务。(1P13),任务优先级,1,优先级实验,将例题“os_create_task_v0.3”中任务2的优先级设为2,观察运行结果。,结果分析(P1

11、9),调度器总是选择具有最高优先级的可运行任务来执行。 任务1 的执行时间被任务2“饿死(starved)”了。,执行流程(P20),扩充“非运行态”,1,非运行态(P21),阻塞态(blocked) 挂起态(suspended ) 就绪态(ready),阻塞态(blocked),任务正在等待某个事件: 定时事件 同步事件,挂起态(suspended ),调度器对挂起态的任务“不可见”,就绪态(ready),任务已准备好,等待被运行。,任务状态机,思考,分析例题“os_create_task_v0.3”中,各任务的状态。,调度器,调度器总是在所有就绪态任务中,选择最高优先级的任务,进入运行态。

12、 如果被选中的任务不止一个,则轮流进入运行态。,例题,os_task_delay 利用阻塞态实现延迟 实现:将例题“os_create_task_v0.3”中的任务2优先级设为2,2个任务中的延时语句替换为: “vTaskDelay(1000 / portTICK_RATE_MS);”,vTaskDelayUntil(),vTaskDelay()延时的时间是:从该函数调用起,到该函数切出止。 vTaskDelayUntil()延时的时间是:从上一次切出该函数起,到这一次切出该函数止。,课堂练习,将例题“os_task_delay”中的延时语句替换为vTaskDelayUntil()。,incl

13、ude the API function,当空间受限时,可屏蔽不用的函数。,运行结果,尽管两个任务优先级不同,但2个任务都可以得到执行。,执行流程(P25),利用cube创建任务,1,课堂练习,用cube创建任务,空闲任务与钩子函数,1,空闲任务,优先级最低(0) 不能堵塞或挂起 作用: 使处理器有任务运行 可编写代码实现:测量CPU空闲时间、进入省电模式等功能。,回调函数,供驱动层或操作系统层调用的应用层函数,称为回调函数(call-back),钩子函数,钩子函数(hook)是回调函数的一种。,例题,Os_hook 空闲任务钩子函数,观察结果,任务循环1次,空闲任务循环了若干次。,驱动程序移

14、植,1,驱动程序,嵌入式系统课程中“裸奔”的程序,只需稍作修改即可移植到操作系统中。,例题,“led”模块的移植。,课堂练习,参考例题移植“key”模块,并在cube默认建的任务中实现:按键打印输出KEY_1所按下的次数。,课堂练习,在freertos中,完成通用定时器的封装和移植,并实现以下功能:在利用cube新建的任务中,定时串行打印输出定时中断调用次数。,中断服务程序(ISR),代码尽可能短 不能传递参数 不能返回值 不能加串口调试代码,解决办法,通常的解决办法: 在ISR中做个标志,然后放到主程序中处理 适用于:实时性要求不高时。,例题,os_time_v0.1 定时时间设置 启动定时

15、器 HAL_TIM_Base_Start_IT(,课堂练习,在os_time_v0.1的基础上,实现led每隔0.2秒定时左移。,问题,有全局变量 如何实现全局变量的封装?,例题,os_time_v0.2 增加中间驱动层,思考,如果中断的实时性要求很高,如何处理?,中断管理,1,回顾,中断服务程序(ISR)要求: 代码尽可能短 不能传递参数 不能返回值 不能加串口调试代码,回顾,通常的解决办法: 在ISR中做个标志,然后放到主程序中处理 适用于:实时性要求不高时。,二值信号量,创建1个二值信号量 ISR中,发送信号 主程序中,接收信号 如何使用二值信号量发送中断信号?,接收信号主程序中,挂起等

16、待信号,发送信号,ISR中,发送信号,接收信号,主程序接收到信号,创建二值信号量,定义1个信号变量: xSemaphoreHandle xSemaphore; 创建信号: vSemaphoreCreateBinary(xSemaphore);,ISR中,发送信号,相关函数: portBASE_TYPE xSemaphoreGiveFromISR ( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken );,函数说明,信号量可以在ISR中发送,也可在任务中发送。 xSemaphoreGiveFromISR()

17、是xSemaphoreGive()的特殊形式,专门用于ISR中。,参数说明,参数1:信号量 参数2:输出参数,1P75 返回值: pdPASS:函数调用成功。 pdFAIL: 函数调用失败。,主程序中,接收信号,相关函数: portBASE_TYPE xSemaphoreTake ( xSemaphoreHandle xSemaphore, portTickType xTicksToWait );,参数说明,参数2: 阻塞超时时间,即任务进入阻塞态以等待信号量的最长时间。 以节拍数为单位。 如果设为portMAX_DELAY , 则永久等待。 返回值: pdPASS:获得信号量 pdFALSE

18、:未获得信号量,例题,os_time_v0.3 使用信号量,流程,中断产生 当前任务ISR给出信号量 ISR退出时,运行堵塞任务,课堂练习,利用信号量,实现串口输出电子钟。输出格式为:hh:mm:ss,每秒单独显示1行。,课堂练习,利用外部中断,触发串口输出。,外部中断,引脚设置 MX_GPIO_Init();,函数重入,1,函数重入定义,如果一个函数可以安全地被多个任务或中断调用,则这个函数是可重入的。 如果一个函数除了访问自己栈空间上的数据外,不访问其它任何数据,则这个函数就是可重入的。,不可重入函数特征,访问了全局变量、静态变量、I/O函数等各种共享资源。,不可重入示例,static i

19、nt tmp;void func1(int* x, int* y) tmp=*x; *x=*y; *y=tmp; ,可重入示例,void func2(int* x, int* y) int tmp; tmp=*x; *x=*y; *y=tmp; ,问题,在中断函数或任务中,访问共享资源均容易出问题。,互斥量,互斥量是一种特殊的二值信号量,专门用于解决共享资源问题。,互斥量原理,互斥量可看作是与共享资源关联的令牌。一个任务想要合法地访问资源,必须先得到(Take)该资源对应的令牌(成为令牌持有者)。当令牌持有者完成资源使用后,必须马上归还(Give)令牌。如果拿不到令牌,则不能访问共享资源。,互

20、斥量展示,互斥量展示,互斥量展示,互斥量使用,互斥量创建 互斥量获取 互斥量归还,例题,os_reentrant_printf_1 封装printf为可重入函数,实验,通过实验对比reentrant_printf函数和printf函数的区别 将任务的优先级设为不同,再观察实验现象,实验分析,当任务的优先级相同时,printf函数出现了问题。 而当任务的优先级不同时,printf函数没有出现问题。 reentrant_printf函数都没有出现问题。,课堂练习,编写代码临摹例题。,例题,os_reentrant_printf_2 将波特率降为19200,使用外部中断触发任务1。,实验,采用pri

21、ntf函数时,多次按键触发任务1,观察任务2输出是否有遗漏。 改用reentrant_printf函数时,观察是否有遗漏。,实验分析,中断使printf函数出现了问题。 中断对reentrant_printf函数没有影响,但是否有潜在缺陷?,潜在缺陷,现象,Task2的优先级高于task1 但特殊情况下,高优先级的task2需让低优先级的task1先运行。 这一现象称为“优先级反转”。 图说明,优先级反转,这是不合理的行为方式。 最坏的情形:当高优先级任务正等待信号量的时候,一个介于两个任务优先之间的中等优先级任务开始执行,这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法

22、执行!,优先级反转流程,解决办法,互斥量已经提供了最基本的“优先级继承”机制。 优先级继承:持有互斥量的低优先级任务“继承”了等待互斥量的任务的优先级。,优先级继承流程,最基本,FreeRTOS只能实现最基本的互斥量的优先级继承机制。 这种实现是假定一个任务在任意时刻只会持有一个互斥量。,另一个潜在缺陷,死锁( Deadlock ) 当两个任务都在等待被对方持有的资源时,两个任务都无法再继续执行,这种情况就被称为死锁。 死锁是利用互斥量提供互斥功能的另一个潜在缺陷。,死锁现象,1. 任务A 执行,并成功获得了互斥量X。 2. 任务A 被任务B 抢占。 3. 任务B 成功获得了互斥量Y,之后又试

23、图获取X。但X已被任务A 持有,因此,任务B 进入阻塞态以等待X 被释放。 4. 任务A 得以继续执行,其试图获取Y。Y 已经被任务B持有,任务A 进入阻塞态以等待Y 被释放。 5.任务A和任务B都无法执行。,解决办法,避免死锁的最好方法就是在设计阶段就考虑到这种潜在风险。 设计人员应熟悉整个应用程序,并能找出发生死锁的代码区域,消除死锁问题。 可通过守护任务访问共享资源彻底解决“优先级反转”和“死锁”问题。,队列管理,1,队列,FreeRTOS中的每个任务都是具有独立权限的小程序。 任务之间的通信是通过队列实现的。 队列就是有特殊功能的确定长度确定大小的数据单元。,队列读写过程,队列读写过程,队列的特性,可多个任务向同一队列写入或读出 如果队列为空,读队列的任务可保持阻塞状态 如果队列为满,写队列的任务可保持阻塞状态,队列的创建,队列发送,xQueueSend ( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );,队列接收,xQueueReceive ( xQueueHandl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论