|
Шаблон (tamplete ) для работы с EEPROM |
|
|
|
Jul 29 2013, 06:42
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 2-07-12
Пользователь №: 72 586

|
Возникла проблема при работе с EEPROM на STM32L-Discovery Как можно создать адресацию EEPROM в заголовочном файле. Вот грабли на которые я наткнулся: в заголовочном файле .h сначала объявил указатели и им присвоил адреса вот примерно так 1.Мысля: uint16_t *ModBusAddr = (uint16_t *)0x08080000; в каком то .с файле вызов функции чтения EEPROM uint16_t ReadEEPROM(uint16_t *addr) { // функция чтения EEPROM принимающая адрес указателя, и возвращающая uint16_t uint16_t *ptr; uint16_t result; ptr = (uint16_t *)(addr); result = *ptr; return result; } Вот грабли №1: Keil выдал ошибку что множественное объявление «ModBusAddr » , оказывается можно только объявить переменные в .h но присвоить значения можно только в .с файлах.
2. Мысля Решил адресацию EEPROM через #define #define ModBusAddr 0 в таком случае функция чтения EEPROM приняла вид uint16_t ReadEEPROM(uint16_t addr) { // функция чтения EEPROM принимающая позицию в памяти , и возвращающая uint16_t uint16_t *ptr; uint16_t result; ptr = (uint16_t *)(eepromADR + addr ); // где #define eepromADDR 0x08080000 - начало EEPROM в STM32L-discovery result = *ptr; return result; } вот грабли №2: Да все работает, но во первых придется рассчитать каждый short, int, переменную в адресном пространстве EEPROM и задавать последовательность 0,1,2,3,4 и т п Например для #define ModBusAddr 0 //так в голове держу 0x08080000 , выделю два байта для этой переменной #define ModBusFunc 2 // так в голове держу 0x08080002 выделю два байта для этой переменной и т д. Вот еще проблема функция uint16_t ReadEEPROM(uint16_t addr) имеет тип uint16 что принимаемый что возвращаемый, как быть если я хочу выделить для одной переменной например только байт, для другой два байта, а с float что делать ?
Тоже подумал и решил так создам Шаблон функции которая будет принимать различные типы данных и в зависимости от этого читать определенное количество байт с EEPROM/
template<typemane eeType>
eeType ReadEEPROM(eeType addr) { eeType *ptr; eeType result; ptr = (eeType *)(addrEEPROM + adrr); result = *ptr; return result; }
Проошу помощи, каким образом Вы распределяете память и как описаны функции чтения и записи c различными типами данных с EEPROM.
Забыл указать, при создании шаблона Keil выдал ошибку "this declaration has no storage class or type specifier"
Сообщение отредактировал paravozru - Jul 29 2013, 06:46
|
|
|
|
|
 |
Ответов
|
Jul 29 2013, 10:52
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(paravozru @ Jul 29 2013, 12:57)  Не понятно, можно пример, или объяснить. в .icf define symbol __region_SEGMENT_NAME_start__= 0xXXXXXXXX; define symbol __region_SEGMENT_NAME_end__ = 0xXXXXXXXX; define region SEGMENT_NAME_region= mem:[from __region_SEGMENT_NAME_start__ to __region_SEGMENT_NAME_end__]; place in SEGMENT_NAME_region { section SEGMENT_NAME }; в .с #pragma segment="SEGMENT_NAME" #pragma location="SEGMENT_NAME" int a; или int b @ "SEGMENT_NAME"; а еще лучше struct eeprom_t{ Сюда добавляем все, что хотим хранит в еепром }; и затем #pragma location="SEGMENT_NAME" struct eeprom_t eeprom;
|
|
|
|
|
Jul 29 2013, 11:23
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(jcxz @ Jul 29 2013, 14:03)  А это зачем? Этого не надо. Мдя... а ведь точно не надо. Когда-то давно то-ли в описании линкера увидел, то-ли в примере каком, ну в общем оно появилось, да так и пошло из проекта в проект  . Вспомнил, мне надо было кусок памяти из датафлеш в эту секцию кидать, соответственно нужны были __section_begin/end. Вот так и остался этот некрокусок.
|
|
|
|
|
Jul 29 2013, 12:27
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 2-07-12
Пользователь №: 72 586

|
Цитата(=F8= @ Jul 29 2013, 15:23)  Мдя... а ведь точно не надо. Когда-то давно то-ли в описании линкера увидел, то-ли в примере каком, ну в общем оно появилось, да так и пошло из проекта в проект  . Вспомнил, мне надо было кусок памяти из датафлеш в эту секцию кидать, соответственно нужны были __section_begin/end. Вот так и остался этот некрокусок. Вот по поводу примера "=F8=" я сталкивался что переменные хранят как struct:, но все равно переменной uint8_t выделяется 2 байта в памяти. Я и думал возможность применения универсальной функции "template" для оптимизации пространства EEPROM, что бы каждому типу переменной выделялся соответствующий размер. И кстати функция чтения и записи в данном примере оперирует только с uint16_t Вот пример действующий : struct eeprom { // Структура разнотипных данных vu16 MyModBusAdr; //0 vu16 MyHartAdr; //2 vu16 MyCanAdr; //4 vu8 IPadr[4]; //6 vu8 Result[4]; //8 } uint8_t SetEEPROMData (uint16_t address, uint16_t Value) { функция записи в struct eeprom тело функции; } Ох спасибо, начинает доходить, к сож с подобным образом хранения данных в EEPROM я не встречался, ( по опыту разбора чужих прошивок), я постараюсь разобраться. И способ c template возможен ?
|
|
|
|
|
Jul 29 2013, 14:50
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(paravozru @ Jul 29 2013, 15:27)  но все равно переменной uint8_t выделяется 2 байта в памяти. Если беспокоит плотность упаковки то #pragma pack(1) struct eetrom_t{ ........... }; #pragma pack() В этом случае все будет паковаться байт к байту. В этом случае работать с переменными можно только напрямую т.е. eeprom.var = xx или xx = eeprom.var. Но не int *p = &eeprom.var; *p = 10;
|
|
|
|
Сообщений в этой теме
paravozru Шаблон (tamplete ) для работы с EEPROM Jul 29 2013, 06:42 jcxz 1. При объявлении переменной, задаёте ей альтернат... Jul 29 2013, 08:46 paravozru Цитата(jcxz @ Jul 29 2013, 12:46) 1. При ... Jul 29 2013, 09:57  jcxz Так я же привёл пример. Jul 29 2013, 09:59 =F8= А теперь подставьте вместо eeType к примеру char и... Jul 29 2013, 09:01 paravozru Цитата(=F8= @ Jul 29 2013, 12:01) А тепер... Jul 30 2013, 05:18  paravozru в .icf
define symbol __region_EEPROM_start__= 0x08... Jul 30 2013, 11:34   MrYuran Цитата(paravozru @ Jul 30 2013, 14:34) #p... Jul 30 2013, 11:41 Golikov A. я сделал файл EEPROM который пихает данные и читае... Jul 29 2013, 13:43 paravozru Цитата(Golikov A. @ Jul 29 2013, 17:43) я... Jul 29 2013, 13:48  Golikov A. Цитата(paravozru @ Jul 29 2013, 17:48) Пр... Jul 31 2013, 07:31   Сергей Борщ QUOTE (Golikov A. @ Jul 31 2013, 09:31) О... Jul 31 2013, 08:01   =F8= Цитата(Golikov A. @ Jul 31 2013, 10:31) Ч... Aug 3 2013, 08:55 DASM Когда-то задавлся таким вопросом, вкратце тут http... Jul 31 2013, 07:53 Golikov A. приват можно делать не только через статик, а прос... Aug 2 2013, 10:53 Сергей Борщ QUOTE (Golikov A. @ Aug 2 2013, 12:53) пр... Aug 2 2013, 14:47  Golikov A. Цитата(Сергей Борщ @ Aug 2 2013, 18:47) К... Aug 5 2013, 10:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|