新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2017-1-20
- 在线时间
- 4 小时
|
20金钱
移植的UCOSIII系统,只运行了一个点灯和一个串口的任务,没勾选Use MircoLib之前一切正常,勾选了Use MircoLib之后(除了勾选之外无任何改动)程序跑飞,进入硬件中断错误。
调试了下,跑飞位置位于OSStart()函数里的OSStartHighRdy(),之后进入硬件中断错误,说明在创建开始任务之后,正准备启动整个OS时卡死了
void OSStart (OS_ERR *p_err)
{
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return;
}
#endif
if (OSRunning == OS_STATE_OS_STOPPED) {
OSPrioHighRdy = OS_PrioGetHighest(); /* Find the highest priority */
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;
OSTCBCurPtr = OSTCBHighRdyPtr;
OSRunning = OS_STATE_OS_RUNNING;
OSStartHighRdy(); /* Execute target specific code to start task */
*p_err = OS_ERR_FATAL_RETURN; /* OSStart() is not supposed to return */
} else {
*p_err = OS_ERR_OS_RUNNING; /* OS is already running */
}
}
再具体一点到汇编里面应该是在这里:
721: OSStartHighRdy(); /* Execute target specific code to start task */
0x0800425C F007FD26 BL.W OSStartHighRdy (0x0800BCAC)
722: *p_err = OS_ERR_FATAL_RETURN; /* OSStart() is not supposed to return */
723: } else {
0x08004260 F6432099 MOVW r0,#0x3A99
0x08004264 8020 STRH r0,[r4,#0x00]
0x08004266 E002 B 0x0800426E
724: *p_err = OS_ERR_OS_RUNNING; /* OS is already running */
725: }
0x08004268 F645608A MOVW r0,#0x5E8A
0x0800426C 8020 STRH r0,[r4,#0x00]
进入到 OSStartHighRdy (0x0800BCAC)看看:
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
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, =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
网上查了很多,遇到这种情况的人比较少啊,没有什么很好的思路,自己也一直想不太明白,求助各位大大!
|
|