我想用宏或函数内联初始化const。
我会尝试
STATIC INLINE uint16_t calcul_checksum_soft_Appli()
{
uint16_t *l_adresse = (uint16_t*)0x00001000;
uint16_t l_checksum = 0;
for (l_checksum=0;(uint32_t)l_adresse<0x00007FFE;l_adresse+=2)
l_checksum+=*l_adresse;
l_checksum = ~l_checksum +1;
return (l_checksum);
}
const uint16_t Checksum __attribute__((at(ADR_CHECKSUM))) = calcul_checksum_soft_Appli();
==&gt;在常量表达式中不允许函数调用
或使用define
#define \
calcul_checksum_soft_Appli() \
({ \
uint16_t *l_adresse = (uint16_t*)0x00001000; \
uint16_t l_checksum = 0;\
for (l_checksum=0;(uint32_t)l_adresse<0x00007FFE;l_adresse+=2) \
l_checksum+=*l_adresse; \
l_checksum = ~l_checksum +1; \
l_checksum; \
})
==&gt;期望表达式
我想在我的ROM程序数据中创建校验和。
感谢的。
答案 0 :(得分:0)
不幸的是,您不能在C中执行此操作 - 它不支持编译时执行代码。充其量你可以编写一个没有循环或语句的宏。如果变量Checksum
是本地的,那么函数调用将会起作用。
然而,这是你问题中最不重要的。如果您访问这样的内存,则可能必须通过volatile限定指针来执行此操作。严格地说,你甚至不能对不是数组的东西进行指针运算。所有这些代码都是未定义的行为。
此外,由于隐式整数提升,~l_checksum
上的uint16_t
将在32位系统上中断。
你应该做的事情是
for(uintptr_t i=START; i<END; i+=2)
{
uint16_t data = *(volatile uint16_t*)i;
...
}