|
Hi-Tech C & EEPROM & FLASH, как красиво работать ? |
|
|
|
 |
Ответов
|
Sep 30 2008, 06:00
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(_Pasha @ Sep 29 2008, 18:52)  Доброго времени! Уж на что в GCC некомфортно получается работать с флешом и еепром, но по сравнению с продукцией hi-tech это - вершина сервиса! Кто-нить красиво работает в HTC? Имеется ввиду инициализация, работа со структурами... при наличии только EEPROM_READ(address) и __EEPROM_DATA(...). Грустно все это... Например так Код //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Восстанавливам данные из EEPROM // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void initSetNU(void) { unsigned char i, *p, n, N; i = sizeof(NUcanal); // Размер структуры p = (unsigned char*)(NUcanal); // Указатель на место размещения в памяти n = NuCanalStartEEprom; // Размещение в ЕПРОМ while (i--) {*(p++)=eeprom_read(n++);} //Чтение } И чего грустить.
|
|
|
|
|
Sep 30 2008, 07:30
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(DL36 @ Sep 30 2008, 10:00)  И чего грустить. Вот чего: Код /*My extension to working with EEPROM*/ void eeprom_read_block(void* dest, void*src, size_t size);
/* total parameter set, stored in EEPROM, fits in single record - the simplest way to operate instead of fixed address definition */ typedef struct { int fld1; long fld2; } complex_type_t;
complex_type_t* eep_image; int requested_field;
void main(void) { /* blah blah blah*/ eep_image = (complex_type_t*) 0; eeprom_read_block(&requested_field,&(eep_image->fld1),sizeof(requested_field)); } А потом эту структуру инициализируем черт знает чем __EEPROM_DATA (...) И это при том, что параметров может быть несколько десятков. Проктологи отдыхают...
|
|
|
|
|
Nov 18 2008, 06:50
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Вот, наконец-то, нормальное решение. И удобно, и максимально близко к WINAVR, используемому гораздо чаще, чем hi-tech. Работает на основе стандартного макроса offsetof. Код #include <stddef.h> typedef struct { int fld1; unsigned char fld2[45]; } complex_type_t;
typedef struct { int memb1,memb2; complex_type_t record; } paramset_t;
void main(void) { /* blah blah blah*/ unsigned char tmp; tmp = eeprom_read(offsetof(paramset_t,record.fld2[6])); } Ессно, это примитив для чтения/записи блока. P.S. вначале написал, а потом нашел оч. красивую статью: статья
|
|
|
|
|
Nov 19 2008, 06:32
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(_Pasha @ Nov 18 2008, 10:50)  Вот, наконец-то, нормальное решение. И удобно, и максимально близко к WINAVR, используемому гораздо чаще, чем hi-tech. Работает на основе стандартного макроса offsetof. Код #include <stddef.h> typedef struct { int fld1; unsigned char fld2[45]; } complex_type_t;
typedef struct { int memb1,memb2; complex_type_t record; } paramset_t;
void main(void) { /* blah blah blah*/ unsigned char tmp; tmp = eeprom_read(offsetof(paramset_t,record.fld2[6])); } Ессно, это примитив для чтения/записи блока. P.S. вначале написал, а потом нашел оч. красивую статью: статья Спасибо, статью пока не читал. offsetof возвращает смещение поля, за размером надо следить самому. Пока не могу сообразить где есть привязка к базовому адресу, начала расположения структуры в ЕПРОМ.
|
|
|
|
|
Nov 19 2008, 07:02
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(DL36 @ Nov 19 2008, 10:32)  offsetof возвращает смещение поля, за размером надо следить самому. Пока не могу сообразить где есть привязка к базовому адресу, начала расположения структуры в ЕПРОМ. У меня вполне логичное правило: размером читаемого блока является размер переменной, в которую выполняется чтение. С записью - тоже пляшем от размера переменной. Привязкой лучше сделать 0х00, потому что намного удобнее "накрыть" структурой всю систему параметров, и пусть там будет несколько наборов, CRC и прочее. Т.е. это выглядит как глобальный хедер, из которого можно добраться до любого параметра. И логика в этом есть - библиотечные функции, если они по-местному читают еепром, это не есть правильно с точки зрения портабельности. Лучше как-нить через Код extern int get_timeout (void);// а здесь уже читаем откуда угодно например так. ПыСы чтение флеша с набором констант, ессно, аналогично
|
|
|
|
Сообщений в этой теме
_Pasha Hi-Tech C & EEPROM & FLASH Sep 29 2008, 15:52  DL36 Цитата(_Pasha @ Sep 30 2008, 10:30) А пот... Sep 30 2008, 08:01   _Pasha Цитата(DL36 @ Sep 30 2008, 12:01) держать... Sep 30 2008, 14:46     DL36 Цитата(_Pasha @ Nov 19 2008, 11:02) У мен... Nov 19 2008, 07:59      _Pasha Цитата(DL36 @ Nov 19 2008, 11:59) Но есть... Nov 19 2008, 10:40 _Pasha Полазил по форумам. Нашел, что eeprom - qualifier ... Sep 30 2008, 17:11 DL36 Цитата(_Pasha @ Sep 30 2008, 20:11) Полаз... Oct 1 2008, 06:23 _Pasha Спасибо за консультацию. Oct 2 2008, 05:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|