реклама на сайте
подробности

 
 
> Калибровочные таблицы во флеше, как люди делают?
SpiritDance
сообщение Oct 11 2006, 07:44
Сообщение #1


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Часто встает вопрос калибровки измерительных цепей. при этом устройство должно где-то запоминать полученные калибровочные коээфициэнты, чтобы калибровку не делать каждый раз заново.
eeprom в армах нет, есть только флеш, сооответсвенно устройство должно само записывать фо флеш и само считывать. Вопрос собственно заключается в том как грамотно это сделать на языке С, чтобы таблица не была жестко привязана к определенной странице памяти. Я просто выделяю отдельный сегмент для таких таблиц на асме и прикреплял его к определенному адресу. А как делаете ВЫ? Может есть более элегантный способ?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SpiritDance
сообщение Oct 11 2006, 14:51
Сообщение #2


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Вопрос про размещение данных по адресам флеш. (Что такое IAP?... IAR?)
Процессоры lpc2000, sam7 и им подобные. Компилятор и конкретный проц (и тем более среда blink.gif ) вобщем-то значения не имеют в данном вопросе.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Oct 12 2006, 03:37
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(SpiritDance @ Oct 11 2006, 20:51) *
Вопрос про размещение данных по адресам флеш. (Что такое IAP?... IAR?)

В терминах филипса - In Application Programming

Цитата
Компилятор и конкретный проц (и тем более среда blink.gif ) вобщем-то значения не имеют в данном вопросе.

Если Вам надо на С, то ИМХО имеют.
Вариантов видимо много, например:
1. В лоб.
В проге используются жёстко заданные адреса, в настройке проекта (вот тут как раз среда и м.б. полезна, но конечно всё это линкеру скармливается) это некоторое адресное пространство "убрано" из доступной памяти.
Если переменная, структура одна - то подход ещё ничё, а если Вам их туда надо сотню то уже не очень. smile.gif

2. Использовать секции/сегменты, например для GCC
Код
int a __attribute__ ((section ("my_section")));
int b __attribute__ ((section ("my_section")));

Но опять же линкеру надо рассказать где какие секции/сегменты.
Go to the top of the page
 
+Quote Post
Timofey
сообщение Oct 12 2006, 04:38
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата
2. Использовать секции/сегменты, например для GCC
Код
int a __attribute__ ((section ("my_section")));
int b __attribute__ ((section ("my_section")));

Но опять же линкеру надо рассказать где какие секции/сегменты.
А для IARа 4.31 как указать? Я видел тут на форуме программу для записи во флэш, но чего то уж больно сложновато ..... Попроще нникак нельзя?

Сообщение отредактировал Timofey - Oct 12 2006, 04:39
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Oct 12 2006, 06:00
Сообщение #5


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Timofey @ Oct 12 2006, 08:38) *
А для IARа 4.31 как указать?

Для IAR размещение можно указать с помощью pragma location
Код
#pragma location="MY_SECTION"
int a;
#pragma location="MY_SECTION"
int b;

ну и
Цитата
Но опять же линкеру надо рассказать где какие секции/сегменты.

smile.gif

Но меня отличия в реализации этого в компиляторах интересуют мало, это можно подсмотреть в документации. Я не совсем понимаю другое: как грамотно разместить эти сегменты и как потом презаписывать значения переменных? К тому же перезаписать можно как правило страницы памяти, а если структура меньше и остальные сегменты будут находится на той же страничке памяти? Равнять MY_SECTION по размеру страницы? Только по -моему линкер сам определяет конечный размер сегмента, а мы можем тоолько указать начальный адрес и максимальный размер. Или структуру равнять по размеру страницы? Вобщем вот собственно в чем вопрос-то.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Oct 20 2006, 12:33
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(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 байт.

Хотите поговорить об этом ? smile.gif


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 08:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016