- μC/OS-II是用 C 语言(绝大部分)和汇编语言(与处理器密切相关的代码)编写的。
- 实时操作系统和非实时操作系统最大的区别在于时间限制。
- 实时操作系统首先是多任务操作系统,有多级中断机制和优先级调度机制。
系统功能
- 实时内核:μC/OS-II—内核:任务调度(oc_core.c)
- 任务管理:μC/OS-II—Task管理1(os_task.c);μC/OS-II—Task管理2(os_task.c)
- 时间管理:μC/OS-II—时间管理(os_time.c);μC/OS-II—计时器管理1(os_tmr.c);μC/OS-II—计时器管理2(os_tmr.c)
- 信号量管理:μC/OS-II—信号量管理1(os_sem.c);μC/OS-II—信号量管理2(os_sem.c)
- 互斥信号量管理:μC/OS-II—互斥信号量管理1(os_mutex.c);μC/OS-II—互斥信号量管理2(os_mutex.c)
- 事件标志组管理:μC/OS-II—事件标志组管理1(os_flag.c);μC/OS-II—事件标志组管理2(os_flag.c)
- 消息邮箱管理:μC/OS-II—消息邮箱管理1(os_mbox.c);μC/OS-II—消息邮箱管理2(os_mbox.c)
- 消息队列管理:μC/OS-II—消息队列管理1(os_q.c);μC/OS-II—消息队列管理2(os_q.c)
- 内存管理:μC/OS-II—内存管理1(os_mem.c);μC/OS-II—内存管理2(os_mem.c)
系统结构图
系统目标
- 目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,消息邮箱,消息队列,内存管理,中断管理等。
- 任务调度是μC/OS-II程序开发的核心内容: Task = Task代码+TCB+Task堆栈
系统函数的基本原则
配对原则
中断服务程序调用函数的限制
- 中断服务程序不能调用可能导致任务调度的函数【它们主要是一些等待函数】。
- 创建事件和删除事件的函数也不会使用。
- 至于函数OSSchedLock()和OSSchedUnlock()在中断服务程序中使用完全没有意义。
任务必须调用某个系统函数
- 因为uC/OS-lI是完全基于优先级的操作系统,所以在一定的条件下必须出让CPU占有权以便比自己优先级更低的任务能够运行,这是通过调用部分系统函数来实现的,这些函数见下表。一般的任务必须调用表中至少一个函数,只有一种情况例外,就是单次执行的任务,因为任务删除后肯定出让CPU,所以可以不调用表中的函数。
系统函数的分类
系统管理函数
初始化函数
- uC/OS-Il的初始化函数有2个: OSInit()和OSStart(),它们不能在任何任务和中断服务程序中使用,仅在main()函数中按照一定的规范被调用。
- 其中OSInit()函数初始化uC/OS-II内部变量,OSStart()函数启动多任务环境。
动态内存管理
任务管理
事件管理
- 普通信号量
- 互斥信号量
- 消息邮箱
- 消息队列
- 事件标志组
另外还有4个事件管理函数为OSMboxPostOpt()、OSQPostFront()、OSQFlush(),OSQPostOpt()。
时间管理
- 注意:延时函数OSTimeDly()是以系统节拍数为参数,而延时函数OSTimeDlyHMSM()是以实际时间值为参数,但在执行过程中仍然转换为系统节拍数。如果实际时间不是系统节拍的整数倍,将进行四舍五入处理。
- 设系统节拍为50毫秒,调用OSTimeDly(20)的效果是延时1秒钟,调用OSTimeDlyHMSM(0,1,27,600)的实际时间是延时1分27秒600毫秒。
- 当调用OSTimeDly()函数时,当前任务会被暂停执行,让出CPU给其他任务执行,直到延时时间到达后再继续执行当前任务。这个函数主要用于任务调度和时间控制,而不是用来释放CPU资源。