分类:
2010-01-11 10:16:31
最近在学习uc/osii在AVR单片机的移植问题,对UC/OS进行了进一步的研读,可是始终有些问题模棱两可,不得要领。从网上也下载了许多UC/OS在AVR上移植的例子程序,始终无法调试成功。因为不用调试和仿真,对内核的运行过程就不能有直观深入的认识。
总算,功夫不负有心人,昨天下载的实例在ICCAVR7上顺利通过了编译,而且在AVRstudio4上也能够顺利的进行调试,在proteus6.9上也能作仿真,通过AVR studio4上的单步运行了断点全速运行,对uc/osII的运行有了深刻的认识。
首先,理清了任务调度的机理。当应用程序建立了3个任务和一个空闲任务,在任务初始化的时候建立所有任务,在OSStart()中通过调用OSStartHighRdy()运行优先级最高的任务。
在任务的运行及调度方面,每个任务的结束部分均设置一个OSTimeDly()函数,通过该函数挂起当前运行的任务,并通过OS_Sched()中的OSCtxSw()进行那个任务级调度,运行优先级最高的任务。
节拍中断时重要的环节,包括中断向量的安装与中断函数的书写。
UC/OS的内核的时间管理可以利用单片机内部的定时器设定固定时间的定时(如20ms),该时间即为一个节拍(Tick),通过OSTickISR定时器中断处理程序进行处理。每个任务均会挂起n个Tick,OSTimeTick()将时所有挂起的任务的延时时间减1,当减到0时,该任务既有挂起状态转为就绪状态。当定时中断时,在OSIntExit()中若发现有更高优先级任务处理就绪状态,将执行中断级任务切换OSIntSw()进行任务的切换。
这只是学习ucosii的开端,Jean J.Labrosse的代码的的精髓还远远没有体会到,学习ucosii的路还很长。