- 3
- 0
- 约9.8千字
- 约 53页
- 2020-09-10 发布于天津
- 举报
2008 年 12 月 15 日 南京大学计算机系 31 μ C/OS-II 的中断处理(续 1 ) ? 中断服务子程序的伪码结构如下所示: 保存全部 CPU 寄存器到堆栈; 调用 OSIntEnter() 或者对 OSIntNesting 变量加 1 ; 执行中断服务代码,或者发出 IPC 消息通知特定 任务去执行中断服务; 调用 OSIntExit() 函数; 恢复所有 CPU 寄存器; 执行中断返回指令; 2008 年 12 月 15 日 南京大学计算机系 32 μ C/OS-II 的中断处理(续 2 ) ? 调用中断退出函数 OSIntExit() 标志着中断服务 子程序的终结, OSIntExit() 将中断嵌套层数计 数器减 1 。当中断嵌套计数器减到零并且调度 未被禁止( OSLockNesting=0 ), μ C/OS-II 要 重新开始调度。 2008 年 12 月 15 日 南京大学计算机系 33 μ C/OS-II 的时间管理 ? μ C/OS-II 能够提供周期性的时钟信号,节拍率 10 ~ 100Hz 。 ? 用户必须在多任务系统启动以后即在调用 OSStart() 之后激活时钟节拍信号发生器 ? 时钟节拍中断服务子程序必须用汇编语言编写 ? 每当硬件定时器发出节拍中断请求, μ C/OS-II 就要响应这个中断 2008 年 12 月 15 日 南京大学计算机系 34 μ C/OS-II 的时间管理(续) ? μ C/OS-II 时间管理函数 ? 节拍延时函数 OSTimeDly() 该函数常常位于任务函数的结束处 , 用以退出运行 , 用户可以借助定义全局常数 OS_TICKS_PER_SEC ? OSTimeDlyHMSM() 该函数可以按小时 (H) 、分 (M) 、秒 (S) 和毫秒 (m) 来 定义时间 ? OSTimeDlyResume() 根据需要正处于延时期任务可以被用户中止延时 2008 年 12 月 15 日 南京大学计算机系 35 μ C/OS-II 的任务间通信 ? μ C/OS-II 中保护任务间共享数据和提供任务间 通信的主要三种方式 ? 利用宏 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 来关闭中断和打开中断 ? 利用函数 OSSchedLock() 和 OSSchekUnlock() 对 μ C/OS-II 中的任务调度函数上锁和开锁 ? 利用信号量、互斥信号量、邮箱和消息队列进行任 务间通信 ,属于事件控制的同步与通信。 2008 年 12 月 15 日 南京大学计算机系 36 μ C/OS-II 的任务间通信(续 1 ) ? 事件控制块 ECB ? 用于实现信号量管理、互斥型信号量管理、消 息邮箱以及消息队列管理的 ITC 功能函数的基本 数据结构 ? μ C/OS-II 的 ECB 有 4 种类型: OSSemCreate() 、 OSMutexCreate() 、 OSMboxCreate() 、 OSQCreate() 2008 年 12 月 15 日 南京大学计算机系 37 μ C/OS-II 的任务间通信(续 2 ) ? 基于 ECB 的任务间通信 ? 一个任务或者中断服务子程序可以通过事件控 制块 ECB 来向另外的任务发信号 ? 事件控制块的的作用见下页图示 2008 年 12 月 15 日 南京大学计算机系 38 μ C/OS-II 的任务间通信(续 3 ) 事件控制块的作用 ISR ECB 任务 信号 等待 ( 1 ) ( 2 ) ECB 任务 信号 等待 ( 1 ) ( 2 ) 任务 ISR ECB 任务 信号 等待 ( 4 ) ( 4 ) ECB 任务 等待 / 信号 任务 任务 ( 4 ) 信号 等待 ( 4 ) 任务 超时 ( 3 ) 超时 ( 3 ) 超时 ( 5 ) 超时 ( 5 ) ( 5 ) 等待 / 信号 ( 5 ) 2008 年 12 月 15 日 南京大学计算机系 39 μ C/OS-II 的任务间通信(续 4 ) ? 上图 ITC 操作说明 ? 任务或中断服务子程序可以给事件控制块 ECB 发信 号。 ? 只有任务可以等待另一个任务或中断服务子程序通 过事件控制块 ECB 给它发送信号,而中断服务子程 序是不能等待事件控制块 ECB 给它发送信号的。 ? 处于等待状态的任务可以指定一个最长等待时间
原创力文档

文档评论(0)