最近闲来无事将UCOS-III跑在STM32F407上试试,从Micrium官网上下载了最新的移植工程。 发现官网上的UCOS-III也是不带FPU的,看来只能自己动手了。
移植UCOS-III不多说,其实就是把官网提供的移植搬到我们自己的工程上,接着研究FPU。 首先根据Cortex-M4的描述,FPU有32个32位的单精度寄存器S0-S31,也可以组成16个64位的双精度寄存器D0-D15。 当使能FPU的时候,中断入栈如下,其中: 第一个不知道是啥,没有名字,第二个是FPU的状态控制寄存器,后面是S15到S0,接下来才是和M3一样的入栈。如果没有使能FPU,那么入栈也和M3一样。这也就是为什么当没有使用FPU的时候,M3移植的UCOS直接拿过来就能用的原因。 根据这些说明,移植的地方主要就是要在入栈出栈的时候考虑到FPU就可以了。 因此需要改的地方也就两处,一个是OSTaskStkInit函数,另一个是PendSVHandler,具体的代码我就不贴了,大家可以下载我的工程,只要思路清晰了代码都是浮云。 果然经过修改后,代码能成功运行,另外为了验证,我在例子工程中特意加入了TestA和TestB两个任务,TestA主要是用FPU来运算,TestB主要的任务时捣乱,把TestA正在运行的FPU弄乱。经过编译调试,TestA的确是使用FPU运算的,TestB也的确是搅乱了FPU,但是TestA却能得到正确的值,说明移植的Context保存和还原还是正常的。
下载及原文: http://www.eamonning.com/blog/view/418 |