Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; 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()
Полной универсальности для разных МК добиться трудно, да и не всегда это оправдано
Составить ответ | Вернуться на конференцию.
Ответы
- кроме того - koyodza (12.03.2009, 20:12:41 77.123.64.94, 88 байт)