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

 
 
> Сложная автозамена через #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
 
Start new topic
Ответов
SSerge
сообщение Dec 9 2015, 11:33
Сообщение #2


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

Группа: Свой
Сообщений: 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
kolobochishe
сообщение Dec 16 2015, 15:42
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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
jcxz
сообщение Dec 18 2015, 08:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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   Сложная автозамена через #define   Dec 9 2015, 08:59
- - psL   http://stackoverflow.com/questions/1489932...macro...   Dec 9 2015, 09:10
|- - jcxz   Цитата(kolobochishe @ Dec 9 2015, 14:59) ...   Dec 15 2015, 12:48
|- - barabek   Цитата(kolobochishe @ Dec 17 2015, 01:42)...   Dec 16 2015, 22:18
||- - kolobochishe   Цитата(barabek @ Dec 17 2015, 03:18) Ошиб...   Dec 17 2015, 10:12
||- - barabek   Цитата(kolobochishe @ Dec 17 2015, 20:12)...   Dec 17 2015, 10:22
||- - demiurg_spb   Цитата(kolobochishe @ Dec 17 2015, 13:12)...   Dec 17 2015, 10:37
||- - barabek   Цитата(kolobochishe @ Dec 17 2015, 20:12)...   Dec 18 2015, 05:32
|- - kolobochishe   Цитата(jcxz @ Dec 18 2015, 13:16) А что и...   Dec 18 2015, 10:28
|- - jcxz   Цитата(kolobochishe @ Dec 18 2015, 16:28)...   Dec 21 2015, 08:11
|- - Dog Pawlowa   Цитата(kolobochishe @ Dec 18 2015, 13:28)...   Dec 23 2015, 00:30
- - Флюктуация ваккума   Нужно ипользовать вложенные макросы. Т.е. вызов ма...   Dec 16 2015, 18:35
- - Флюктуация ваккума   Народ! Да выясните наконец подерживает компиля...   Dec 18 2015, 14:01
|- - Herz   Цитата(Флюктуация ваккума @ Dec 18 2015, 16...   Dec 18 2015, 14:06
- - GetSmart   В продолжение темы. В исходниках V-USB часто встре...   Apr 28 2016, 17:28
|- - AleksBak   Цитата(GetSmart @ Apr 28 2016, 21:28) В п...   Apr 29 2016, 03:17
|- - Сергей Борщ   QUOTE (AleksBak @ Apr 29 2016, 06:17) т.к...   Apr 29 2016, 06:23
|- - AleksBak   Цитата(Сергей Борщ @ Apr 29 2016, 10:23) ...   Apr 29 2016, 06:55
|- - Сергей Борщ   QUOTE (AleksBak @ Apr 29 2016, 09:55) В с...   Apr 29 2016, 08:08
|- - GetSmart   ЦитатаThe argument list is enclosed in parentheses...   May 3 2016, 16:39
|- - SSerge   Цитата(GetSmart @ May 3 2016, 23:39) Вопр...   May 4 2016, 16:33
- - k155la3   Если возникает сомнение в том - как использовать ...   Apr 29 2016, 05:48
- - ViKo   Про особенности #define еще Керниган с Ричи в свое...   Apr 29 2016, 08:15


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

 


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


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