Dobrý den.
Zkusil jsem prostředí Code::Blocks pro ARM a mám problém s kompilací programu. Program je funkční v prostředí Keil(funguje i po nahrání do uProc.), ale v CB mi skončí s touto chybou:
arm-none-eabi-gcc.exe -mthumb -mno-thumb-interwork -mthumb-interwork -msoft-float -mlittle-endian -O -pedantic -W -Wall -g -mcpu=cortex-m3 -ffunction-sections -fsigned-char -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD -mthumb -Wall -g -I..\inc -I..\..\Library\CMSIS\CM3\CoreSupport -I..\..\Library\STM32F10x_StdPeriph_Driver\inc -Iinc -c ..\..\Library\CMSIS\CM3\CoreSupport\core_cm3.c -o obj\Debug\Library\CMSIS\CM3\CoreSupport\core_cm3.o
C:\DOCUME~1\Patrik\LOCALS~1\Temp\ccgZyxyd.s: Assembler messages:
C:\DOCUME~1\Patrik\LOCALS~1\Temp\ccgZyxyd.s:508: Error: registers may not be the same -- `strexb r0,r0,[r1]'
C:\DOCUME~1\Patrik\LOCALS~1\Temp\ccgZyxyd.s:533: Error: registers may not be the same -- `strexh r0,r0,[r1]'
Process terminated with status 1 (0 minutes, 2 seconds)
2 errors, 0 warnings (0 minutes, 2 seconds)
Našel jsem něco o úpravě knihovny CM3:
register uint32_t result asm (“r2”);
To solve this problem with ARM cortex m3 I changed the supplied CMSIS file
core_cm3.c
I'm now using:
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
//uint32_t result=0;
register uint32_t result asm ("r2");
__ASM volatile ("strexh %0, %2, %1]" : "=r" (result) : "r" (addr), "r"
(value) );
return(result);
}
...
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
//uint32_t result=0;
register uint32_t result asm ("r2");
__ASM volatile ("strexb %0, %2, %1]" : "=r" (result) : "r" (addr), "r"
(value) );
return(result);
}
instead of:
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);
}
...
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);
Bohužel po této úpravě se sice program přeloží bez chyb, ale po nahrání do uProcesoru nefunguje.
Jinak v KEIlu jsem už vyzkoušel připojení LCD, I2C RAM, DS18B20, klávesničku 4x4, a vše funguje bez problémů. Jen vzhledem k omezení kódu jsem chtěl přejít na Code::Bloks a nějak se mi nedaří.
Děkuji za jakoukoliv pomoc.
Zkoušel jsem to na modulu miniSTM32F103RB, s ARM začínám tak mě prosím hned nebijte celý projekt zde:
LED_Blik.zip (337 KB)