资源预览内容
第1页 / 共72页
第2页 / 共72页
第3页 / 共72页
第4页 / 共72页
第5页 / 共72页
第6页 / 共72页
第7页 / 共72页
第8页 / 共72页
第9页 / 共72页
第10页 / 共72页
亲,该文档总共72页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于STM32F4的uCOS III嵌入式操作系统应用开发什么是RTOS实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。RTOS的应用航空飞行管控系统喷射引擎控制武器系统通信路由器交换机移动电话办公自动化传真机/复印机音频MP3播放器计算机外设打印机扫描仪工业控制工厂自动化食品处理汽车引擎控制导航系统(GPS)家用电器空调自动调温器大小家用电器机器人视频广播设备高清电视常见的RTOS为什么要使用RTOS轮询系统轮询系统为什么要使用RTOS前后台系统前后台系统多线程系统多线程系统为什么要使用RTOS为什么要使用RTOS轮询、前后台和多线程系统软件模型区别模型模型事件响事件响应事件事件处理理特点特点轮询系统主程序主程序轮询事件响应,轮询处理事件前后台系统中断主程序实时响应事件,轮询处理事件多线程系统中断线程实时响应事件,实时处理事件UCOS III简介C/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、可剥夺型的多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片。UCOS III简介UCOS III特点源代码开放便捷的应用程序编程接口(API)可剥夺型多任务管理极短的关中断时间可裁剪可移植可固化任务数目不受限制优先级数目不受限互斥型信号量软件定时器易于优化出错检验软件定时器功能功能uC/OSuC/OS-IIuC/OS-III诞生年份199219982009抢占式多任务是是是最大任务数64256无限制每个优先级的任务数11无限制时间片轮转否否是信号量是是是互斥信号量否是是(可嵌套的)事件标志否是是消息邮箱是是否(不需要)UCOS 版本区别UCOS III移植要求1、处理器的C编译器能能产生可重入代码2、用c语言可打开和关闭中断3、处理器支持中断并且能产生定时中断4、处理器支持能够容纳一定量数据的硬件堆栈(通常需要几十KByte字节)5、处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈(或内存)的指令UCOS III文件结构UCOS III移植通过UCOSIII官方下载:https:/ ,找到Browse by MCU Manufacturer下对应的STM这一栏,选择对应的型号。UCOS III移植准备好需要移植的工程,在工程文件夹里新建一个UCOIII文件夹,然后将UCOSIII源码里的uC_CPU、uC_LIB、UCOS_III文件复制到新建的这个文件夹中。还需要在UCOSIII文件夹中再新建两个文件夹:UCOSIII_BSP,UCOSIII_CONFIG向UCOSIII_CONFIG添加文件,路径是:UCOSIII 3.04MicriumSoftwareEvalBoardsSTSTM32F429II-SKuCOS-III,添加的文件如图所示:向UCOSIII_BSP添加文件,路径是:UCOSIII 3.04MicriumSoftwareEvalBoardsSTSTM32F429II-SKBSP向UCOSIII_BSP添加文件,路径是:UCOSIII 3.04MicriumSoftwareEvalBoardsSTSTM32F429II-SKBSP打开工程向工程中添加分组BSP添加路径:UCOSIIIUCOS_BSP里的bsp.c添加进去CPU添加路径:UCOSIIIUCOS_CPU里的cpu_core.c添加进去,并继续进入目录ARM-Cortex-M4RealView选择cpu_a.samcpu_c.c两个文件LIB添加路径UCOS-III-LEDUCOSIIIuC-LIB里的,继续点击PortsARM-Cortex-M4RealView,选择All file,添加lib_mem_a.asm文件CORE添加路径:UCOS-III-LEDUCOSIIIuCOS-IIISource,添加所有文件PORT添加路径:UCOS-III-LEDUCOSIIIuCOS-IIIPortsARM-Cortex-M4GenericRealView,选择All file,添加所有文件CONFIG添加路径:UCOS-III-LEDUCOSIIIUCOS_CONFIG选择All file,添加所有文件添加相关头文件路径修改bsp.c和bsp.h文件修改os_cpu_a.asm汇编文件修改os_cpu_c.c文件,主要是修改堆栈函数修改os_cfg_app.h文件,系统裁剪和内核有关的修改delay.h文件,滴答定时器配置 相关文件在移植的工程模板中替换到新工程即可任务管理UCOSIII 支持的是单核CPU,不支持多核CPU,在某一时刻只能有一个任务会获得CPU使用权进入运行态,其他的任务就会进入其他状态,UCOSIII中的任务有多个状态。任务管理任务状态转换图任务管理OSTaskChangPrio() 指定任务优先级OSTaskCreate() 创建任务OSTaskDel() 删除任务OSTaskRegGet() 读取任务寄存器的数值OSTaskRegSet() 设置任务寄存器的数值OSTaskResume() 任务恢复OSTaskSuspend() 任务挂起OSTaskStkChk() 任务堆栈统计信息OSTaskTimeQuantaSet() 时间片分配OSInit(&err); /初始化UCOSIIIOSStart(&err); /开启UCOSIII任务管理时间管理UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数,让当前的任务暂停运行一段时间并进行一个任务切换。时间管理OSTimeDly() 任务延时n个时钟节拍OSTimeDlyHMSM() 任务延时指定的时间 “时 分 秒 毫秒”OSTimeDlyResume() 恢复被延时的任务OSTimeGet() 获取当前时钟节拍计数器的值OSTimeSet() 设置时钟节拍计数器的值OSTimeTick() 触发一次时钟节拍服务定时器管理UC/OS-III提供了软件定时器服务,定时器的本质就是一个递减的计数器,当计数器减到0的时候可以触发某种动作的执行,这个动作通过回调函数来实现,回调函数是用户自己定义的,可以是简单的打开一个LED灯,或者开启电机等。当定时器计时完成时,定义的回调函数就会被立即调用,应用程序可以有任意数量的定时器。 定时器管理单次定时器,只执行一次定时器管理单次定时器模式下,在定时器工作时,调用 OSTmrStart()函数,都会重新开始启动定时器。定时器管理周期定时器(无初始延迟)定时器管理周期定时器(有初始延迟)定时器管理OSTmrCreate() 创建定时器并指定其运行模式OSTmrDel() 删除定时器OSTmrRemainGet() 获取定时器的剩余时间OSTmrStart() 启动(或重新启动)定时器计数OSTmrStateGet() 获取当前定时器状态 OSTmrStop() 停止计数器倒计时资源管理共享资源可以是:变量,结构体,内存空间,IO等。 推荐使用互斥型信号量(MUTEX)保护共享资源。 大部分独占资源的方法是创建临界段:关中断,锁调度器,信号量,互斥型信号量(MUTEX)资源管理1.关中断方式 独占共享资源的最快和最简单的方法是关中断。 关中断时间越短越好,不然会影响系统响应外部事件的及时性。 当临界段很短时可以使用关中断的方法。 只有这种方法才可以让任务和ISR共享资源。 2.锁调度器 如果任务不需要和ISR共享资源,就可以通过调度器来访问共享资源。 资源管理3.信号量 通常有两种类型的信号量:二值信号量和多值信号量。 只有任务才允许使用信号量,ISR是不允许的。 (1)二值信号量 人物通过“post”函数释放信号量。如果没有任务在等待这个信号量,信号量计数值会被递增。如果有任务在等待这个信号量,其中高优先级的挂起任务被就绪,但信号量计数值不会递增。 (2)信号量计数值 当共享资源同时被多个任务访问时,信号量计数值用于标记共享资源能同时被多少个任务访问。资源管理(3)信号量需注意的事项 用信号量访问共享资源不会导致中断延迟。 访问一个简短的共享资源时,不推荐使用信号量。 信号量会导致一种严重的问题:优先级反转。 资源管理4.互斥信号量mutex mutex:一种特殊类型的二值信号量,用于解决优先级反转问题。 只有任务才可以使用mutex。资源管理OSMutexCreate() 建立一个互斥型信号量OSMutexDel() 删除一个互斥型信号量OSMutexPend() 等待一个互斥型信号量 OSMutexPendAbort() 取消等待 OSMutexPost() 释放或者发布一个互斥型信号量 信号量大部分多任务内核都提供了信号量这种协议机制。最早,信号量被用来控制存取共享资源。因为有着更好的共享资源保护机制,信号量更多被用来实现任务间的同步以及任务和ISR间的同步。信号量相关函数OSSemCreate() 建立一个信号量OSSemDel() 删除一个信号量OSSemPend() 等待一个信号量 OSSemPendAbort() 取消等待OSSemPost() 释放或者发出一个信号量 OSSemSet() 强制设置一个信号量的值单向同步使用信号量与ISR(或其他任务)同步的机制。这种情况下没有数据交换,但可表明ISR或任务是否运行过。使用信号量进行这种类型同步的操作被叫做单向同步。任务信号量给任务发布信号量是一种非常常用的同步方法,在uC/OS-III中,每个任务都有它自己的内嵌信号量。任务信号量相关函数OSTaskSemPend() 等待任务信号量OSTaskSemPendAbort() 取消等待任务信号量OSTaskSemPost() 发布任务信号量OSTaskSemSet() 强行设置任务信号量计数双向同步两个任务可以使用两个任务信号量同步它们的行为,这种情况被称为双向同步。双向同步不能用于任务和ISR之间的同步,因为ISR不能等待信号量。事件标志组当任务需要与多个事件发生同步时,可以使用事件标志组。等待多个事件时,任何一个事件发生,任务都被同步,这种同步机制被称为“或”同步(逻辑“或”运算);当所有事件都发生时,任务才被同步,这种同步机制被称为“与”同步(逻辑“与”运算)。事件标志组事件标志组相关函数OSFlagCreate() 创建事件标志组OSFlagDel() 删除事件标志组OSFlagPend() 等待事件标志组 OSFlagPendAbort() 取消事件等待标志 OSFlagPendGetFlagsRdy() 获取使任务就绪的事件标志 OSFlagPost() 向事件标志组发布标志多任务同步通过广播信号量来使多个任务同步是一种经常使用的技术。有些时候,可能需要使多个任务同时开始执行。虽然对单个处理器来说,一次只能执行一个任务,但是可以把它们执行的起点同步到同一时刻。这种情况就称为多任务同步。多任务同步信号量与事件标志组联合任务间通信一个任务或者中断服务程序有时候需要和另一个任务交流信息,这个就是消息传递的过程就叫做任务间通信。 任务间的消息传递可以通过2种途径:一是通过全局变量,二是通过发布消息。 使用全局变量的时候每个任务或者中断服务程序都必须保证其对全局变量的独占访问。消息也可以通过消息队列作为中介发布给任务。 消息传递基本用法跟信号量等内核对象十分相似。消息构成消息包含一下几个部分:指向数据的指针,数据长度和记录消息发布时刻的时间戳。 指针指向的可以是一块数据区域或者甚至是一个函数。 消息的内容必须一直保持可见性,可见性是指代表消息的变量必须在接收消息的任务代码范围内有效。这是因为发布的数
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号