Recentemente, fui compilar algum código Arduino com NewSoftSerial e foi atropelado por "Erro: registro R24, R26, R28 ou R30 necessária" infame erro. NewSoftSerial é uma grande biblioteca e aqueles que utilizam mais velho compilador avr-gcc apreciá-lo muito. O problema é que o novo gcc não gosta de um erro desagradável no código e aqui é como corrigi-lo ...
O problema surge no método NewSoftSerial :: tunedDelay escrito em linguagem assembly. Se você não tem muita experiência com asm este método parece um pouco enigmática. Ela consiste basicamente de única chamada "asm volátil" que recebe de um a quatro parâmetros, separados por semicolomn. O primeiro parâmetro é o código de montagem em si. Ele pode incluir múltiplas referências aos outros três partes sob a forma de ID%. Os segundo e terceiro parâmetros são a entrada e de saída params para o código asm. Vamos saltar a quarta parte em que não é usado neste método tunedDelay defeituoso. Vamos dar uma olhada no segundo parâmetro da chamada asm: : "+r" (delay), "+a" (tmp) A primeira mágica "+ r" (atraso) significa que todos os 0% (ou seja, o parâmetro # 0) no código asm será substituído com o "atraso" variável a partir do código C. "+" Significa que é leitura e escrita parâmetro. "R" é uma "classe restrição" - a causa da incapacidade NewSoftSerial para compilar. O problema é que o código asm está prestes a fazer determinadas operações com o atraso e estas operações exigem registos apenas particulares a serem utilizados. O conjunto de registos permitidos para uma operação é definida pela classe de restrição. Se você olhar o código asm você verá operação "% sbiw 0, 0 × 01". De acordo com a documentação esta operação requer primeiro argumento de restrição de classe "w", enquanto o código NewSoftSerial especifica classe "r". Parece que os compiladores antigos não eram espertos o suficiente para descobrir este problema, enquanto novos AVR-gccs são mais cuidadosos. Assim, a fim de corrigir o código e compilá-la com os novos compiladores que você precisa para substituir os argumentos Spec para o seguinte: : "+w" (delay), "+a" (tmp) Após este NewSoftSerial pequeno trecho torna-se compilável com os novos compiladores. Este post foi publicado em Hardware , Linux , Robótica , Software . |