从 16 位硬件寄存器读取

2024-01-10

在嵌入式系统上,我们有一个设置,允许我们通过命令行界面读取任意数据以用于诊断目的。对于大多数数据,这工作得很好,我们使用memcpy()将数据复制到请求的地址并通过串行连接将其发送回。

然而,对于 16 位硬件寄存器,memcpy()导致一些问题。如果我尝试使用两个 8 位访问来访问 16 位硬件寄存器,则无法正确读取高位字节。

有人遇到过这个问题吗?我是一个“高级”(C#/Java/Python/Ruby)人员,正在向硬件靠拢,而这是陌生的领域。

处理这个问题的最佳方法是什么?我看到一些信息,特别是[对我来说]有点令人困惑的帖子here http://dragonsgate.net/pipermail/icc-430/2007-February/000682.html。这篇文章的作者有exactly我也遇到同样的问题,但我讨厌在没有完全理解我在做什么的情况下实施解决方案。

非常感谢您能就这个问题提供任何线索。谢谢!


除了什么艾迪说 https://stackoverflow.com/questions/655029/reading-from-16-bit-hardware-registers/655071#655071,您通常需要使用易失性指针来读取硬件寄存器(假设是内存映射寄存器,并非所有系统都是如此,但听起来对您的系统来说是这样)。就像是:

// using types from stdint.h to ensure particular size values
// most systems that access hardware registers will have typedefs
// for something similar (for 16-bit values might be uint16_t, INT16U,
// or something)

uint16_t volatile* pReg = (int16_t volatile*) 0x1234abcd;  // whatever the reg address is

uint16_t val = *pReg;  // read the 16-bit wide register

以下是 Dan Saks 撰写的一系列文章,其中应该为您提供了在 C/C++ 中有效使用内存映射寄存器所需了解的几乎所有信息:

  • 《映射记忆》 http://www.embedded.com/columns/programmingpointers/26807176
  • “有效映射内存” http://www.embedded.com/columns/programmingpointers/50900224
  • “映射内存的更多方法” http://www.embedded.com/columns/programmingpointers/55301821
  • “调整设备寄存器的大小和对齐” http://www.embedded.com/columns/programmingpointers/160502362

  • “明智地使用挥发性” http://www.embedded.com/columns/programmingpointers/170701302

  • “准确放置挥发物” http://www.embedded.com/columns/programmingpointers/174300478
  • “像承诺一样不稳定” http://www.embedded.com/columns/programmingpointers/175801310
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 16 位硬件寄存器读取 的相关文章

随机推荐