c-处理ARM芯片的保留寄存器位



我正在使用ARM Cortex M3的寄存器。在文档中,某些位可能被"保留"。我不清楚在寄存器上写入时应该如何处理这些保留位。

这些保留位甚至是可写的吗?我应该小心不要碰它们吗?如果我碰了它们,会发生什么不好的事情吗?

这是一个关于如何处理保留位的经典嵌入式世界问题!首先,您应该NOT随机写入,以免您的代码变得不可移植。当体系结构将来为保留位分配新的含义时会发生什么?你的代码会被破坏。因此,当处理具有保留位的寄存器时,最好的咒语是Read-Modify-Write。即读取寄存器内容,只修改您想要的位,然后写回值,使保留位不受影响(不受影响,并不意味着我们不写入它们,但从某种意义上说,我们以前写过)

例如,假设有一个寄存器,其中只有LSBit有意义,而所有其他寄存器都被保留。我会做这个

ldr r0,=memoryAddress
ldr r1,[r0]
orr r1,r1,#1
str r1,[r0]

如果文档中没有其他线索,请写一个零。您无法避免写入32位寄存器中分布的几个保留位。

理想情况下,您应该读修改写,不能保证成功,当您更改为具有不同位的较新芯片时,您无论如何都在更改代码。我见过供应商在启动芯片时,向保留位写入零失败,代码不得不被触摸。所以没有任何保证。最大的线索是,如果在供应商的代码中,您看到一个寄存器或集合被清楚地读取、修改、写入或只是写入。这可能是不同的开发人员编写示例的不同部分,或者外围设备中有一个寄存器是敏感的,有一个未记录的位,需要读-修改-写。

在我工作的芯片上,我确保以某种方式标记未记录(对客户)但不是未使用的位,以从其他未使用位中脱颖而出。我们通常将未使用/保留的位标记为零,这些其他位会得到一个名称,并且必须写入该值标记。并非所有供应商都这样做。

底线是不能保证,假设所有文档和示例程序都有错误,你必须通过破解来找出什么是对的,什么是错的。无论你走哪条路(读、修改、写、写零等),你都会不时出错,必须重新编写代码以匹配硬件更改。我强烈建议,如果供应商有某种芯片id,您的软件读取该id,如果该id是您尚未测试代码的id,则声明失败,不要对该部分进行编程。在生产测试中,早在客户看到产品之前,就会检测到零件变化,软件会参与了解零件变化的原因,解决方案是备用零件不兼容和被拒绝,或者软件发生变化等。

读取-修改-写入应该在大多数情况下都能工作,但是在某些情况下,读取时未定义保留位,但必须使用特定值写入。请参阅LPC2000小组的这篇文章(整个帖子也很有趣)。因此,请务必仔细检查文档,以及任何可用的勘误表。如果有疑问或文件不清楚,请立即写信给制造商。

大部分时间保留意味着它们不用于此芯片,但可能用于功能设备(其他产品线)。(大多数芯片制造商生产一个外围驱动程序,并将其用于所有芯片。这样一来,它主要是复制过去的工作,错误的变化较小)大多数时候,如果你写入外围寄存器中的保留位,这无关紧要,因为它没有任何逻辑。

如果你向它写一些东西,它可能不会被存储,下次你试图读取寄存器/位时,它会保持不变。

最新更新