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
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

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]