打印
[PIC®/AVR®/dsPIC®产品]

高低位寄存器的读取注意事项

[复制链接]
359|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位的

使用特权

评论回复
5
g0d5xs| | 2024-3-27 13:32 | 只看该作者
在读取高低位寄存器时,需要确保对齐。有些处理器要求对齐读取,即高低位寄存器的读取需要按照一定的对齐规则进行,否则可能会导致错误或性能下降

使用特权

评论回复
6
w2nme1ai7| | 2024-3-27 14:38 | 只看该作者
在多线程或并发环境中,如果对高低位寄存器进行读取和写入操作,需要确保这些操作的原子性,以避免出现竞态条件和不一致的情况

使用特权

评论回复
7
ex7s4| | 2024-3-27 15:42 | 只看该作者
在一些处理器架构中,高低位寄存器的排列顺序可能是大端序(高位在前)或小端序(低位在前)

使用特权

评论回复
8
lamanius| | 2024-3-27 17:02 | 只看该作者
在读取高低位寄存器时,需要根据处理器的端序规则来正确解释和处理数据

使用特权

评论回复
9
tax2r6c| | 2024-3-27 18:11 | 只看该作者
在某些情况下,需要在读取高低位寄存器之前先将其清零,以确保读取的数值是正确的

使用特权

评论回复
10
l1uyn9b| | 2024-3-28 08:20 | 只看该作者
在读取高低位寄存器时,需要确保读取的数据是完整的,没有发生截断或溢出。这可能涉及到数据类型的转换和扩展操作

使用特权

评论回复
11
liu96jp| | 2024-3-28 10:09 | 只看该作者
读取高低位寄存器需要注意对齐、原子性、端序、清零和数据完整性等方面的问题,以确保读取的数据是正确的并且符合预期

使用特权

评论回复
12
cen9ce| | 2024-3-28 12:01 | 只看该作者
一般读取都是要注意时序的,不然读取的数据可能是不对的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

906

帖子

1

粉丝