http://tiandongying.blog.163.com/blog/static/16361282120108951837415/
读《uCOSⅡ中文教程.pdf》笔记
1、建立INCLUDES.H,可以统一头文件,虽然编译的时候多浪费了时间,但是增强的程序的移植性。
2、定义可移植的数据类型。Typedef
3、定义全局宏方法。
#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif
OS_EXT INT32U OSIdleCtr;
OS_EXT INT32U OSIdleCtrRun;
OS_EXT INT32U OSIdleCtrMax;
同时,uCOS_II.H 有中以下定义:
#define OS_GLOBALS
#include “includes.h”
4、调用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),进行中断操作。
5、基于PC的服务。利用电脑的资源。
6、函数
OSInit();
RandomSem = OSSemCreate(1);
OSTaskCreate(TaskStart, (void *)0,(void *)&TaskStartStk[TASK_STK_SIZE-1],0);
OSStart();
7、在启动多任务OSStart()之前用户至少要先建立一个任务,这一点非常重要。
8、做嵌入式应用时,用户必须在第一个任务中打开时钟节拍中断。
9、前后台系统,就是那种简单的,只有中断的单线程程序。
10、代码的临界段,一旦执行则不允许打断,故应用开关中断来进行保护。
11、区别:资源、共享资源、任务、多任务
12、任务的5种状态:休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态.
13、做任务切换所需要的时间取决于CPU 有多少寄存器要入栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。
14、单片机一般不能运行实时内核,因为单片机的RAM 很有限。通过提供必不可缺少 的系统服务,诸如信号量管理,邮箱、消息队列、延时等,实时内核使得CPU 的利用更为有效。一旦读者用实时内核做过系统设计,将决不再想返回到前后台系统。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU 的占用时间一般在2 到5 个百分点之间。
15、多数实时内核是基于优先级调度法的。
16、不可剥夺型内核要求每个任务自我放弃CPU 的所有权。不可剥夺型内核的一个优点是响应中断快。不可剥夺型内核的另一个优点是,几乎不需要使用信号量保护共享数据。任务级响应时间要大大好于前后系统,但仍是不可知的,商业软件几乎没有不可剥夺型内核。
17、μC/OS-Ⅱ以及绝大多数商业上销售的实时内核都是可剥夺型内核。最高优先级的任务一旦就绪,总能得到CPU 的控制权。使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。
18、函数的重入性。函数执行过程中被打断,是否会出错?
int Temp;
void swap(int *x, int *y)
{
Temp = *x;
*x = *y;
*y = Temp;
}
使用以下技术之一即可使Swap()函数具有可重入性:
? A把 Temp 定义为局部变量;
? B调用 Swap()函数之前关中断,调动后再开中断;
? C用信号量禁止该函数在使用过程中被再次调用;
19、目前,μC/OS-Ⅱ不支持时间片轮番调度法。应用程序中各任务的优先级必须互不相同。
20、多任务内核应允许动态改变任务的优先级以避免发生优先级反转现象。应当自动而非人为改变。真正需要的是,为防止发生优先级反转,内核能自动变换任务的优先级,这叫做优先级继承(Priority inheritance)但μC/OS-Ⅱ不支持优先级继承,一些商业内核有优先级继承功能。
21、软实时系统只是要求任务执行得尽量快,并不要求在某一特定时间内完成。硬实时系统中,任务不但要执行无误,还要准时完成。
22、与全程变量、指针、缓冲区、链表、循环缓冲区等共享资源打交道时,使之满足互斥条件最一般的方法有:
? A关中断
? B使用测试并置位指令
? C禁止做任务切换
? D利用信号量
23、OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),关中断和开中断。一般地说,关中断的最长时间不超过内核本身的关中断时间,就不会影响系统中断延迟。当然得知道内核里中断关了多久。凡好的实时内核,厂商都提供这方面的数据。
24、作测试并置位(Test-And-Set),或称作TAS。有的微处理器有硬件的TAS 指令。
25、应该尽量避免禁止任务切换之类操作,因为内核最主要的功能就是做任务的调度与协调。OSSchedLock();OSSchedUnlock();
26、一般地说,对信号量只能实施三种操作:初始化(INITIALIZE);等信号(WAIT);给信号(SIGNA)。信号量初始化时要给
信号量赋初值,等待信号量的任务表(Waiting list)应清为空。μC/OS-Ⅱ只支持优先级法,优先级高则优先分配到信号量。OS_EVENT *SharedDataSem,OSSemPend(SharedDataSem, 0, &err);OSSemPost(SharedDataSem);。如果操作的时间短,只需开关中断,如果时间长,则需考虑用信号量。
27、死锁? A先得到全部需要的资源再做下一步的工作,B用同样的顺序去申请多个资源,C释放资源时使用相反的顺序。
28、同步,类似信号量的使用,只意义不同。
29、事件标志,用于多事件同步,每个事件占用一个信号位,以前用的握手程序曾使用。UCOS2操作系统没使用。
30、任务间的通信。
A全局变量;
B消息邮箱;指向某内存地址,用法类似信号量。
C消息队列;多个。
31、中断?
A在前后台系统中,程序回到后台程序;
? B对不可剥夺型内核而言,程序回到被中断了的任务;
? C对可剥夺型内核而言,让进入就绪态的优先级最高的任务开始运行;
μC/OS-Ⅱ是可剥夺型内核,中断时,它先调用OSIntEnter()函数,用以跟踪中断的嵌套,退出中断时调用OSIntExit()函数。
如果事件处理需花的时间短于给一个任务发通知的时间,就应该考虑在中断服务子程序中做事件处理并在中断服务子程序中开中断,以允许优先级更高的中断打入并优先得到服务。
32、非屏蔽中断(NMI),优先级最高,但是不能随意占用时间。
33、时钟节拍。时钟节拍率越快,系统的额外开销就越大。一般10ms或200ms等。我们选择的1ms有点高。
34、多任务系统比前后台系统需要更多的代码空间(ROM)和数据空间(RAM)。额外的代码空间取决于内核的大小,而RAM 的用量取决于系统中的任务数。
? 定义函数和中断服务子程序中的局部变量,特别是定义大型数组和数据结构
? 函数(即子程序)的嵌套
? 中断嵌套
? 库函数需要的栈空间
? 多变元的函数调用
35、实时内核也称为实时操作系统或RTOS。它的使用使得实时应用程序的设计和扩展变得容易,不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务,RTOS使得应用程序的设计过程大为减化。使用可剥夺性内核时,所有时间要求苛刻的事件都得到了尽可能快捷、有效的处理。通过有效的服务,如信号量、邮箱、队列、延时、超时等,RTOS 使得资源得到更好的利用。如果应用项目对额外的需求可以承受,应该考虑使用实时内核。这些额外的需求是:内核的价格,额外的ROM/RAM 开销,2 到4 百分点的CPU 额外负荷。
36、小结 图略。