Pesquisar

Currículo e bio do autor Casal de artigos relacionados com o meu hobby - robótica
Minhas impressões sobre a imigração para a Austrália. Em russo apenas. Receitas para resolver problemas cotidianos
Linux lugares ligados Windows lugares ligados
Software lugares ligados Um monte de informações sobre hardware
Diferentes ferramentas podem ser úteis Mensagens sobre tecnologias web vários
Tudo o que não se encaixa no resto do menu RSS feed para este blog

Tag Cloud

Arquivo

Links

Blog do Andrey Mikhalchuk

English flagItalian flagKorean flagChinese (Simplified) flagPortuguese flagGerman flagFrench flagSpanish flagJapanese flagRussian flagDanish flagFinnish flagHebrew flag

Technoblog sobre a vida

19 de junho de 2010 Fix: Error: registo R24, R26, R28 ou R30 necessário

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 .

Sem comentários

Nenhum comentário até o momento

Deixe uma resposta

Mapa do Site (C) Andrey Mikhalchuk, 2005-2008