我正在尝试使用CooCox CoIDE为STM32F100开发软件。
当我在添加CooCox RTOS(CoOS)后编译时,收到错误消息:
[cc] Starting link
[cc] arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -g -nostartfiles -flto -Wl,-Map=OS_Test.map -O0 -Wl,--gc-sections -Wl,--entry=main -LC:\CooCox\CoIDE\configuration\ProgramData\OS_Test -Wl,-TC:\CooCox\CoIDE\configuration\ProgramData\OS_Test/arm-gcc-link.ld -g -o OS_Test.elf ..\obj\kernelHeap.o ..\obj\core.o ..\obj\startup_stm32f10x_md_vl.o ..\obj\core_cm3.o ..\obj\timer.o ..\obj\utility.o ..\obj\system_stm32f10x.o ..\obj\task.o ..\obj\serviceReq.o ..\obj\main.o ..\obj\mbox.o ..\obj\mm.o ..\obj\time.o ..\obj\event.o ..\obj\syscalls.o ..\obj\port.o ..\obj\queue.o ..\obj\mutex.o ..\obj\flag.o ..\obj\arch.o ..\obj\sem.o ..\obj\hook.o
[cc] C:\Users\Jonas\AppData\Local\Temp\cccpkRF6.s: Assembler messages:
[cc] C:\Users\Jonas\AppData\Local\Temp\cccpkRF6.s:240: Error: offset out of range
[cc] C:\Users\Jonas\AppData\Local\Temp\cccpkRF6.s:241: Error: offset out of range
我知道这个信息不多,但我之前没有看过这个错误,所以我完全是空白,请帮助:)
编辑:哦,我发现如果我将优化从-O0更改为-O1,则错误变为:
[cc] ccKXT9LB.s:1163: Error: registers may not be the same -- `strexb r0,r0,[r1]'
[cc] ccKXT9LB.s:1188: Error: registers may not be the same -- `strexh r0,r0,[r1]'
答案 0 :(得分:1)
哦,我发现如果我从-O0更改优化 到-O1错误变为:[cc] ccKXT9LB.s:1163:错误:寄存器 可能不一样 -
strexb r0,r0,[r1]' [cc] ccKXT9LB.s:1188: Error: registers may not be the same --
strexh r0,r0,[r1]'
转到firmware的cmsis目录,打开core_cm3.c并更改这些功能:
uint32_t __STREXB(uint8_t value,uint8_t * addr)
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value));
return(result);
}
uint32_t __STREXH(uint16_t value,uint16_t * addr)
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value));
return(result);
}
答案 1 :(得分:0)
发现它!
比我更聪明的人可能会解释它,但无论如何我通过取消选中链接器配置下的“启用LTO”框来修复它。
右键点击项目 - >配置 - >链接标签 - >取消选中“启用LTO”。完成..
我希望这会对别人有所帮助。