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中,
依靠系统的时钟中断,
触发任务切换,实现当前任务的寄存器入栈及下一个将要运行任务的寄存器出栈,
完成切换。

你可能感兴趣的:(uCOS整体初步了解)