IAR5401编译这个为什么会错误呢?以前用IAR520是无问题的

发布: 2010-1-29 21:59 | 作者: abs123 | 来源: StmFans思蜕盟 OPELC 自由电子联盟

OS_CPU_PendSVHandler
    CPSID   I                                                   ;// 任务context切换是关闭中断
    MRS     R0, PSP                                             ;// 获取PSP
    CBZ     R0, OS_CPU_PendSVHandler_nosave                     ;// 在多任务初始化时,PSP被初始化为0
                                                                ;// PSP如果是0,标示任务没有运行过,那么不需要压栈
                                                                ;// 直接加载任务context
    SUBS    R0, R0, #0x20                                       ;// 调整PSP指针, R4-R11 共32字节
    STM     R0, {R4-R11}                                        ;// 压栈R4-R11, 其他8个寄存器是在异常时自动压栈的

    LDR     R1, =OSTCBCur                                       ;// 获取OSTCBCur->OSTCBStkPtr
    LDR     R1, [R1]
    STR     R0, [R1]                                            ;// 将当前任务的堆栈保存到自己的任务控制块
                                                                ;// OSTCBCur->OSTCBStkPtr = PSP
                                                                ;// 程序运行此位置,已经保存了当前任务的context了
OS_CPU_PendSVHandler_nosave
    ;// 使能OSTaskSwHook的时候去掉注释
    ;//PUSH    {R14}
    ;//LDR     R0, =OSTaskSwHook
    ;//BLX     R0
    ;//POP     {R14}

                                                                ;// 在调度之前,系统内核已经计算好
                                                                ;// OSPrioHighRdy 和 OSTCBHighRdy
    LDR     R0, =OSPrioCur                                      ;// 当前任务优先级 = 就绪任务优先级
    LDR     R1, =OSPrioHighRdy                                  ;// OSPrioCur = OSPrioHighRdy;
    LDRB    R2, [R1]
    STRB    R2, [R0]


下面是IAR5401的错误信息

Building configuration: STM32 - Flash  
Updating build tree...  
os_cpu_a.asm  
Error[412]: Branch to unaligned address C:\ucos\IAR_STM32_uCOS-II+V2.86\IAR_STM32\uCOS-II\Ports\os_cpu_a.asm 254  
Error while running Assembler  
  
Total number of errors: 1  
Total number of warnings: 0
binglin (2010-1-29 22:41:37)
应是字节没对齐引起的,加入红色字的这句代码试试:"THUMB"

OS_CPU_PendSVHandler
    CPSID   I                                                   ;// 任务context切换是关闭中断
    MRS     R0, PSP                                             ;// 获取PSP
    CBZ     R0, OS_CPU_PendSVHandler_nosave                     ;// 在多任务初始化时,PSP被初始化为0
                                                                ;// PSP如果是0,标示任务没有运行过,那么不需要压栈
                                                                ;// 直接加载任务context
    SUBS    R0, R0, #0x20                                       ;// 调整PSP指针, R4-R11 共32字节
    STM     R0, {R4-R11}                                        ;// 压栈R4-R11, 其他8个寄存器是在异常时自动压栈的

    LDR     R1, =OSTCBCur                                       ;// 获取OSTCBCur->OSTCBStkPtr
    LDR     R1, [R1]
    STR     R0, [R1]                                            ;// 将当前任务的堆栈保存到自己的任务控制块
                                                                ;// OSTCBCur->OSTCBStkPtr = PSP
                                                                ;// 程序运行此位置,已经保存了当前任务的context了

THUMB                ; 在此加入这行试试

OS_CPU_PendSVHandler_nosave
    ;// 使能OSTaskSwHook的时候去掉注释
    ;//PUSH    {R14}
    ;//LDR     R0, =OSTaskSwHook
    ;//BLX     R0
    ;//POP     {R14}

                                                                ;// 在调度之前,系统内核已经计算好
                                                                ;// OSPrioHighRdy 和 OSTCBHighRdy
    LDR     R0, =OSPrioCur                                      ;// 当前任务优先级 = 就绪任务优先级
    LDR     R1, =OSPrioHighRdy                                  ;// OSPrioCur = OSPrioHighRdy;
    LDRB    R2, [R1]
    STRB    R2, [R0]
binglin (2010-1-29 22:43:18)
另外:必要时可以在出错行前加入“NOP"试试。