菜鸟学uC/OS_II(5)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
By <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Norman
2008-7-11
内存管理<略>
移植uCOS_II
这个是整个学习的重点之一。在学习之前,跑了一遍例程,后来想做PC移植,找齐了工具,看了一遍这个移植方法,发现还是不会,一点都没有摸到门路。因此有必要再好好学学一遍,希望能够一窥端倪。
整个移植相关的代码包括有uCOS_II(与处理器无关代码)、uCOS_II配置(与应用有关)、uCOS_II移植(处理器有关)以及应用程序代码。个人认为,要移植好uCOS_II,需要注意:1、uCOS_II本身代码;2、编译器的特性;3、移植对象CPU结构
INCLUDES.H:
这是配置管理文件的头文件,虽然它可能做了很多没有用到的工作,但是却能够扩展适应性,也就是增强了移植能力,所以作者还是比较推荐使用这种方式。
OS_CPU.H:<?>
包含了处理器相关的常数、宏以及类型。
OS_CPU.C:
OSTaskStkInit()——
此函数由OSTaskCreate()或者OSTaskCreateExt()函数调用用来初始化任务的栈结构,uCOS_II模拟一次中断(软中断)将所有寄存器保存在任务堆栈中。这里有个问题,分两种情况:pdata这个参数是否放在一个或者多个寄存器中传递,这样的机制是会影响到保存顺序的:如果不经过寄存器,pdata直接被编译器保存到堆栈中;经过寄存器的,需要在OSTaskStkInit()函数中按照处理器文档来保存寄存器的内容。
根据处理器的不同,寄存器的保存顺序也是不同的,因此,需要对处理器进行熟悉,根据处理器特点来编写堆栈处理函数。
Hook函数——
这个就比较明确了,Hook函数在很多地方如VC++中都运用到,目的是在一些状态变化或者其他程序不太好处理的地方加入用户控制,实现某些特定的功能等。
OS_CPU_A.ASM:
uCOS_II的移植需要用户编写4个汇编函数:
OSStartHighRdy()
OSCtxSw()
OSIntCtxSw()
OSTickISR()
OSStartHighRdy()——
调用时使就绪表中优先级最高的任务运行,这个函数会调用OSTaskSwHook()函数;这里需要检查OSRunning标志位,确定OSTaskSwHook()函数是被OSStartHighRdy()函数调用(OSRunning == FALSE)还是正常的任务切换之中被调用的(OSRunning == TRUE)。
最重要的就是,用户要编写的程序需要和CPU相关,因此,熟悉CPU文档。
OSCtxSw()——
任务级的切换是通过执行软中断指令,或者TRAP指令来实现的,中断服务子程序、陷阱或者异常处理的向量地址必须指向OSCtxSw()。
OSTickISR()——
为什么必须在OSStart()执行之后,也就是多任务开始之后去启动时钟节拍中断?如果在OSInit()和OSStart()函数之间打开了时钟节拍器,就会造成程序崩溃;这是由于uCOS_II在开始第一个任务之前,时钟节拍中断服务程序就会执行,而这个时候系统处于一个未知状态。所以正确的做法是OSStart()执行之后,在第一个任务中开启时钟节拍。
OSIntCtxSw()——
这个函数是OSIntExit()函数调用的,目的是在ISR中执行任务切换功能。因为在OSTickISR()中如果中断使更高优先级的任务就绪,那么就可能发生调度。而在中断中,需要用OSIntCtxSw()函数来进行调度处理。
以上只是我看书时觉得应该注意到重点和难点,没有什么理解的东西,因为我看过之后是一头雾水,不知道这些函数应该怎样设计。希望在实践中可以得到我需要的结果。
测试方法<在此略,等到移植后再研究>
(待续)
文章评论(0条评论)
登录后参与讨论