|
Шаблон (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, 13:43
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
я сделал файл EEPROM который пихает данные и читает данные из еепром. функции у него Код read_data(void * var, unsigned adr, unsigned len); write_data(void * var, unsigned adr, unsigned len); и все... Дальше дефайнами размечаю память Код #define BASE_ADDR 0x0000 #define VAR1_ADDR BASE_ADDR #define VAR2_ADDR (BASE_ADDR + sizeof(Var1)) или просто напрямую без sizeof в уме высчитываю и все... запись-чтение Код read_data((void *)&var1, VAR1_ADDR, sizeof(var1)); write_data((void *)&var2, VAR2_ADDR, sizeof(var2)); зачем шаблоны то? Для некоторых частых переменных делаю макросы.
|
|
|
|
|
Jul 29 2013, 13:48
|
Участник

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

|
Цитата(Golikov A. @ Jul 29 2013, 17:43)  я сделал файл EEPROM который пихает данные и читает данные из еепром. ... Просто хочется более рационального подхода и по больше использовать возможности C++. Кстати кто какие С++ возможности использует ? например class ? знаю как работает но не знаю как полезно применить.
Сообщение отредактировал IgorKossak - Aug 1 2013, 06:30
Причина редактирования: бездумное цитирование
|
|
|
|
|
Jul 31 2013, 07:31
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(paravozru @ Jul 29 2013, 17:48)  Просто хочется более рационального подхода и по больше использовать возможности C++. Кстати кто какие С++ возможности использует ? например class ? знаю как работает но не знаю как полезно применить. Классы - черные ящики с защитой работы. Они хороши не для конкретного проекта, а для повторного использования в будущих проектах или при разработке проекта группой программистов. Класс позволяет наделить его функционалом, абстрактно проверить его работоспособность и закрыв все возможные будущие ошибки внутри класса передавать его по проектам или по команде разработчиков. По большей части практически все что дает класс можно реализовать на С без плюсов, последние время так и делаю. Класс у меня это отдельный файл, все переменные в нем делают с доступом через функции, все глобальное от модуля - замкнуто внутри файла и снаружи недоступно. Что не возможно: наследование, полиморфизм и прочие прелести С++, это приходится делать ручками, создавая новый файл, включая в него старый и дублируя функции, за приватностью функций приходиться следить руками... Обращение через класс родитель к потомкам - вот единственное что не удается симулировать, но как-то обхожусь...%)
|
|
|
|
|
Jul 31 2013, 08:01
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Golikov A. @ Jul 31 2013, 09:31)  Они хороши не для конкретного проекта, а для повторного использования в будущих проектах Почему же? И в конкретном проекте можно использовать все его прелести. QUOTE (Golikov A. @ Jul 31 2013, 09:31)  По большей части практически все что дает класс можно реализовать на С без плюсов, последние время так и делаю. Класс у меня это отдельный файл, все переменные в нем делают с доступом через функции, все глобальное от модуля - замкнуто внутри файла и снаружи недоступно. То есть private - члены вы реализуете через static? Как при этом вы реализуете встраиваемые (inline) функции? Как получаете sizeof() этого "класса", как заводите в других файлах экземпляры этого "класса"? Как-то не тянет на "практически все", скорее на "кое что, да и то через ж". И зачем вообще такой велосипед с квадратными колесами если можно использовать специально созданный для этого инструмент - язык C++?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
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 =F8= Цитата(paravozru @ Jul 29 2013, 12:57) Не... Jul 29 2013, 10:52 jcxz Цитата(=F8= @ Jul 29 2013, 16:52) в .с
#p... Jul 29 2013, 11:03  =F8= Цитата(jcxz @ Jul 29 2013, 14:03) А это з... Jul 29 2013, 11:23   paravozru Цитата(=F8= @ Jul 29 2013, 15:23) Мдя... ... Jul 29 2013, 12:27    =F8= Цитата(paravozru @ Jul 29 2013, 15:27) но... Jul 29 2013, 14:50   =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
|
|
|