Вот: const unsigned char* const file; //Укахзатель на файл - ты обявил поле структуры file, которую можно инициализировать только при объявлении структуры.
File_t files[4] - Данная структура размещяется в ОЗУ
File_t const files[4] - Данная структура разместится во FLASH (в соответствии со скриптом линкера)
Общее правило для const такое:
- при объявлении локальных/глобальных переменных и полей структур через const такие переменные могут быть инициализированы только в момент объявления, и из них можно только читать.
Это же относится к указателям на const-переменные - по такому указателю можно только читать.
Поэтому обычному указателю нельзя напрямую присваивать указатель на const, ибо у тебя может потом возникнуть преступное желание сделать запись через такой указатель :-)
- при объявлении глобальных (static - тоже с глобальным расположением) переменных через const такие переменные размещаются в отдельных секциях, и линкер их затем размещает во FLASH
Стоит еще отдельно сказать про расположение const в объявлениях переменных:
const char Variable; // Переменная во FLASH
char const Variable; // Переменная во FLASH
Обе записи являются эквивалентными. Однако:
const char *pVariable; // Переменная в RAM
char * const pVariable; // Переменная во FLASH
Это совершенно разные записи. Поэтому, чтобы не путать себя и других предпочтительнее из записей:
const тип переменная;
тип const переменная;
- использовать 2-й вариант