移植了cortex-m3的port,但是失败。移植了8962的官方demo版本也失败了,现象都是一启动新任务就进入faultisr()。
系统的中断能进入,通过iar的单步调试能看到进入了systick中断。
taskcreate这个任务能进入,但在这个任务里开启的taskled1,执行完OSTaskCreateExt()就进入faultISR()。
移植模板使用了论坛里JSW-Token发的LM4F_uCOSII_Jeansway.rar Keil版本的。
移植的port基本没有变,并将启动文件里中断相关的函数名进行了设置。
唉~~
有木有,解决办法啊~~
Richard Ma:
不知道楼主用没用浮点?用了浮点的话这些移植都不能直接用。需要修改。
如果没有用浮点,个人觉得两个可能性:
1. 堆栈大小不足
2. 移植的任务切换代码有问题。Keil和IAR的编译器是不一样的,需要针对IAR的做修改。
我有一个CCS版本的移植,楼主可以拿去参考下.
stone xiong:
回复 Richard Ma:
捷恩斯威移值带FPU的不给源码,不看V7M文档还是搞不出。Richard Ma的示例相当的nice!!!
晚上按示例整了个MDK的版本,开两个任务使用浮点计算cos(a) * cos(a) + sin(a) *sina(a) = 1正常。
有兴趣的可以试用一下,直接os_cpu_a.asm以及os_cpu.c以下部分即可
IAR的版本也差不多,照着改就是了。
OSPendSV CPSID I ; Prevent interruption during context switch MRS R0, PSP ; PSP is process stack pointer CBZ R0, OSPendSV_nosave ; Skip register save the first time SUB R0, R0, #0x20 ; Save remaining regs r4-11 on process stack STM R0, {R4-R11} SUB R0, R0, #0X40 VSTM R0, {D8-D15} LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP; LDR R1, [R1] STR R0, [R1] ; R0 is SP of process being switched out ; At this point, entire context of process has been savedOSPendSV_nosave PUSH {R14} ; Save LR exc_return value LDR R0, =OSTaskSwHook ; OSTaskSwHook(); BLX R0 POP {R14} LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy; LDR R1, =OSPrioHighRdy LDRB R2, [R1] STRB R2, [R0] LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy; LDR R1, =OSTCBHighRdy LDR R2, [R1] STR R2, [R0] LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr; VLDM R0, {D8-D15} ADD R0, R0, #0X40 LDM R0, {R4-R11} ADD R0, R0, #0X20 BIC.W LR, LR, #0x10 ; Set exception return uses floating-point state MSR PSP, R0 ; Load PSP with new process SP ORR LR, LR, #0x04 ; Ensure exception return uses process stack CPSIE I BX LR ; Exception return will restore remaining context
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt){ OS_STK *stk; unsigned int i; (void)opt; /* 'opt' is not used, prevent warning */ stk = ptos; /* Load stack pointer */ *(stk) = (INT32U)0xCCUL; *(–stk) = (INT32U)0xDDUL; for(i = 16u; i != 0; i–) { *(–stk) = (INT32U)0xAAAAAAAAUL; } /* Registers stacked as if auto-saved on exception */ *(–stk) = (INT32U)0x01000000uL; /* xPSR */ *(–stk) = (INT32U)task; /* Entry Point PC */ *(–stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will */ /* cause fault if ever used) */ *(–stk) = (INT32U)0x12121212uL; /* R12 */ *(–stk) = (INT32U)0x03030303uL; /* R3 */ *(–stk) = (INT32U)0x02020202uL; /* R2 */ *(–stk) = (INT32U)0x01010101uL; /* R1 */ *(–stk) = (INT32U)p_arg; /* R0 : argument */ /* Remaining registers saved on process stack */ *(–stk) = (INT32U)0x11111111uL; /* R11 */ *(–stk) = (INT32U)0x10101010uL; /* R10 */ *(–stk) = (INT32U)0x09090909uL; /* R9 */ *(–stk) = (INT32U)0x08080808uL; /* R8 */ *(–stk) = (INT32U)0x07070707uL; /* R7 */ *(–stk) = (INT32U)0x06060606uL; /* R6 */ *(–stk) = (INT32U)0x05050505uL; /* R5 */ *(–stk) = (INT32U)0x04040404uL; /* R4 */ for (i = 16u; i != 0; i–) /* Initialize general-purpose Floating point registers */ { *–stk = (INT32U)0xBBBBBBBBuL; /* S16-S31 */ } return (stk);}
lin yu:
回复 Jobs Zheng:
CCS版本的我也拿到了,没有用也不打算用,其实我没有奢望,只是想早点拿到IAR的PORTS,但是没有官网都下不到,全是M3的,什么9B96之类的一堆
lin yu:
回复 lin yu:
弱弱的问一些,有个问题:在APP.C中有定义:OS_EVENT *MENU_ACK_Mbox;//菜单应答
在APP_CFG.H中:extern OS_EVENT *MENU_ACK_Mbox;//菜单应答
,在其他地方引用MENU_ACK_Mbox的时候会提示没有定义怎么回事啊?
IAR中跑uC的时候不会有这种提示啊,头问题包含错了?
ding tao:
回复 Richard Ma:
你好,我同样碰到浮点问题,以前是M3 LM3S9B96用UCOS/II,程序都跑的好好的,现在全部切换到M4 TMC129ENCPDT(包括ucos),其他都正常,一到浮点运算的时候就有点混乱了,死机状态,开始不知道有浮点问题,困惑了好久,后来网上查了下,确认才知道M4有个浮点问题;我按照上面2位说的改了os_cpu_a.asm和os_cpu_c.c,但是一启动死机了,还不如以前,是什么情况?
charles yang:
回复 stone xiong:
今天刚好遇到这个问题,安装这个修改后可以用,谢谢。