реклама на сайте
подробности

 
 
> STM32, backup registers, как бы поудобнее реализовать с ними работу
sonycman
сообщение Jun 7 2010, 19:22
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Доброго времени суток!
Вот думаю использовать регистры бэкап домена.
Как бы прозрачнее это сделать, в идеале так, чтобы работа с ними не отличалась от работы с ячейками обычного ОЗУ?
Можно ли это?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
baralgin
сообщение Jun 7 2010, 20:38
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Из RM0008:
Backup data register x (BKP_DRx) (x = 1 ..42)
Address offset: 0x04 to 0x28, 0x40 to 0xBC

Первые 10 слов лежат подряд, остальные через интервал. Можно рассматривать как два массива с адресами (BKP_BASE + 0x0004) и (BKP_BASE + 0x0040) соответственно. Думаю около того:

Код
volatile uint32_t* BKPPartOne = (volatile uint32_t*)(BKP_BASE + 0x0004);
BKPPartOne[0] = 0x1234;
BKPPartOne[1] = 0x2345;
...
BKPPartOne[9] = 0xXXXX;

Не проверял, но по идее должно работать smile.gif .


Если нужно одним массивом, то можно завернуть это дело в класс с оператором [].
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 7 2010, 20:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Стесняюсь спросить, а компиляторы про эту фичу не знают? А то вдруг они в курсе дела и используют ее по своему собственному разумению laughing.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 9 2010, 12:34
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Спасибо за советы.
Реализация в виде дефайнов слишком простая и неудобная - всё надо делать ручками.

А вот обёртка в виде класса способна дать некое удобство и автоматизацию, но накладные расходы памяти будут совсем не кстати.
Да и если с переопределением dword, word и byte проблем не вижу, то как реализовать в классе работу со структурами я не знаю sad.gif

Наверное создам пока обычную структуру в памяти, и буду её время от времени записывать/считывать из энергонезависимого озу.

Насчёт компиляторов не в курсе.
Работаю в RealView, а он совсем не отличается широкой поддержкой всяких хитрых фич, в отличие от IAR sad.gif
Go to the top of the page
 
+Quote Post
baralgin
сообщение Jun 9 2010, 18:43
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(sonycman @ Jun 9 2010, 15:34) *
А вот обёртка в виде класса способна дать некое удобство и автоматизацию, но накладные расходы памяти будут совсем не кстати.

Накладных расходов памяти не будет, только кода(и времени доступа). Сделать класс со статическими Set и Get для каждого члена "структуры", всё описать в хидере и после оптимизатора там будет очень компакный код. Собственно объект класса даже создавать не нужно, т.к. все методы будут статическими. Хотя никто не мешает так же завернуть это дело в static inline си-функции. Вопрос чисто эстетический smile.gif .
Цитата(sonycman @ Jun 9 2010, 15:34) *
Наверное создам пока обычную структуру в памяти, и буду её время от времени записывать/считывать из энергонезависимого озу.

По моему нормальный подход. Всё равно там этой backup-памяти кот наплакал(в мелких девайсах и вовсе 10 слов). Можно сделать универсальные:
Save(const void* inptr, size_t bytes) и Load(void* outptr, size_t bytes) и грузить туда любые конструкции.

Сообщение отредактировал baralgin - Jun 9 2010, 18:48
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 9 2010, 19:31
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



помним, что слова BKP_DRx 16-битные и между ними есть 16-битные пустоты.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Jun 9 2010, 20:11
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



adnega
так именно из-за этого то и весь сыр-бор разгорелся (ну и также из-за пробела между двумя "банками", который было бы желательно убрать).
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 10 2010, 07:45
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Мне кажется, что "прозрачность" будет зависеть от того каким объемом данных оперируешь и как часто.

- Если до 16 бит, то определяем структуру и обращаемся к элементам структуры.

- Если больше, то завести удобную память - писать-читать из этой памяти. Перед чтением использовать load(byte *data), после записи save(byte *data).
load и save цена за "прозрачность".

Для хранения параметров устройства использовал load/save. И прозрачно, и логично.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 10 2010, 09:37
Сообщение #9


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Ну, необходимость вызова функций Load\Save и "прозрачность" как то не совсем вяжутся.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 10 2010, 09:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Если под "прозрачностью" понимать непрерывность области данных, то это одно из решений решение.
Если нужен пословный доступ (по 16 бит), то можно написать необходимое число дефайнов.

Сам не пользовался, но кажется можно написать обработчик исключительной ситуации...

Например, обращаемся к несуществующему региону памяти (виртуальной батареечной памяти) как батареечной памяти. Обрабатываем исключение - если адреса из виртуальной батареечной памяти, то осуществляем доступ к реальной. Накладненько, но вроде "прозрачно". Так надо?

Будет работать?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 10 2010, 10:39
Сообщение #11


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Нет, в моём понимании "прозрачность" - это когда работа со специфическими данными осуществляется точно так же, как и с обычными.
Пример:
Код
dword a = 100;
NON_VOLATILE b = 50;
if (b < a) b = a;

и т.д.

А ещё лучше было бы:
Код
NON_VOLATILE dword b;

NON_VOLATILE struct {
dword a;
word b;
byte c[5];
} timer;

Тут мы одновременно задаём тип данных и его размер.
Но это уже даже не Си, наверное...

Я не знаю, как этого добиться на Си или Си++ sad.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 11 2010, 05:19
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Добился-таки "прозрачности", но на lpc1768.

Проверял так:

BYTE *bat;

bat = (BYTE *)0x30000000; // несуществующая память
bat[0]=0x5A;

С позиций ядра bat[0]=num есть

STR rc, [ro]

rc - хранит число num, ro - хранит адрес назначения bat+0

Запись по несуществующему адресу вызывает исключение. В обработчике исключения подменяю ro на нужную ячейку памяти и выхожу (регистры R0-R3, R12 "проблемного участка" доступны через стек, остальные - напрямую). Команда STR выполняется еще раз, но уже с новым адресом.

У данного подхода есть ряд минусов:
- нужен контроллер с MPU. на STM32 не смог получить исключение в месте, где произвожу запись.
- поскольку rc и ro заранее не известны (впрочем команда тоже может быть не STR), то нужно анализировать инструкцию, которая привела к сбою.
- после выполнения инструкции параметры портятся, поэтому инструкцию лучше эмулировать.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Dec 14 2010, 03:23
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



А у кого- нибудь получилось записать в эти регистры- хоть что- нибудь?
Я попробовал- нифига не выходит.
В лоб, по крайней мере:


BKP->DR2=2222;

a=BKP->DR2;

В отладчике сморю а=0... и BKP_DR2=0.... и переправить его руками из отладчика не получается??

Управляющие регистры BKP_CR и BKP_CSR обнулены..

Нифига не понимаю.. Может, что-то не так делаю?

Компилятор Keil 4.12
Go to the top of the page
 
+Quote Post
adnega
сообщение Dec 14 2010, 04:17
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Serj78 @ Dec 14 2010, 06:23) *
А у кого- нибудь получилось записать в эти регистры- хоть что- нибудь?
Я попробовал- нифига не выходит.
В лоб, по крайней мере:


BKP->DR2=2222;

a=BKP->DR2;

В отладчике сморю а=0... и BKP_DR2=0.... и переправить его руками из отладчика не получается??

Управляющие регистры BKP_CR и BKP_CSR обнулены..

Нифига не понимаю.. Может, что-то не так делаю?

Компилятор Keil 4.12


Необходимые питание и клоки включены?
Go to the top of the page
 
+Quote Post
zoddy
сообщение Dec 14 2010, 04:21
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 4-12-05
Из: Екатеринбург
Пользователь №: 11 773



Цитата(Serj78 @ Dec 14 2010, 08:23) *
А у кого- нибудь получилось записать в эти регистры- хоть что- нибудь?


Я так и делаю
BKP->DRx = data;
data = BKP->DRx;
Все работает!


Скорее всего вы не разрешили запись в BKP. Что-то типа этого...

CODE

RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE); // вкл тактирование нужной периферии
PWR_BackupAccessCmd(ENABLE);// разрешаем доступ к BKP
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016