uCOS整体初步了解

首先在main函数中调用OSTaskCreate的理解。
OSTCBPrioTbl
 
OSTaskStkInit() 设置堆栈
OS_TCBInit()TCB任务控制块初始化
OS_Sched()任务调度
 
在OS_Sched中,OS_SchedNew()函数负责找到新的最高优先级的
任务,并赋值给OSPrioHighRdy
     OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
这行语句中的三个全局变量都是实现任务切换的优先级判断的关键。
OS_TASK_SW()宏定义,因为C不能操作寄存器,所以对于任务的切换是由这个宏定义,定义的汇编代码实现。
这个宏定义展开是汇编代码。
 
这些由uS/OC的书中的第三章都可以更详细的获得。
 
OS_ENTER_CRITICAL();
OS_EXIT_CRITICAL();
uC/OS中用来实现,开关中断的一组宏定义。当调用功能函数时,必须关闭中断。
 
uC/OS中的互斥操作是由信号灯机制来实现的,
OSSemCreate函数创建信号灯。
OSMutexCreate
 
uC/OS中的任务间通信机制
分为邮箱和队列。
OSMboxCreate()创建一个邮箱
OSQCreate()创建一个队列。
 
他们传递的都是一个指针,队列可以看做是一组邮箱构成的数组,只不过他们是由相同的任务控制。
这里的指针可以是一个变量的地址,也可以是一个结构体变量的地址。
因为指针的存在,实现了不同任务间,大量数据的传输。
 
OSStart()函数开启us/os中真正多任务的开始。
没有返回。
OS_SchedNew();找到最高优先级,
OSStartHighRdy();通过汇编代码,跳转到需要的地方执行,此时系统才开始真正运行起来。
 
uC/OS的任务切换是通过汇编代码实现的,
这里边使用的是
中断切换。
所有的切换代码是在
os_cpu_a.asm中,
依靠系统的时钟中断,
触发任务切换,实现当前任务的寄存器入栈及下一个将要运行任务的寄存器出栈,
完成切换。
posted @ 2013-05-30 11:01  cronus象牙塔  阅读(207)  评论(0编辑  收藏  举报