gcc 允许使用 section 属性控制放置变量的部分:
struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
有没有办法在我的 C 代码中指定此部分在物理内存中的确切位置?我假设不存在虚拟内存,或者虚拟地址直接转换为物理地址。
我知道我可以通过传递给链接器的脚本来处理它,但如果我可以直接在我的(自动生成的)C 中指定它会更好。
最佳答案
你可以通过使用宏实现变量在某个物理地址的效果,例如:
#define a (*(volatile struct duart *)0xdeadbeef)
这不使用链接器;它没有声明任何变量,因此您不会在目标文件中看到 a
。但我猜你不需要这个。
注意 volatile
关键字,在使用内存映射硬件时总是需要它。它通常可以在没有 volatile
的情况下工作,但有时它不会,并且调试此类故障很困难 - 所以不要忘记 volatile
关键字!
用法:
// I assume the duart structure has fields write_buf and read_buf of type uint8_t
a.write_buf = 0x55; // write data to DUART
a.write_buf = 0xaa; // write more data to DUART
uint8_t byte1 = a.read_buf; // read data from DUART
uint8_t byte2 = a.read_buf; // read more data from DUART
关于c - 如何在物理内存中指定变量位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5540863/