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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Сложная автозамена через #define
kolobochishe
сообщение Dec 9 2015, 08:59
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Пример:

сейчас

Код
// Запись значений по указателям
*pTIMER7_PERIOD = 0x0000FFFF;
*pTIMER7_WIDTH = 0x00007FFF;


Как сделать такую запись через всего 1 дефайн? Т.к. текст TIMER7 есть во всех
именах регистров, то, наверно, их можно заменить одним дефайном?

Код
#define BKLT_TIMER TIMER7

*pBKLT_TIMER_PERIOD = 0x0000FFFF;
*pBKLT_TIMER_WIDTH = 0x00007FFF;


и т.д. Что нужно дополнительно сделать, чтобы такая замена работала?
Go to the top of the page
 
+Quote Post
psL
сообщение Dec 9 2015, 09:10
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



http://stackoverflow.com/questions/1489932...macro-as-in-arg
Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 9 2015, 11:33
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(kolobochishe @ Dec 9 2015, 15:59) *
и т.д. Что нужно дополнительно сделать, чтобы такая замена работала?

Так не получится, потому что pBKLT_TIMER_WIDTH для препроцессора уже одна неделимая лексема и всё что он может с ней сделать разве что заменить целиком.
Удобнее подход, когда набор из четырёх регистров таймера описывается как структура. Тогда TIMER7 можно описать как указатель на такую структуру, а к регистрам обращаться как TIMER7->PERIOD.
Где-то так, по примеру CMSIS для кортексов и без учёта особенностей компилятора.
Код
#define     __IO    volatile
typedef struct{
__IO uint16_t CONFIG;
__IO uint32_t COUNTER;
__IO uint32_t PERIOD;
__IO uint32_t WIDTH;
}Timer_TypeDef;
#define TIMER0  ((Timer_TypeDef*)0xFFC01600)
...
#define TIMER7  (TIMER0+7)

#define BKLT_TIMER TIMER7
BKLT_TIMER->PERIOD = 0x0000FFFF;
BKLT_TIMER->WIDTH = 0x00007FFF;




--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 15 2015, 12:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kolobochishe @ Dec 9 2015, 14:59) *
*pBKLT_TIMER_PERIOD = 0x0000FFFF;
*pBKLT_TIMER_WIDTH = 0x00007FFF;[/code]
и т.д. Что нужно дополнительно сделать, чтобы такая замена работала?

#define concatABC_(a, b, c) a##b##c
#define concatABC(a, b, c) concatABC_(a, b, c)

#define TIMER TIMER7
*concatABC(p, TIMER, _PERIOD) = 0x0000FFFF;
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 16 2015, 15:42
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(SSerge @ Dec 9 2015, 17:33) *
...
Удобнее подход, когда набор из четырёх регистров таймера описывается как структура. Тогда TIMER7 можно описать как указатель на такую структуру, а к регистрам обращаться как TIMER7->PERIOD.
...


Было такое желание, но мне не хочется создавать лишние структуры. Хоть на нынешнем контроллере можно и истратить лишние байты, но все же, по-моему, лучше экономить память. Вдруг завтра на Attiny что-то придется делать rolleyes.gif


Цитата(jcxz @ Dec 15 2015, 18:48) *
#define concatABC_(a, b, c) a##b##c
#define concatABC(a, b, c) concatABC_(a, b, c)

#define TIMER TIMER7
*concatABC(p, TIMER, _PERIOD) = 0x0000FFFF;


Спасибо wink.gif правда непонятно как это работает...

Сообщение отредактировал kolobochishe - Dec 16 2015, 16:02
Go to the top of the page
 
+Quote Post
Флюктуация вакку...
сообщение Dec 16 2015, 18:35
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 346
Регистрация: 15-12-13
Из: Планета Земля
Пользователь №: 79 630



Нужно ипользовать вложенные макросы.
Т.е. вызов макроса в макросе.
Правда не все компиляторы поддерживают это.
Помнится AVR Studio поддерживала
Go to the top of the page
 
+Quote Post
barabek
сообщение Dec 16 2015, 22:18
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(kolobochishe @ Dec 17 2015, 01:42) *
Было такое желание, но мне не хочется создавать лишние структуры. Хоть на нынешнем контроллере можно и истратить лишние байты, но все же, по-моему, лучше экономить память. Вдруг завтра на Attiny что-то придется делать rolleyes.gif

Ошибаетесь. При объявлении типа структуры память не расходуется. Зато читаемость кода лучше. И места для багов меньше. При доступе может быть код поболее будет, но не факт.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 17 2015, 10:12
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(barabek @ Dec 17 2015, 03:18) *
Ошибаетесь. При объявлении типа структуры память не расходуется. Зато читаемость кода лучше. И места для багов меньше. При доступе может быть код поболее будет, но не факт.


Не. Я не про объявление, а про размер структуры. Иногда не все регистры у конкретного таймера необходимо использовать. А если уж мы создали переменную-структуру, то даже неиспользуемые поля будут место занимать.

Сообщение отредактировал kolobochishe - Dec 17 2015, 10:13
Go to the top of the page
 
+Quote Post
barabek
сообщение Dec 17 2015, 10:22
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(kolobochishe @ Dec 17 2015, 20:12) *
Не. Я не про объявление, а про размер структуры. Иногда не все регистры у конкретного таймера необходимо использовать. А если уж мы создали переменную-структуру, то даже неиспользуемые поля будут место занимать.

Нет. Опять не правы. Структура не создаётся. Определяется тип. Это информация только для компилера. Даже указатель на структуру не создается. Всего то что и происходит, это то, что мы говорим компилеру воспринимать цифру начального адреса как указатель на структуру. При обращении к полям структуры компилятор прибавляет к начальному адресу требуемое смещение. Так как и адрес и смещение известны на этапе компиляции, то компилятор скорее всего сразу рассчитает требуемый адрес регистра. Равносильно дефайну на этот регистр.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 17 2015, 10:37
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(kolobochishe @ Dec 17 2015, 13:12) *
Не...

Вам дело говорят. Посмотрите как это в avr-libc сделано.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
barabek
сообщение Dec 18 2015, 05:32
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(kolobochishe @ Dec 17 2015, 20:12) *
А если уж мы создали переменную-структуру, то даже неиспользуемые поля будут место занимать.

Добавлю. Поля структуры это регистры периферии (на сленге : поля замапены на регистры). Если вы какие-то поля (читай - регистры) не используете по прямому назначению, то как вы их еще можете использовать?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 18 2015, 08:16
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kolobochishe @ Dec 16 2015, 21:42) *
Спасибо wink.gif правда непонятно как это работает...

А что именно непонятно?
Как я понял: у Вас есть записи типа *pTIMER7_PERIOD = 0x0000FFFF; и Вы хотите, чтобы конкретный таймер можно было задать где в заголовке дефайном, типа
#define MY_TIMER TIMER7
и чтобы, при необходимости, можно было в одном месте поменять номер таймера не редактируя весь исходник. Это можно сделать макросами как я описал:
#define MY_TIMER TIMER7
...
*concatABC(p, MY_TIMER, _PERIOD) = 0x0000FFFF;

Если Вы хотели нечто другое, то формулируйте вопрос яснее.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 18 2015, 10:28
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(jcxz @ Dec 18 2015, 13:16) *
А что именно непонятно?
...



Непонятно как эта двухуровневая конструкция работает wacko.gif Так то понятно, я это и хотел, но простая конкатенация с одним уровнем не работает. Компилятор сразу подставляет MY_TYMER вместо TIMER7

Цитата(barabek @ Dec 18 2015, 10:32) *
Добавлю. Поля структуры это регистры периферии (на сленге : поля замапены на регистры). Если вы какие-то поля (читай - регистры) не используете по прямому назначению, то как вы их еще можете использовать?


Бывают регистры, которые в таймере добавляют какой-то функционал. Например статус, маска прерываний. А мне нужен просто ШИМ выход для подсветки, без всяких статусов. Но это уже неважно. Я понял что никакой переменной-структуры не создается, а определение структуры нужно лишь для задания смещений относительно первого регистра конкретного таймера. Если они все расположены друг за другом (вроде других вариантов пока не встречал), то хороший метод
Go to the top of the page
 
+Quote Post
Флюктуация вакку...
сообщение Dec 18 2015, 14:01
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 346
Регистрация: 15-12-13
Из: Планета Земля
Пользователь №: 79 630



Народ! Да выясните наконец подерживает компилятор топикстартера вложенные макросы или нет.
И вопрос будет решен. В ту или иную сторону. Однозначно.
Чего мы мучаетесь - не пойму. Проблема-то яйца выеденного не стоит
Go to the top of the page
 
+Quote Post
Herz
сообщение Dec 18 2015, 14:06
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(Флюктуация ваккума @ Dec 18 2015, 16:01) *
Чего мы мучаетесь - не пойму. Проблема-то яйца выеденного не стоит

5 баллов. Действительно, чего Вы мучаемся? Скучно?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:03
Рейтинг@Mail.ru


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