搜索

作者简历和生物 情侣我的爱好有关的文章 - 机器人
我关于移民澳洲的印象。在俄罗斯只。 为解决日常问题的食谱
Linux相关的职位 Windows相关的职位
与软件相关的职位 很多有关硬件信息
不同的工具,你可能会发现有用 关于各种Web技术的文章
一切不符合其余的菜单 RSS订阅本博客

标签云

档案

链接

安德烈Mikhalchuk的博客

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

Technoblog对生活

06月19日,二零一零年FIX:错误:寄存器R24,R26,R28或R30需要

我最近被编制与NewSoftSerial的一些Arduino的代码,并遭受了臭名昭著的“错误:寄存器R24,R26,R28或R30所需的”错误。 NewSoftSerial是一个伟大的图书馆和那些使用旧的AVR-GCC编译器享受它alot。 问题是新的gcc不喜欢一个讨厌的错误代码,在这里是如何解决它...


问题出现在美国方法NewSoftSerial ::在汇编语言编写的tunedDelay。 如果你没有太多的经验与asm这种方法看起来有点神秘。 它基本上是由单一呼叫“ASM挥发”,得到了一至四个参数semicolomn分离。 第一个参数是汇编代码本身。 它可以包含多个引用%ID的形式在其他三个部分。 第二个和第三个参数是汇编代码的输入和输出的params。 让我们跳过第四部分,因为它是不使用这种故障tunedDelay方法。
让我们来看看在ASM调用的第二个参数:
: "+r" (delay), "+a" (tmp)
神奇的“+ R”(延迟)是指在汇编代码0%(即参数#0),将与“延迟”从C代码中的变量替换。 “+”表示它是读写参数。 “R”是一个“类约束” - 的NewSoftSerial无法编译的原因。 问题是,汇编代码是作出一定的延迟,这些行动的要求,只有特定的寄存器用于操作。 允许操作的寄存器集定义约束类。 如果你在汇编代码,您将看到操作“sbiw 0%,0×01”。 根据该文件,此操作需要限制类“W”的第一个参数,而NewSoftSerial代码指定类“R”。 它看起来像旧的编译器不够聪明,要弄清楚这个问题,而新的AVR-GCCS更加小心。
因此,为了解决代码和编译新的编译器,你需要替换的参数规格如下:
: "+w" (delay), "+a" (tmp)
经过这个小的补丁NewSoftSerial成为新的编译器编译。

这篇文章发表在硬件 的Linux机器人软件

没有评论

到目前为止没有评论

发表评论

网站地图 (三)2005-2008年安德烈Mikhalchuk