This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

M4在IAR环境下移植ucosii问题

移植了cortex-m3的port,但是失败。移植了8962的官方demo版本也失败了,现象都是一启动新任务就进入faultisr()。

系统的中断能进入,通过iar的单步调试能看到进入了systick中断。

taskcreate这个任务能进入,但在这个任务里开启的taskled1,执行完OSTaskCreateExt()就进入faultISR()。

移植模板使用了论坛里JSW-Token发的LM4F_uCOSII_Jeansway.rar Keil版本的。

移植的port基本没有变,并将启动文件里中断相关的函数名进行了设置。

唉~~

有木有,解决办法啊~~

  • 不知道楼主用没用浮点?用了浮点的话这些移植都不能直接用。需要修改。

     

    如果没有用浮点,个人觉得两个可能性:

    1. 堆栈大小不足

    2. 移植的任务切换代码有问题。Keil和IAR的编译器是不一样的,需要针对IAR的做修改。

     

    我有一个CCS版本的移植,楼主可以拿去参考下.

    uCOSII_FPU.rar
  • 捷恩斯威移值带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 saved
    OSPendSV_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);
    }

  • 先谢谢楼上两位 了。

    我马上进行测试。

    稍后回复。

  • CCS版本的我也拿到了,没有用也不打算用,其实我没有奢望,只是想早点拿到IAR的PORTS,但是没有官网都下不到,全是M3的,什么9B96之类的一堆

  • 弱弱的问一些,有个问题:在APP.C中有定义:OS_EVENT  *MENU_ACK_Mbox;//菜单应答

    在APP_CFG.H中:extern OS_EVENT  *MENU_ACK_Mbox;//菜单应答

    ,在其他地方引用MENU_ACK_Mbox的时候会提示没有定义怎么回事啊?

    IAR中跑uC的时候不会有这种提示啊,头问题包含错了?

  • 你好,我同样碰到浮点问题,以前是M3 LM3S9B96用UCOS/II,程序都跑的好好的,现在全部切换到M4  TMC129ENCPDT(包括ucos),其他都正常,一到浮点运算的时候就有点混乱了,死机状态,开始不知道有浮点问题,困惑了好久,后来网上查了下,确认才知道M4有个浮点问题;我按照上面2位说的改了os_cpu_a.asm和os_cpu_c.c,但是一启动死机了,还不如以前,是什么情况?

  • 今天刚好遇到这个问题,安装这个修改后可以用,谢谢。