- 1、本文档共34页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RTOS基础及其在10A Charger中的应用 目录 前后台系统 RTOS系统的架构 RTOS的任务管理机制 10A charger应用实例 前后台系统架构 中断 前后台的不足 基于RTOS的10A charger架构 硬件层(黄色部分) 硬件抽象层(褐色部分) Device Driver 层 任务层(蓝色部分) Kernel层(粉红色部分) 任务间通信和同步 任务管理 TCB结构 任务堆栈 优先级、TCB列表、就绪表的关系 调度 用OSRdyMap中的一个bit来表示任务的状态,任务被挂起时,对应的bit为0,就绪或者执行时为1。 在就绪表中将优先级为prio的任务置就绪(相应bit置1): #define OSTaskRdy(prio) OSRdyMap |= (1 prio) 在就绪表中将优先级为prio的任务置挂起(相应bit1清零) : #define OSTaskSuspend(prio) OSRdyMap = ~ (1 prio) 调度(Scheduler) 创建任务 创建一个任务 任务级切换函数OSSched() 中断级切换函数OSIntExit() 中断管理 事件管理 发送事件EventSend(prio,EventId) 时间管理 时间节拍函数OSTimerTick 应用实例 创建任务,设定timer 任务实例 中断实例 开关中断的应用 开关中断的应用 * * 在中断中置标志位表明相关任务需要执行 每一个任务被延迟的最大时间都是主函数一个循环的时间,实时性不好 不利于程序的模组化 (1)uc_II系统 (2)不可剥夺 型内核 DSP 2802的各个功能模块: I/O PORTS(PWM PORTS) SCI,SPI,CAN ADC 在这一层,主要通过对DSP寄存器对 DSP的资源进行操作 通过宏(MACRO)的方式,实现对硬件操作。 这一层主要是在各个中断中实现,通过调用硬件抽象层的宏(MACRO),来获得与低层硬件无关的数据,提供给任务级使用。 通过这一层和硬件抽象层提供给kernel和任务级与处理器无关的数据。提高更高层的可移植性。 Charger的任务层包括: 状态切换; 时序控制; 相关侦测和保护; 交互通信 中断也可以看着是任务,但优先级和时效性要求最高的任务 通过和Device Driver一层的接口来获得模拟量的数据。通过Kernel提供的服务和别的任务同步。 用户应用程序主要通过任务级完成。 RTOS的一个主要任务是任务的调度和切换 也就是CPU如何对需要处理的任务进行服务。 Kernel层是RTOS主要的设计任务,通过提供特定的系统服务,来实现对任务的调度以及切换,实现任务之间的同步与通信。 主要有以下三部分组成: 任务的管理和调度 任务之间 的通信和同步 Timer结构以及时间管理 10A charger系统内的任务有中断、定时和其他任务唤醒三种方式; 系统内基本没有共享的外设,不需要信号量进行资源的互斥。任务间的数据共享是通过全局变量和函数进行的。 10A charger是一个事件驱动的系统,任务之间是通过简单的事件进行同步和通信的。 共有4个任务,每个任务有各自的优先级,优先级固定不变 每个任务都在系统启动之前建立 不可删除任务 任务只有三种状态:就绪、挂起和执行 使用优先级的调度策略 每个任务通过一个任务控制块来管理自己的信息,任务控制块的结构如下: 每个任务有各自的独立任务堆栈,这样在采用C语言编写程序的时候才不会有任何的限制 任务堆栈的大小由处理器、编译器架构以及任务级的函数嵌套n、中断嵌套m、传递的参数x、临时变量y共同决定 任务栈大小= void OSTaskCreate (void (*task)(void), INTOS stksize, INTOS prio) 找到对应的TCB 从系统堆栈中分配大小为stksize的区域并初 始化系统堆栈 初始化TCB中各项 任务置为就绪态 无嵌套的中断处理(不能在中断中打开中断) 中断的时间要求尽可能短 Buck、Boost IGBT控制也在中断中执行,该部分程序占用了大多数的CPU时间,注意中断溢出。 1、等待特定的事件,如果没有事件,那么挂起该任务 TASK_EVENT OSMaskEventPend(TASK_EVENT mask) 比较常用的是等待所有的事件: #define OSEventPend OSMaskEventPend(0); 2、等待一个事件,并返回事件,如果没
文档评论(0)