Инициализация const с встроенной функцией c
Я хотел бы инициализировать 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();
==> вызов функции не допускается в константном выражении
или с определением
#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; \
})
==> ожидал выражения
Я хотел бы создать в моем ROM данные программы, контрольную сумму.
Спасибо.
1 ответ
К сожалению, вы не можете сделать это в C - он не поддерживает выполнение кода во время компиляции. В лучшем случае вы могли бы написать макрос без циклов или операторов. Если переменная Checksum
делается локальным, хотя вызов функции будет работать.
Однако это наименьшая из ваших проблем. Если вы обращаетесь к памяти, как это, вам, возможно, придется делать это через изменчивые квалифицированные указатели. Строго говоря, вы не можете даже сделать арифметику указателей для вещей, которые не являются массивами. Весь этот код является неопределенным поведением.
Также, ~l_checksum
на uint16_t
сломается в 32-битной системе из-за неявного целочисленного продвижения.
Что вы, вероятно, должны сделать вместо этого что-то вроде
for(uintptr_t i=START; i<END; i+=2)
{
uint16_t data = *(volatile uint16_t*)i;
...
}