Сходная тема, решил не плодить
Объявляю в сегменте А секцию, размещаю там константы.
Код
#define __SEG_A__ __attribute__((section(".seg_a"),used))
//---------------------------------------------------------------//
// Параметры по умолчанию (Хранятся в Seg A) //
//---------------------------------------------------------------//
const __SEG_A__ float cf_T_K_calibr = 0.001; // Начальное значение K_calibr канала температуры
const __SEG_A__ float cfK_Termo = 1.2345; // Коэффициент термокомпенсации
const __SEG_A__ float cfCsens = 2.345; // Постоянная датчика проводимости
const __SEG_A__ float cfC3 = 1.0; // Постоянная датчика 3 канала
const __SEG_A__ unsigned int uiDefaultMode = 0x003f; // Mode
// !!! -> Компилить с ключом линкера -Wl,--section-start -Wl,.seg_a=0x1080 <- !!!
Пишет: attribute used ignored
Смотрю листинг - никаких упоминаний ни секции, ни констант.
Естественно, в памяти 0xFF, полная лажа
Ладно.
Инициализирую явно структуру в памяти этими константами.
Код
void InitFlashData()
{
tempFlashData.T_K_calibr = cf_T_K_calibr;
tempFlashData.K_Termo = cfK_Termo;
tempFlashData.Csens = cfCsens;
}
И что же?
Код
00002b7a <InitFlashData>:
2b7a: b2 40 6f 12 mov #4719, &0x0280;#0x126f
2b7e: 80 02
2b80: b2 40 83 3a mov #14979, &0x0282;#0x3a83
2b84: 82 02
2b86: b2 40 19 04 mov #1049, &0x0284;#0x0419
2b8a: 84 02
2b8c: b2 40 9e 3f mov #16286, &0x0286;#0x3f9e
2b90: 86 02
2b92: b2 40 7b 14 mov #5243, &0x0288;#0x147b
2b96: 88 02
2b98: b2 40 16 40 mov #16406, &0x028a;#0x4016
2b9c: 8a 02
2b9e: 30 41 ret
Компилятор взял значения и подсунул напрямую.
Естественно, констант в памяти опять нет.
Что за хитрые компиляторы пошли, хрен обманешь...
Как по-культурному решить эту проблему?
Цель - константы должны лежать в флеши, на эту область я проецирую структуру в памяти