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

08-16 20:07