初步成功移植了uCOS II 2.92在nuvoton M051上,之后接着按照《嵌入式实时操作系统UCOS-II》上的测试步骤,验证uCOS是否完全移植成功。但接下来的验证过程中的遇到的问题挺难办的:
1、单步跟踪调试跑到OSStart() --- OSStartHighRdy() 下面的OSStartHang语句跑不出去了,但全速运行时可以出去的,迷茫!
是程序问题呢,还是keil软件问题呢,或者nuvoton调试器问题?根据书上13.06.02节描述的,和我个人理解,OSStartHang前面的语句已经触发了PendSV中断,且CPSIE I 开了中断,本应该跳去执行PendSV中断的(PendSV中断入口、函数等是正确的),怎么会跑到OSStartHang里面呢?若此时不用单步运行,改用全速运行,则是跑出来的,且正常运行了。
百度下,也有遇到类似问题的,例如:移植UCOS,遇到B OSStartHang的问题及其解决方法 对于这个说法,我看了下代码,不是这个他说的那个原因导致的!对于ucosii移植问题请大家帮忙。。。的说法,我也有些怀疑,就如前面所说,“OSStartHang前面的语句已经触发了PendSV中断,且CPSIE I 开了中断,本应该跳去执行PendSV中断的”,难道我理解出错了???或者中断不会立即触发?需要等待?那要等待多久呢?继续努力...
(15:30)根据上面的思路,当其进入OSStartHang时,我用“运行到光标处”命令,则会运行到OS_CPU_PendSVHandler,此时接着跑下去就到了main里面AppTaskStart中了,这是正常正确的运行结果!若把AppTaskStart任务去掉,则第一个运行的应该是Idle任务了!随便说下,调试时,keil 4窗口下面的DEBUG时间一直都是0,没起到作用。到现在,可以初步猜测:单步跟踪跑到OSStartHang跟不下去,可能是PendSV中断不会立即触发的原因导致的!或许哪天我无聊,可以试试一直按单步命令直到他跑出来!但现在我试了按百多次还是没有出来的!
(16:00)继续浏览,对比了在IAR下编辑的ucos程序可以正常的单步调试吗?正常复位运行没有问题中的类似现象及二楼所描述的,或许nuvoton能帮上忙,找时间请教请教这个问题!
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STR R1, [R0] ; Not storing entire byte with STRB to avoid error
MOVS R0, #0 ; Set the PSP to 0 for initial context switch call
MSR PSP, R0
LDR R0, =OS_CPU_ExceptStkBase ; Initialize the MSP to the OS_CPU_ExceptStkBase
LDR R1, [R0]
MSR MSP, R1
LDR R0, =OSRunning ; OSRunning = TRUE
MOVS R1, #1
STRB R1, [R0]
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
CPSIE I ; Enable interrupts at processor level
OSStartHang
B OSStartHang ; Should never get here
2、前天那个工程,编译后的信息如下
Program Size: Code=6868 RO-data=628 RW-data=108 ZI-data=3876
估算下,RW+ZI就接近4k了,M051的RAM也快用完了,再加个任务就可能跑飞了。so应用时,需要通过os_cfg.h对uCOS进行优化下,以节省空间!
|