我在嵌入式软件项目中使用了以下C函数。它还用于验证硬件而非生产中。
void reg_read(int addr) {
int result;
int* reg_addr = (int*)(addr); // I cast the value of the addr variable to the reg_addr pointer hoping that it would point to the address stored in addr
result = (*reg_addr); // this should trigger a read transaction on the AXI interface of the ARM CPU that I'm simulating
}
// later on...in the main function
reg_read(0x08000704);
嵌入式软件在模拟环境中运行(使用QEMU + SystemC),我可以看到AXI读取事务是否发生。在这种情况下,它不会发生。
但是,如果我为指针int* reg_addr = (int*)0x08000704;
分配一个常量值,那么就会发生AXI事务。
我假设编译器在每种情况下都会生成不同的指令。我还尝试将reg_addr声明为volatile int* reg_addr;
,但它也没有用。
是否有一种可移植且兼容的方式将int变量的值转换为int指针?
答案 0 :(得分:0)
您的问题是:
是否存在一种可移植且兼容的方法来转换int的值 变量为int指针?
没有。总结一下:
将整数转换为指针是由实现定义的-Antti Haapala
有人建议您使用uintptr_t或类似的字体,这是Eugene Sh的很好建议。
以uintptr_t为例
SELECT t1.A, t2.B, COALESCE(t3.C, 'c0') AS C
FROM (SELECT DISTINCT A
FROM Table1) t1
CROSS JOIN Table2 t2
LEFT JOIN Table1 t3 ON t3.A = t1.A AND t3.B = t2.B
从Microsoft Visual C ++头文件vadefs.h的vadefs.h文件中定义为:
a b c
a1 b1 c1
a1 b2 c2
a1 b3 c0
a1 b4 c0
a2 b1 c3
a2 b3 c0
a2 b2 c0
a2 b4 c0
以这种方式,如果为x86编译,它将解析为32位数据类型,而对于x64,则解析为64位数据类型。