μC/OS-Ⅱ在ARM7上移植方法的探讨与实现
时间:09-13
来源:互联网
点击:
3.2.2 OS_CPU_C.C
包含了与移植有关的C函数,包括堆栈的初始化和一些钩子函数的实现,但是最重要的是OSTaskStkInit()函数,该函数是在用户建立任务时系统内部自己调用的,用来对用户任务的堆栈初始化。在ARM7体系结构下,任务堆栈空间由高至低递减,依次保存着PC,LR,R12,…,R1,R0,CPSR的初始化堆栈结构,当用户初始化了堆栈,OSTaskStkInit()就返回新的堆栈指针STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()会获得该地址并将他保存到任务控制块TCB中,其他的几个钩子函数必须声明,但可以不包含任务代码,这些钩子函数在本移植中全为空函数。
3.2.3 OS_CPU_A.S
μC/OS-Ⅱ移植的绝大部分工作都集中在OS_CPU_A.S文件的移植上,在这个文件里,最困难的工作又集中体现在OSIntCtxSw和OSTickISR这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对处理器的寄存器进行操作,所以必须用汇编语言编写,包括4个子函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
OSStartHighRdy()该函数首先调用钩子函数OSTaskSwHook(),然后将OSRunning标志位设置为真,表示任务开始执行,从而保证任务切换操作的正确执行,紧接着从具有最高优先级的任务控制块中取得任务的堆栈指针,初始化堆栈指针寄存器SP,然后恢复其他的寄存器,开始执行最高优先级的任务。
OSCtxSw()该函数在任务级任务切换函数中调用,首先保存处理器寄存器,将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,从新任务的任务堆栈中恢复处理器所有寄存器的值,然后执行中断返回指令。
OSIntCtxSw()该函数是在ISR中执行任务切换功能,其原理基本上与任务级的切换相同,区别只是ISR已经保存了CPU的寄存器,因此不要再进行类似的操作,只需对堆栈指针作相应的调整即可。
OSTickISR()该函数是系统时钟节拍中断服务函数,首先要保存处理器寄存器,接着调用OSIntEnter()函数,以保证中断嵌套层数不超过255层,如果满足了该条件,则把堆栈指针保存到当前任务的任务控制块TCB中,然后给产生中断的设备清中断,重新允许中断,接下来调用OSTimeTick()来维持μC/OS-Ⅱ内部的定时以及调用OSIntExit()函数决定是否因为这个中断服务程序的执行,使得更高优先级的任务就绪。
4 μC/OS-Ⅱ的测试
做完移植工作以后,就要测试移植是否正确,这其实是移植过程的最后一步,应该首先不加任何用代码来测试移植好的μC/OS-Ⅱ,即应该首先测试内核自身的运行状况,这样做的目的是如果有些部分未能正常工作,那就是移植本身的问题,而不是应用代码产生的问题,主要分为以下几个步骤来进行移植的测试:
首先,必须了解处理器所使用的编译器系统,这个步骤取决于使用的编译器,在这期间是无代码的测试,其次,要验证OSTaskStkInit()和OSStartHighRdy()函数,在OS_CFG.H文件中设置OS_TASK_STAT_EN为0,只让一个空闲任务OS_TaskIdle()运行,检查是否出错,然后需要验证任务级切换OSCtxSw()函数,在测试任务TaskTest()中加入OSTimeDly()函数,OSTimeDly()函数接着调用OS_Sched(),OS_Sched()调用汇编语言编写的函数OSCtxSw()函数,如果是正确配置了SWI,CPU就会开始执行OSCtxSw(),最后,需要验证OSIntCtxSw()和OSTickISR()函数。
当上述的这些测试步骤都成功后,可以尝试运行一些具体的任务,按照由简到繁的过程不断使测试变得复杂,来进一步验证内核的稳定性和系统性能。
这里建立了一个简单的LED灯闪烁控制任务,其代码如下:
加载后,LED灯闪烁控制正常,则测试成功,内核正常运转,若测试出现问题,就要认真找出问题所在,不可忽略硬件的问题,还有编译器等,当然也可以采用其他的测试,如串口的测试等。
5 结语
以上所述为μC/OS-Ⅱ在ARM7上移植的通用方法,但针对不同的处理器还需要作适当的修改,RTOS是当今嵌入式应用的热点,应用RTOS,可以提高产品的可靠性,降低研发周期,其中μC/OS-Ⅱ具有很好的实时性和很小的代码量,占用空间少,执行效率高,移植方法相对简单,因此掌握μC/OS-Ⅱ的移植方法是相当重要的。
关于μC/OS-II系列软件版权的说明
Micrium 公司产品包括μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司提供嵌入式系统应用方面的产品,并对其软件拥有知识产权。Micrium花费了大量的时间和财力为嵌入式领域提供高质量的软件产品。所有上述产品都以源代码的形式提供给客户,具有极大的适用性。产品不是免费软件,也不是开放源码的软件,因此,不能免费使用,需要清楚的阐明μC/OS-II和系列的软件不是开放源码的免费软件,这是和Linux完全不一样的。
开发和研究者可以通过购买Micrium公司的Jean先生的μC/OS-II的书籍,而得到μC/OS-II源代码,但是仅可以作为个人和学校学习使用,所有和μC/OS-II直接和间接相关的商业目的行为,必须购买使用μC/OS-II及系列产品的商业授权,包括芯片/单板/系统厂家的任何参考设计,教学设备和最终的产品,如果没有得到Micrium公司Jean先生签字的合法授权都是不合法的使用, 这在μC/OS-II的书籍Micrium公司(www.micrium.com)和中国代理商-北京麦克泰软件公司网站(www.bmrtech.com)上面中有明确规定。
Micrium公司其它软件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的销售模式与μC/OS-II不同,如果没有购买使用授权,完全不可以拥有该源代码,也不能将源代码用于产品的设计,培训,教学和生产。
μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授权方式有:单个产品、产品线(系列)、按照CPU 划分的产品三种形式,μC/OS-KA,μC/OS-VIEW 等工具是按照使用人的数目收取费用的,相对起传统的RTOS 动辄2-3万美圆的开发费用和每块单板的使用费(根据数量从数百到几个美圆),μC/OS-II及系列产品是采用一次性的收费方式,应该只是大约相当于传统RTOS 的10-20% 的总体费用。
包含了与移植有关的C函数,包括堆栈的初始化和一些钩子函数的实现,但是最重要的是OSTaskStkInit()函数,该函数是在用户建立任务时系统内部自己调用的,用来对用户任务的堆栈初始化。在ARM7体系结构下,任务堆栈空间由高至低递减,依次保存着PC,LR,R12,…,R1,R0,CPSR的初始化堆栈结构,当用户初始化了堆栈,OSTaskStkInit()就返回新的堆栈指针STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()会获得该地址并将他保存到任务控制块TCB中,其他的几个钩子函数必须声明,但可以不包含任务代码,这些钩子函数在本移植中全为空函数。
3.2.3 OS_CPU_A.S
μC/OS-Ⅱ移植的绝大部分工作都集中在OS_CPU_A.S文件的移植上,在这个文件里,最困难的工作又集中体现在OSIntCtxSw和OSTickISR这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关,在实际的移植工作中,这两个地方也是比较容易出错的地方,这部分需要对处理器的寄存器进行操作,所以必须用汇编语言编写,包括4个子函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
OSStartHighRdy()该函数首先调用钩子函数OSTaskSwHook(),然后将OSRunning标志位设置为真,表示任务开始执行,从而保证任务切换操作的正确执行,紧接着从具有最高优先级的任务控制块中取得任务的堆栈指针,初始化堆栈指针寄存器SP,然后恢复其他的寄存器,开始执行最高优先级的任务。
OSCtxSw()该函数在任务级任务切换函数中调用,首先保存处理器寄存器,将当前SP存入任务TCB中,载入就绪最高优先级任务的SP,从新任务的任务堆栈中恢复处理器所有寄存器的值,然后执行中断返回指令。
OSIntCtxSw()该函数是在ISR中执行任务切换功能,其原理基本上与任务级的切换相同,区别只是ISR已经保存了CPU的寄存器,因此不要再进行类似的操作,只需对堆栈指针作相应的调整即可。
OSTickISR()该函数是系统时钟节拍中断服务函数,首先要保存处理器寄存器,接着调用OSIntEnter()函数,以保证中断嵌套层数不超过255层,如果满足了该条件,则把堆栈指针保存到当前任务的任务控制块TCB中,然后给产生中断的设备清中断,重新允许中断,接下来调用OSTimeTick()来维持μC/OS-Ⅱ内部的定时以及调用OSIntExit()函数决定是否因为这个中断服务程序的执行,使得更高优先级的任务就绪。
4 μC/OS-Ⅱ的测试
做完移植工作以后,就要测试移植是否正确,这其实是移植过程的最后一步,应该首先不加任何用代码来测试移植好的μC/OS-Ⅱ,即应该首先测试内核自身的运行状况,这样做的目的是如果有些部分未能正常工作,那就是移植本身的问题,而不是应用代码产生的问题,主要分为以下几个步骤来进行移植的测试:
首先,必须了解处理器所使用的编译器系统,这个步骤取决于使用的编译器,在这期间是无代码的测试,其次,要验证OSTaskStkInit()和OSStartHighRdy()函数,在OS_CFG.H文件中设置OS_TASK_STAT_EN为0,只让一个空闲任务OS_TaskIdle()运行,检查是否出错,然后需要验证任务级切换OSCtxSw()函数,在测试任务TaskTest()中加入OSTimeDly()函数,OSTimeDly()函数接着调用OS_Sched(),OS_Sched()调用汇编语言编写的函数OSCtxSw()函数,如果是正确配置了SWI,CPU就会开始执行OSCtxSw(),最后,需要验证OSIntCtxSw()和OSTickISR()函数。
当上述的这些测试步骤都成功后,可以尝试运行一些具体的任务,按照由简到繁的过程不断使测试变得复杂,来进一步验证内核的稳定性和系统性能。
这里建立了一个简单的LED灯闪烁控制任务,其代码如下:
|
加载后,LED灯闪烁控制正常,则测试成功,内核正常运转,若测试出现问题,就要认真找出问题所在,不可忽略硬件的问题,还有编译器等,当然也可以采用其他的测试,如串口的测试等。
5 结语
以上所述为μC/OS-Ⅱ在ARM7上移植的通用方法,但针对不同的处理器还需要作适当的修改,RTOS是当今嵌入式应用的热点,应用RTOS,可以提高产品的可靠性,降低研发周期,其中μC/OS-Ⅱ具有很好的实时性和很小的代码量,占用空间少,执行效率高,移植方法相对简单,因此掌握μC/OS-Ⅱ的移植方法是相当重要的。
关于μC/OS-II系列软件版权的说明
Micrium 公司产品包括μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司提供嵌入式系统应用方面的产品,并对其软件拥有知识产权。Micrium花费了大量的时间和财力为嵌入式领域提供高质量的软件产品。所有上述产品都以源代码的形式提供给客户,具有极大的适用性。产品不是免费软件,也不是开放源码的软件,因此,不能免费使用,需要清楚的阐明μC/OS-II和系列的软件不是开放源码的免费软件,这是和Linux完全不一样的。
开发和研究者可以通过购买Micrium公司的Jean先生的μC/OS-II的书籍,而得到μC/OS-II源代码,但是仅可以作为个人和学校学习使用,所有和μC/OS-II直接和间接相关的商业目的行为,必须购买使用μC/OS-II及系列产品的商业授权,包括芯片/单板/系统厂家的任何参考设计,教学设备和最终的产品,如果没有得到Micrium公司Jean先生签字的合法授权都是不合法的使用, 这在μC/OS-II的书籍Micrium公司(www.micrium.com)和中国代理商-北京麦克泰软件公司网站(www.bmrtech.com)上面中有明确规定。
Micrium公司其它软件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的销售模式与μC/OS-II不同,如果没有购买使用授权,完全不可以拥有该源代码,也不能将源代码用于产品的设计,培训,教学和生产。
μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授权方式有:单个产品、产品线(系列)、按照CPU 划分的产品三种形式,μC/OS-KA,μC/OS-VIEW 等工具是按照使用人的数目收取费用的,相对起传统的RTOS 动辄2-3万美圆的开发费用和每块单板的使用费(根据数量从数百到几个美圆),μC/OS-II及系列产品是采用一次性的收费方式,应该只是大约相当于传统RTOS 的10-20% 的总体费用。
嵌入式 VxWorks C语言 ARM LED USB Linux 相关文章:
- 嵌入式系统的定义与发展历史(11-15)
- 嵌入式系统亲密接触(11-22)
- 嵌入式系统设计中的USB OTG方案(02-01)
- 嵌入式线控驾驶系统开发过程中设计和测试考虑(02-02)
- 一个典型的嵌入式系统设计和实现 (02-02)
- DDR SDRAM在嵌入式系统中的应用(02-07)