第一章
1.概述了µC/OS-II如何安装,目录的存放。
2.µC/OS-II中的数据类型均为浮点型。
3.OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL():关中断和开中断是为了保护临界段代码。这些代码与处理器有关。关于宏的定义可以在OS_CPU.H中找到。
以及进入正确宏的代码。
4.全局宏的定义方式:
#ifdef xxx_GLOBALS |
#define xxx_EXT |
#else |
#define xxx_EXT extern |
#endif |
5.05基于PC的服务
对地址0x000B8000开始,在单色显示器中,用户可以把#define constant DISP_BASE从0xB800改为0xB000。
6.main()
main()函数调用PC_ElapsedInit()[程序清单L1.11(1)]来初始化定时器记录OSTaskStkChk()的执行时间。第二,所有的任务都使用OSTaskCreateExt()函数来建立任务[程序清单L1.11(2)](替代老版本的OSTaskCreate()),这使得每一个任务都可进行堆栈检查。
7.
L 1.20TCB扩展数据结构的代码。 |
typedef struct { |
char TaskName[30]; (1) |
INT16U TaskCtr; |
INT16U TaskExecTime; |
INT32U TaskTotExecTime; |
} TASK_USER_DATA; |
8.
任务4的操作只是从邮箱发送[程序清单L1.25(1)]和接收[程序清单L1.25(2)],这使得用户可以测量任务在自己PC上执行的时间。任务4每10mS执行一次[程序清单L1.25(3)]。
程序清单 L 1.25 任务4。 |
void Task4 (void *data) |
{ |
OS_EVENT *mbox; |
INT8U err; |
|
|
data = data; |
mbox = OSMboxCreate((void *)0); |
for (;;) { |
OSMboxPost(mbox, (void *)1); (1) |
OSMboxPend(mbox, 0, &err); (2) |
OSTimeDlyHMSM(0, 0, 0, 10); (3) |
} |
} |
9.注意
EX3L.C中的OSTaskSwHook()函数的代码,该函数用来测量每个任务的执行时间,可以用来统计每一个任务的调度频率,也可以统计每个任务运行时间的总和。这些信息将存储在每个任务的TCB扩展数据结构中。每次任务切换的时候OSTaskSwHook()都将被调用。
每次任务切换发生的时候,OSTaskSwHook()先调用PC_ElapsedStop()函数[程序清单L1.27(1)] 来获取任务的运行时间[程序清单L1.27(1)],PC_ElapsedStop()要和PC_ElapsedStart()一起使用,上述两个函数用到了PC的定时器2(timer 2)。其中PC_ElapsedStart()功能为启动定时器开始记数;而PC_ElapsedStop()功能为获取定时器的值,然后清零,为下一次计数做准备。从定时器取得的计数将拷贝到time变量[程序清单L1.27(1)]。然后OSTaskSwHook()调用PC_ElapsedStart()重新启动定时器做下一次计数[程序清单L1.27(2)]。需要注意的是,系统启动后,第一次调用PC_ElapsedStart()是在初始化代码中,所以第一次任务切换调用PC_ElapsedStop()所得到的计数值没有实际意义,但这没有什么影响。如果任务分配了TCB扩展数据结构[程序清单L1.27(4)],其中的计数器TaskCtr进行累加[程序清单L1.27(5)]。TaskCtr可以统计任务被切换的频繁程度,也可以检查某个任务是否在运行。TaskExecTime [程序清单L1.27(6)]用来记录函数从切入到切出的运行时间,TaskTotExecTime[程序清单L1.27(7)]记录任务总的运行时间。统计每个任务的上述两个变量,可以计算出一段时间内各个任务占用CPU的百分比。OSTaskStatHook()函数会显示这些统计信息。
第二章
1.这种系统可称为前后台系统或超循环系统(Super-Loops)。
2.代码的临界段
代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。
3.任务
每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。
使Swap()函数具有可重入性:
l 把Temp定义为局部变量
l 调用Swap()函数之前关中断,调动后再开中断
l 用信号量禁止该函数在使用过程中被再次调用
2.0.1 信号量(Semaphores)
信号量是60年代中期Edgser Dijkstra 发明的。信号量实际上是一种约定机制,在多任务内核中普遍使用.信号量用于:
l 控制共享资源的使用权(满足互斥条件)
l 标志某事件的发生
l 使两个任务的行为同步