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

 
 
> Привязка структур к аппаратуре
Dog Pawlowa
сообщение Feb 19 2008, 16:09
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Обычный С.
В системе есть несколько идентичных узлов (управление температурой, двигатели), описываемых структурами переменных. Стоит задача сокращения текста программы. Вариантов три - макросы, функции и их комбинации.

Вначале сделал вариант с макросами, и он работает

Код
#define MOTOR_SERVICE(OBJ, MOT)                        \
    if (!OBJ##.time)                                 \
        {        PWM##MOT=PWM_TOP+1; HIGH_MODE##MOT;        \
                OBJ##.state=moSTOPPED;                \
        }                                    \
    else     {    if (OBJ##.speed==0)                         \
                    {    PWM##MOT=PWM_TOP+1; HIGH_MODE##MOT;    \
ну и так далее...

В этом макросе параметры - имя структуры и номер, который служит для обращения к нужным портам через другие макросы.

Но у макросов есть недостатки:
- трудность отладки (в отладчике IAR в этом случае нет привязки к строкам кода С)
- трудности привязки ошибки компиляции к месту в макросе
- ну и размер кода, конечно.

Хотелось бы использовать функции с параметром указателя на структуру, причем чтобы и работа с портами легко укладывалась в этот стройный подход.
Вопрос - как это сделать красиво, если там разные входы, выходы, и собственно сами регистры.
Добавить с структуру указатели на функции? Добавить в параметры функции индекс, который использовать для выбора функций работы с портами из массива, как в примере макроса?
Может, что-то еще?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Feb 19 2008, 20:17
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Dog Pawlowa @ Feb 19 2008, 19:09) *
Хотелось бы использовать функции с параметром указателя на структуру, причем чтобы и работа с портами легко укладывалась в этот стройный подход.

С указателем на порт в общем случае IMHO не получится - во первых таймеры разные и могут быть биты в разных местах, доступ к порту через указатель часто не оптимален.
Хотя если указатель на PWM регистр можно его рассматривать как указатель на volatile (главное если 16 бит по байтам писать в нужном порядке). Но доступ к GPIO особенно на уровне бит будет кривой совсем.

Я реализовывал как и у вас через макросы! и ##


Цитата(prottoss @ Feb 19 2008, 19:32) *
Перейти на С++

Есть и такой вариант использовать template
главное что бы компилер не глючил!
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 19 2008, 20:56
Сообщение #3


дятел
*****

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



Цитата(KRS @ Feb 19 2008, 23:17) *
С указателем на порт в общем случае IMHO не получится - во первых таймеры разные и могут быть биты в разных местах, доступ к порту через указатель часто не оптимален.
Хотя если указатель на PWM регистр можно его рассматривать как указатель на volatile (главное если 16 бит по байтам писать в нужном порядке). Но доступ к GPIO особенно на уровне бит будет кривой совсем.
ИМХО, все это зависит от конкретного проца и от конкретной задачи,
Если речь об управляющих регистрах, и биты попутаны местами то там и макросы не очень...,
а если речь о регулярных регистрах(там где задается значение в 16ричном виде), там вариантов
масса, например массивы адресов регистров и к примеру масок для них.
Только все равно, по хорошему, для таких вариантов нужно четко определять volatile доступ
к таким адресам, и проще всего это сделать через макросы.
Вобщем, ИМХО, нужно видеть задачу что бы сказать как будет выгоднее.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:39
Рейтинг@Mail.ru


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