[PIC®/AVR®/dsPIC®产品] 高低位寄存器的读取注意事项

[复制链接]
2612|12
 楼主| 21mengnan 发表于 2024-3-12 19:53 | 显示全部楼层 |阅读模式
与 PIC18 关联的一些 SFR 可以通过组合来构成多字节值,例如,TMRxH 和 TMRxL 寄存器可以组合构成 16 位定时器计数值。根据器件和工作模式,可能会存在以某些特定方式读取这些寄存器的硬件要求,例如通常必须先读取 TMRxL 寄存器,然后再尝试读取 TMRxH 寄存器,才能获取有效的 16 位结果。
所以遇到这个情况一定要先读取低8位,再读取高8位,你知道这是为什么吗?
我猜啊,应该是这个寄存器变量一直在更新,如果你先读取高八位,在读取的这个过程中低八位已经更新了,不能读取到精准的当时的那个值了。

 楼主| 21mengnan 发表于 2024-3-12 19:53 | 显示全部楼层
大家说说还有没有别的可能。
 楼主| 21mengnan 发表于 2024-3-12 19:54 | 显示全部楼层
虽然可以定义一个字长的 C 变量来映射到此类寄存器 (即, int 变量 TMRx 映射到
TMRxL 和 TMRxH),编译器读取此类对象中字节的顺序会因表达式而不同。一些表达
式要求先读取高字节 (MSB);其他一些则先读取低字节 (LSB)。
建议使用芯片头文件中现有的 SFR 定义。SFR 的每个字节应按器件数据手册中要求的顺序直接访问。这可以产生更高的可移植性。
以下代码会将两个定时器寄存器复制到无符号的 C 变量 count,供以后使用。
count = TMR0L;
count += TMR0H << 8;
此外,还提供了一些宏来执行更常用定时器寄存器的读取和写入。
t1ngus4 发表于 2024-3-27 12:24 | 显示全部楼层
在处理器架构中,有些寄存器是由高低位组成的,例如在ARM架构中的32位寄存器可以分为高低16位的
g0d5xs 发表于 2024-3-27 13:32 | 显示全部楼层
在读取高低位寄存器时,需要确保对齐。有些处理器要求对齐读取,即高低位寄存器的读取需要按照一定的对齐规则进行,否则可能会导致错误或性能下降
w2nme1ai7 发表于 2024-3-27 14:38 | 显示全部楼层
在多线程或并发环境中,如果对高低位寄存器进行读取和写入操作,需要确保这些操作的原子性,以避免出现竞态条件和不一致的情况
ex7s4 发表于 2024-3-27 15:42 | 显示全部楼层
在一些处理器架构中,高低位寄存器的排列顺序可能是大端序(高位在前)或小端序(低位在前)
lamanius 发表于 2024-3-27 17:02 | 显示全部楼层
在读取高低位寄存器时,需要根据处理器的端序规则来正确解释和处理数据
tax2r6c 发表于 2024-3-27 18:11 | 显示全部楼层
在某些情况下,需要在读取高低位寄存器之前先将其清零,以确保读取的数值是正确的
l1uyn9b 发表于 2024-3-28 08:20 | 显示全部楼层
在读取高低位寄存器时,需要确保读取的数据是完整的,没有发生截断或溢出。这可能涉及到数据类型的转换和扩展操作
liu96jp 发表于 2024-3-28 10:09 | 显示全部楼层
读取高低位寄存器需要注意对齐、原子性、端序、清零和数据完整性等方面的问题,以确保读取的数据是正确的并且符合预期
cen9ce 发表于 2024-3-28 12:01 | 显示全部楼层
一般读取都是要注意时序的,不然读取的数据可能是不对的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

1151

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部