Цитата(SpiritDance @ Oct 12 2006, 12:00)

Но меня отличия в реализации этого в компиляторах интересуют мало, это можно подсмотреть в документации. Я не совсем понимаю другое: как грамотно разместить эти сегменты и как потом презаписывать значения переменных? К тому же перезаписать можно как правило страницы памяти, а если структура меньше и остальные сегменты будут находится на той же страничке памяти? Равнять MY_SECTION по размеру страницы? Только по -моему линкер сам определяет конечный размер сегмента, а мы можем тоолько указать начальный адрес и максимальный размер. Или структуру равнять по размеру страницы? Вобщем вот собственно в чем вопрос-то.
Линкеру можно указать, какие сегменты в какие адреса рассовывать. Компилятору можно указать,
в какие сегменты поместить переменные. Как - искать в документации на конкретный
компилятор/линкер. Это как раз не проблема.
Более важно решить такие вопросы:
Флэш в uC разбита на сектора. Стирание может происходить только сектора целиком.
Значит нужно выбрать сектор и выделить его под хранение интересующих значений.
Размеры секторов и их адреса не обязаны совпадать у контроллеров разных производителей,
это первая причина, по которой не получится полная независимость программы от конкретного камня.
Далее, запись во флэш в режиме выполнения программы (IAP - как говорили выше) - процесс
тем более зависящий от конкретного производителя семейства контроллеров, это вторая причина, по
которой универсальной программы для различных uC не получится.
То есть нужно:
1. Выбрать в контроллере страницу flash подходящего размера.
2. Исключить адреса этой страницы из линковки программы.
3. Отвести эту страницу для линковки сегментов, определенных для настроек в программе на Ц.
4. При необходимости можно проинитить эти переменные значениями по умолчанию.
5. Написать для каждого типа контроллера драйвер с универсальным API, который будет служить прослойкой между основной программой и механизмом IAP конкретного контроллера.
В зависимости от конкретных потребностей запись настроек может производиться как опеация
стирания старых и записи новых, или как дозапись новых в конец старых (пока не кончится сектор),
или можно выделить 2 сектора, и писать в них попеременно.
В вашем варианте, если я правильно понял, настроек мало, а сектор большой.
Тогда можно, например, объявить массив структур такой, чтобы этот размер равнялся размеру выбранного сектора или был чуть меньше.
Стуркутру делаете такую
struct one_item
{
unsigned char empty;
struct
{
...
} vars;
};
Потом делаете массив:
struct one_item all_items[100]; // 100 - это для примера
Поле empty будет играть роль флага отсутствия настроек в этом индексе массива.
Если это поле равно 0xff (значение стертой ячейки флэш), то все остальные поля настроек пусты.
Алгоритм при старте такой:
Проходитесь по массиву и ищите последнюю структуру, в которой empty != 0xff
Используете параметры vars.
Алгоритм при записи новых настроек такой:
Проходитесь по массиву и ищите первую структуру, в которой empty == 0xff
Записываете в нее новые значения vars и empty = 0.
Если все элементы массива заполнены, что стираете сектор и начинаете писать его заново.
Возможно все это извращение не стоит того, чтобы им заниматься, поскольку гораздо проще
тупо стирать каждый раз сектор и писать навые настройки в начало сектора.
Еще нужно обратить внимание, с блоками кокой длины работает IAP конкретного uC.
У LPC, насколько я помню, это 256 байт.
Хотите поговорить об этом ?