ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1151293
AlexG (04.12.2021 20:11, просмотров: 2400)
Поймал 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 не сваливает значения для инициализации переменных в конец флэши, эта область абсолютно свободна, конфликт не возникает.