Problemas do crosstoolchain gcc arm com CPUs Cortex-M0

Publicado: 18 jun 2014 em Tech
Tags:, , , ,

english

Durante os desenvolvimentos para a placa FRDM-KL25Z usando minha própria compilação de um crosstoolchain gcc, eu notei um comportamento estranho quando meu código usa operações de divisão (/) e módulo (%) em números inteiros.

Meu crostoolchain arm-none-eabi é baseado em binutils 2.24, gcc 4.8.2 e newlib 2.1.0. Ao executar operações de / ou %, a execução trava numa das chamadas AEABI runtime ____aeabi_[u]idiv[mod]_from_thumb(). Segue um backtrace gdb de uma tentativa de %:

(gdb) bt
#0  Cpu_Interrupt () at Generated_Code/Cpu.c:85
#1  <signal handler called>
#2  0x0000236c in ____aeabi_uidivmod_from_thumb ()
#3  0x000021aa in LEDTimer_OnInterrupt (UserDataPtr=0x0 <__vect_table>) at Sources/Events.c:80
#4  0x00001f98 in TU1_OnCounterRestart (UserDataPtr=0x0 <__vect_table>) at Generated_Code/LEDTimer.c:149
#5  0x00002126 in TU1_Interrupt () at Generated_Code/TU1.c:185
#6  <signal handler called>
#7  main () at Sources/ProcessorExpert.c:66

Esse comportamento persiste mesmo quando o código é compilado com opções próprias para Cortex-M0 tais como -mcpu=cortex-m0 -mthumb -mfloat-abi=soft.

Foi reportado que o gcc está gerando opcodes errados para CPU Cortex-M0 na fase de link para essas chamadas aeabi. Uma solução alternativa é linkar o código com uma biblioteca externa compatível com Cortex-M0 como a libaeabi-cortexm0 escrita por Jörg Mische.

Ao usar a libaeabi-cortexm0 num projeto do Processor Expert para a FRDM-KL25Z em Linux, compile a biblioteca sem crt.S de forma a evitar símbolos duplicados na fase de link.

Eu atualizei minha aplicação de led piscante para utilizar uma operação de % em LEDTimer_OnInterrupt(), e também linkar com a libaeabi-cortexm0: frdm-kl25z-blink3-1.1.tar.gz. Para detalhes sobre como construir essa aplicação no sistema operacional Gentoo Linux, veja Desenvolvendo em Linux para FRDM-KL25Z.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s