Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

я на STM32 делаю совсем иначе

Отправлено koyodza 12 марта 2009, г. 20:02
В ответ на: Кто как параметры сохраняет? отправлено пользователем Termit 12 марта 2009, г. 10:17

поскольку адресное пространство общее, я не копирую параметры в ОЗУ. Копируется одна страничка только для модификации и последующей записи. Выглядит это примерно так:

#define FLASH_PAGE_SIZE 1024UL
...
#define FLASH_PAGE_PARAM 1UL
#define FLASH_PAGE_MTERMO 2UL
#define FLASH_PAGE_ATERMO 3UL
...
#define FLASH_DATA_BEGIN 0x08006000UL
#define FLASH_DATA_END 0x08008000UL
...
#define FLASH_DATA_MMATRIX (FLASH_DATA_BEGIN+(FLASH_PAGE_PARAM*FLASH_PAGE_SIZE))
#define FLASH_DATA_AMATRIX (FLASH_DATA_MMATRIX+64)
#define FLASH_DATA_DEVPARAM (FLASH_DATA_MMATRIX+512)
...
////////////////////////////////////////////////////////////
#define mMatrix (*((MATRIXSTRUCT const *)FLASH_DATA_MMATRIX))
#define aMatrix (*((MATRIXSTRUCT const *)FLASH_DATA_AMATRIX))
#define devParam (*((DEVPARAMSTRUCT const *)FLASH_DATA_DEVPARAM))
#define mTermo (*((TERMOPOINT16 const *)FLASH_DATA_MTERMO))
#define aTermo (*((TERMOPOINT16 const *)FLASH_DATA_ATERMO))
потом обращения к параметрам (чтение параметров) происходят просто:
x = (aMatrix.k11 * pAdc->ax + aMatrix.k12 * pAdc->ay + aMatrix.k13 * pAdc->az) + aMatrix.offset1;
С записью чуть сложнее: есть функция, копирующая 1 сектор в ОЗУ. Она возвращает указатель на эту копию:
__public BYTE* GetData(DWORD adr)
{
if ((adrPage ^ adr) & FLASH_PAGE_MASK)
{
if (nTickFlash)
WritePage();
ReadFlashPage(adr);
}
nTickFlash = TICK_FLASH_WRITE_PAGE;
return page + (adr & (FLASH_PAGE_SIZE - 1));
}
Когда мне нужно изменить что-то в параметрах, я делаю например так:
MATRIXSTRUCT* const p = (MATRIXSTRUCT*)GetData((DWORD)&aMatrix);
if (p)
{
p->k31 = GetFloat(pB + 2);
p->k32 = GetFloat(pB + 6);
...
p->offset3 = GetFloat(pB + 14) / GPP_K_ACCEL;
...
WritePage();
}
При необходимости использую "отложенную запись" - актуально для тех мест программы, где несколько параметров могут меняться с небольшим интервалом времени (параметры приходят в разных пакетах) - там я просто не вызываю WritePage() сразу, а взвожу таймер, который при достижении нуля вызывает WritePage()

Полной универсальности для разных МК добиться трудно, да и не всегда это оправдано


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 3 в два раза:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru