Поймал IAR EWAVR 7.30.4 на странной фигне при компиляции для
AVR-DA. Если в конце флэши разместить данные по фиксированным
адресам, то содержимое константных массивов в ОЗУ оказывается
покореженным (сдвинутым и зануленным в разных сочетаниях). Тестовый
проект для AVR128DA48: #include <stdint.h>
#pragma location=0x1FFFC
__farflash uint8_t place4crc[4]; //!< место зарезервированное под контрольные суммы
#pragma location=0x1FFF0
__farflash char progtime[12]; //!< дата и время программирования контроллера (последовательность цифр)
volatile int32_t tmp;
#define MONTAB(year) \
((year) & 03 || (year) == 0 ? mos : lmos)
/* static data */
static const int16_t lmos[] = {0, 31, 60, 91, 121, 152,
182, 213, 244, 274, 305, 335
};
static const int16_t mos[] = {0, 31, 59, 90, 120, 151,
181, 212, 243, 273, 304, 334
};
int __iar_Daysto32(int year, int mon)
{
/* compute extra days to start of month */
int days;
if (0 < year) /* correct for leap year: 1801-2099 */
{ days = (year - 1) / 4; }
else if (year <= -4)
// days = 1 + (4 - year) / 4;
{ days = year / 4; }
else
{ days = 0; }
return (days + MONTAB(year)[mon]);
}
int main(void)
{
tmp = __iar_Daysto32(121, 11);
tmp = place4crc[0];
tmp = progtime[0];
while(1);
}
От наличия массивов place4crc и progtime корежит содержимое массивов lmos и mos.
Воспроизвелось при компиляции для AVR32DA28. Не воспроизвелось при компиляции для XMEGA256A3U.
Разница в том, что при компиляции для не-DA IAR не сваливает значения для инициализации переменных в конец флэши, эта область абсолютно свободна, конфликт не возникает.