2013-04-28 7 views
0

STM32F100에 소프트웨어를 개발하기 위해 CooCox Coide를 시험하고있다.오류 : CoIDE에서 범위를 벗어남.

내가 CooCox RTOS (구구)를 추가 한 후 컴파일

, 나는 오류 메시지가 얻을 :이 많은 정보 아니라는 것을 알고

[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 

,하지만 내가 전에이 오류를 보지 못했다, 그래서 나는 아, 그리고 난 내가 -O1을 -O0의 최적화를 변경하면 오류가되고 있음을 발견 : 완전히 빈 :)

편집을 도와주세요

[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

그것을 발견!

나보다 더 똑똑한 사람이 설명 할 수는 있지만 어쨌든 링커 구성에서 "Enable LTO"상자를 선택 취소하여 해결했습니다.

프로젝트 -> 구성 -> 링크 탭 -> "LTO 사용"의 선택을 취소하십시오. 완료되었습니다.

다른 사람들에게 도움이되기를 바랍니다.

1

Oh, and i found out that if I change the optimization from -O0 to -O1 the error becomes: [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]'

firmware 오픈 core_cm3.c의 CMSIS 디렉토리로 이동하여 이러한 기능 변경 :

uint32_t의 __STREXB (uint8_t 값, uint8_t의 * 요지)

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 값, 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); 
} 

해결책의 출처는 herehere

관련 문제