我最近被编制与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 , 机器人 , 软件 。 |