инициализация const с встроенной функцией c - PullRequest
0 голосов
/ 08 июня 2018

я хотел бы инициализировать 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

#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;  \
})

==> ожидалось выражение

Я хотел бы создать в моей программе данные ПЗУ, контрольную сумму.

благодарности.

1 Ответ

0 голосов
/ 08 июня 2018

К сожалению, вы не можете сделать это в C - он не поддерживает выполнение кода во время компиляции.В лучшем случае вы могли бы написать макрос без циклов или операторов.Если переменная Checksum сделана локальной, то вызов функции будет работать.

Однако это наименьшая из ваших проблем.Если вы обращаетесь к памяти, как это, вам, возможно, придется делать это через изменчивые квалифицированные указатели.Строго говоря, вы не можете даже сделать арифметику указателей для вещей, которые не являются массивами.Весь этот код является неопределенным поведением.

Кроме того, ~l_checksum в uint16_t сломается в 32-битной системе из-за неявного целочисленного продвижения.

Что вы, вероятно, должны сделать вместо этого, что-то вроде

for(uintptr_t i=START; i<END; i+=2)
{
  uint16_t data = *(volatile uint16_t*)i;
  ...
}
...