(转)
UC/OS-II的学习第一天:
UCOS-II的基本概念和常用知识
1. 所有UC/OS-II 的要素(函数、变量、常数定义、宏)都已OS开头
2. 临界区:指处理时不可分割的代码。一旦开始执行,则不允许任何中断打入。
3. 资源:任何为任务所占用 的实体(如:打印机、键盘、变量、结构体等)
4. 共享资源:可以被一个以上的任务所使用的资源。 (必须存在互斥即每个任务使用时独占资源。)
5. 任务:也叫线程,是一个简单的程序。典型的每个任务都是一个无限的循环。处于5种状态之下:休眠、就绪、运行、挂起、中断。见图1.1
休眠态: 驻留在内存中,但不被多任务内核调度。
就绪态:该任务可以运行,但是priority比较低,暂不能运行
运行态:掌握了CPU的控制权
挂起态:该任务在等待,等待某一事件的发射。
中断态:进入被中断的状态。
6. 任务切换:(上下文切换/CPU寄存器内容切换)
将当前状态即CPU寄存器全部入栈,将新任务状态出栈,并进行下一个任务。
7. 内核(kennel)
负责管理各个任务。其提供的基本服务就是任务切换!
8. 调度(scheduler)
内核的职责之一,就是决定轮到那个任务运行了。UCOS采用的是占先式内核。采用的是优先级调度法:让处在就绪态的优先级最高的任务运行。
8.1 占先式内核:响应时间得到了最优化,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件。
8.2 占先式内核总是让就绪态的高优先级的任务运行,中断服务程序可以抢占CPU,到ISR完成后,内核让优先级最高的任务运行,并不一定是被中断了的任务了。
8.3 可重入性(reentrancy)
可重入型函数可以被一个以上的任务调用,不用担心数据破坏,可被中断,因为其使用的是局部变量,或者在使用全局变量时,进行了保护。
不可重入型函数会使数据等破坏,使用以下三点可以使其成为可重入型:
1. 把全局变量定义成局部变量
2. 调用函数时关中断,然后开中断
3. 用信号量禁止该函数在使用时被调入。
9. 时间片 轮番调度法
UC/OS没有用,它要求当优先级相同时的一种方法,UC/OS要求priority都不相同。
10.优先级 PRIORITY
静态优先级 :其优先级在编程时确定了。
动态优先级 :应用程序执行时,任务的优先级可变。但要避免出现优先级反转的问题。(优先级反转和任务优先级的分配将会单独列一个专题)
11. 互斥条件:在处理共享数据时,要避免竞争和数据的破坏。有以下四种方法:
11.1关中断和开中断
利用宏OS_ENTER_CRITICAL() 关中断
OS_EXTI_CRITCAL() 开中断
在处理内部变量和数据结构时常用这种方法,但时间不要太长,否则影响时间特性
11.2 测试并置位(可以用一个全局变量测试能否使用这个共享资源)
11.3 禁止,然后允许任务切换 (给任务切换上锁,但不建议使用)
11.4 信号量(semaphore)
一种约定机制。其像一把钥匙,任务要想运行下去,就得拿到这把钥匙,否则只能被挂起
控制共享资源的使用权
标志某事件的发生
使两个任务的行为同步
对信号量进行三种操作,
初始化 Initilize/建立 Create (要给信号量赋初值,等待信号量的任务表要清空)
等信号 Wait /挂起 Pend (想要得到信号量的执行等待操作 OSSemPend( , , ) 如果信号量有效,则信号量值减1,如果为0,则进入等待信号量的任务表,等待超时或有效)
给信号 Signal/发信号 Post (任务发信号释放信号量)
有的情况要隐藏信号量,有些简单的共享变量在处理时,就不要用信号量了,否则浪费时间太多,得不偿失,可以用开中断,关中断的方法。
12. 死锁 :(两个任务无限期等待对方控制的资源)
13. 同步:可以使某个任务和ISR同步。
14. 事件标志:Event Flag UC/OS-II不支持。
15. 任务之间的通信:两个途径:1.全程变量2.发消息给另一个任务
16. 消息邮箱: message mail box mbox
是一个指针型变量,通过内核服务,一个任务或者ISR可以把一则消息放到邮箱中去,一个任务或多个任务也可以解释这个消息,但是,要有约定。改指针指向的内容就是那则消息。
17. 消息队列 : message queue 给任务发消息。和邮箱差不多
18. 中断 ISR:中断服务子程序。允许中断嵌套。。。
19. 中断延迟: 关中断的最长时间+开始执行ISR的第一个条指令的时间。
20. 中断响应:从中断发生到开始执行用户的ISR代码来处理这个中断的时间。
对于占先式内核:中断响应时间是: 中断延迟+保存CPU内部寄存器的时间
+内核的进入ISR的执行时间。
21. 中断恢复时间:微处理器返回到被中断了的程序代码所需要的时间
对于占先式内核:中断恢复时间: 判定是否有优先级更高的任务进入了就绪态的时间+恢复那个优先级更高任务的CPU寄存器的时间+执行中断返回指令的时间。
22. 中断延迟、响应和恢复。 见图1.2
23. 非屏蔽中断 NMI : 对于其服务子程序,不能使用内核提供的服务。
24. 时钟节拍 :clock tick 特定的周期性中断。
25. 对存储器的要求:(8位单片机基本服务1K到3K) ROM 应用程序代码+内核代码
26. RAM :应用程序代码 +内核RAM + SUM (任务堆栈+MAX(ISR堆栈)) |