uC/OS-III系统的一些知识(2)

来源:互联网 发布:算法导论答案 编辑:程序博客网 时间:2024/05/21 00:47

1,嵌入式系统中的一个通用 原则,不要使用递归调用---在嵌入式系统当中,任务的栈空间通常都很小。a,函数的调用深度越是深,由于每一级的函数通常都会有局部变量,这些局部变量在递归中会被保存在栈中,那么所使用的栈空间也会累积得越大。b,递归调用需要的栈空间会相对的大(视具体的情况),在嵌入式系统中也建议少用。c,我们应当尽可能的不要在函数中定义占用内存空间较大的局部变量。堆是大家共享的。任务可以通过调用API来从堆中分配内存空间。栈是任务所独有的,在嵌入式系统中,当一个任务创建起来后其栈空间的大小往往是定了的。函数中的局部变量是由编程语言自动从栈上分配的,我们不需要调用API进行空间分配。

2,堆栈的溢出是很常见的现象,在测试产品的过程当中,一定要监视任务在运行时的堆栈使用量。一些CPU具有检测堆栈溢出的功能,通过设置任务块OS_TCB.StkLimitPtr来进行控制。

3,任务控制块当中,.StkPtr为一指针变量,指向任务当前的栈顶。OS_TCB中唯一一个能够被汇编代码(任务切换相关代码)访问的成员。在OS_TCB数据结构当中,器偏移量为0。

4,空闲任务运行时,有两个计数器(均为32位无符号整型)会不断的递增,OSIdleTaskCtr用来表示空闲任务的活跃度。OSStatTaskCtr由统计任务来控制,用来统计程序运行时CPU的运行情况。

5,RTOS操作系统都需要一个周期型的时钟源,称为时钟节拍ClockTick,时钟节拍处理函数封装在os_tick.c中。

6,就绪任务表,所有的就绪等待运行的任务都会被放进一个所谓的“就绪表”,就绪表有两个部分,一个就绪优先级位映射表OSPrioTbl[],用来标明那个优先级下有任务就绪,一个就绪任务列表OSRdyList[],其中包含指向各个就绪任务的指针。

7,处理器通常都有“计算前导零”的指令CLZ指令,如果没有的话,则需要C函数进行计算!有CLZ指令,可加速查找最高优先级的任务。

8,就绪任务列表OSRdyList是一个包好OS_CFG_PRO_MAX项的数组(OSRdyList[]),数组的类型为OS_RDY_LIST(os.h),其中有三个成员,.Entries记录该优先级下的任务数量,没有任务则为0、.TailPtr、.HeadPtr建立一个双向链表。如果任务的优先级位n,则该任务就会插入到OSRdyList[n]的就绪任务列表中。



0 0
原创粉丝点击