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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> возможно ли на Си, объединить биты регистров портов микроконтроллера
defunct
сообщение Jun 14 2009, 21:46
Сообщение #46


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 15 2009, 00:39) *
а почему не прокатит-то ?
почему макрос "Kernel_SetCb" не сможет укладывать countdown значение 2000 в соответствующую ячейку массива ?

Потому что Kernel_SetCb делает то что написано в названии - одноразово вызывает заданную функцию по таймауту или по событию в зависимости от того, что произойдет раньше.
Если вместо функции первым параметром дадите макрос (CLR/SET_PIN_X), думаю очевидно, что программа даже нескомпилится, т.к. у макроса не может быть адреса.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 14 2009, 21:54
Сообщение #47


дятел
*****

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



Цитата(defunct @ Jun 15 2009, 01:46) *
Потому что Kernel_SetCb делает то что написано в названии - одноразово вызывает заданную функцию по таймауту или по событию в зависимости от того, что произойдет раньше.
Если вместо функции первым параметром дадите макрос (CLR/SET_PIN_X), думаю очевидно, что программа даже нескомпилится, т.к. у макроса не может быть адреса.
простите, а кто Вас заставляет давать в качестве параметра именно функцию, почему не передавать просто идентификатор пина ?
ну а если уж нужна разная обработка для разных пинов то можно и ссылку передавать и маску пина.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 14 2009, 22:00
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(defunct @ Jun 15 2009, 00:28) *
если зажечь зеленый светодиод, а не красный и не желтый.

hal_GreenLedOn();

вместо

SET_BIT( PORT_HZx, PIN_HZx);
CLR_BIT( PORT_HZy, PIN_HZy);

Ровным счетом никаких отличий sad.gif Вы написали "десяток функций" для дергания пином с разными именами, кто-то напишет десяток макросов с разными именами, кто-то опишет десяток дефайнов для макросов а-ля Волков.. На самом деле из всех этих вариантов самый правильный скорее всего будет тот, кто банально содержит минимум разных букв. Зачастую меня более всего устраивает и такое самое простое и незатейливое:
Код
#define P0B_SPI0_FSEL0    BIT22
#define P0B_SPI0_FSEL1    BIT31
#define IOSET_SPI0 IO0SET
#define SPI0_SEL_MASK    (P0B_SPI0_FSEL1|P0B_SPI0_FSEL0)
....
IOSET_SPI0 = SPI0_SEL_MASK;


И даже для тех-же светодиодов уровень абстакции может, и я считаю- должен, быть заметно выше, нежели ON/OFF
void led_mode( Led_e led, Led_mode_e mode );
led_mode( LED_RED, LM_FLASH_1 );
Задается какой светодиод и десяток режимов миганий. Несклько десятков строк в отдельном файле посященном светодиодам. В файле без всяких слишком многоэтажных наворотов пишется, все , что нужно. Такой HAL, я понимаю.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 14 2009, 22:13
Сообщение #49


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 15 2009, 00:54) *
простите, а кто Вас заставляет давать в качестве параметра именно функцию, почему не передавать просто идентификатор пина ?
ну а если уж нужна разная обработка для разных пинов то можно и ссылку передавать и маску пина.

Вы читали о чем я пишу? Я пишу что, я считаю, надо забыть о портах, номерах пинов, и т.п. чтобы спалось спокойно.

Kernel у меня работает с функциями и с задачами а не с идентификаторами пинов.
Любое __действие__ в общем виде всегда можно описать функцией. Номером пина либо еще какой-то фигней, любое действие не опишешь.

Точно также как в примере с реле я работаю и с более сложными процессами:

modem_Dial();
Kernel_SetCb( modem_Dial, 60000, SEMA_NULL); // повторный дозвон через минуту если не удалось дозвониться.

Цитата(zltigo @ Jun 15 2009, 01:00) *
Ровным счетом никаких отличий sad.gif

Ну как же никаких...
Вы можете поставить макрос в очередь задачь?
А инлайн функцию - запросто, компилер поймет что от него хотят. Там где можно заинлайнит, там где нужно вызовет по адресу.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 14 2009, 22:14
Сообщение #50


дятел
*****

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



Цитата(defunct @ Jun 15 2009, 02:03) *
Вы читали о чем я пишу? Я пишу что надо забыть о портах, номерах пинов, и т.п. чтобы спалось спокойно.
Наверное пока не уловил, поэтому и переспрашиваю... smile.gif
Цитата
Kernel у меня работает с функциями и с задачами а не с идентификаторами пинов.
А может Вашему кернелу уже работать с объектами а не с отдельными сущностями ?
Цитата
Точно также как в примере с реле я работаю и с более сложными процессами:
modem_Dial();
Kernel_SetCb( modem_Dial, 60000, SEMA_NULL); // повторный дозвон через минуту если не удалось дозвониться.
совсем не уловил почему countdown счетчик для пина должен принципиально отличаться от таково же для модема ?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 14 2009, 22:25
Сообщение #51


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(zltigo @ Jun 15 2009, 01:00) *
Зачастую меня более всего устраивает и такое самое простое и незатейливое:
Код
#define P0B_SPI0_FSEL0    BIT22
#define P0B_SPI0_FSEL1    BIT31
#define IOSET_SPI0 IO0SET
#define SPI0_SEL_MASK    (P0B_SPI0_FSEL1|P0B_SPI0_FSEL0)
....
IOSET_SPI0 = SPI0_SEL_MASK;


А если проц поменялся? У меня это просто:
hal_SPI0_Prepare();


Цитата(singlskv @ Jun 15 2009, 01:14) *
А может Вашему кернелу уже работать с объектами а не с отдельными сущностями ?

Вы о чем? Какие отдельные сущности?
Kernel работает с ___функциями____ которые описывают ___любые___ действия любых объектов.

Цитата
совсем не уловил почему countdown счетчик для пина должен принципиально отличаться от таково же для модема ?

Блин... дак ничем он и не отличается. smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 14 2009, 22:30
Сообщение #52


дятел
*****

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



Цитата(defunct @ Jun 15 2009, 02:25) *
Блин... дак ничем он и не отличается. smile.gif
Ну а если ничем не отличается, то легко реализуем с помощью макросов...
и очень даже эфективненько...

Ну положите в конце концов адрес функции обработчика при инициализации...
зачем его каждый раз передавать ?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 14 2009, 22:37
Сообщение #53


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 15 2009, 01:30) *
Ну а если ничем не отличается, то легко реализуем с помощью макросов...
и очень даже эфективненько...

Что реализуемо с помощью макросов? Изобразите свой полет мысли, а то получается разговор слепого с глухим.

Цитата
Ну положите в конце концов адрес функции обработчика при инициализации...

куда положить?

Цитата
зачем его каждый раз передавать ?

Чтобы можно было зарегистрировать сколько угодно и каких угодно колбеков вестимо, с разными таймаутами и разными условиями запуска.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 15 2009, 05:37
Сообщение #54


Гуру
******

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



Цитата(defunct @ Jun 15 2009, 01:13) *
Вы можете поставить макрос в очередь задачь?
А инлайн функцию - запросто, компилер поймет что от него хотят. Там где можно заинлайнит, там где нужно вызовет по адресу.


В моем понимании макрос работы с портами - это действие, которое должно быть выполнено сейчас же. Ногодрыганье в самом чистом виде, без малейшей возможности компилятору сделать шаг в сторону smile.gif "Прокладка" для портирования.

Если предусматривается какая-то более сложная логика, то это не совсем порт, а, скажем объект какой-то типа звукового сигнала со своими параметрами, или моргающего светодиода, как в примере zltigo. Для обслуживания такого "объекта" прописывается свой сервис в каком-нить бэкграунде. Его параметры устанавливаются типа так:
void Beep (unsigned int ms, char beeps_qty), после чего "приложение" забывает о существовании этого объекта. Типичная организация системы без ОС.

В Вашем варианте смешаны в кучу и быстрые действия и медленные, в результате быстрые могут оказаться не такими быстрыми, как иногда требуется.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 15 2009, 06:31
Сообщение #55


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(ReAl @ Jun 14 2009, 23:46) *
где "корень всех зол" в виде макросов отсутствует?


1. Я нигде не утверждал, что макрос - страшное, ужасное зло. Бывают случаи, когда только они и работают.
2. "Букварный пример" он на то и пример, чтобы просто показать "подводные камни" макропрограммирования.
3. Все очень быстро в пылу дисскуссии забывают изначальный вопрос автора топика.
4. Любую программу можно написать десятком разных способов. Не спроста Кнут назвал свои книги "Искусство программирования".
5. Примеры с разложенными по строкам if .. else и тернарный оператор ? в 99% случае компилятором генерируются в одинаковый машинный код. Тут, как говорится, на вкус и цвет...
6. В большинстве случаев (есть и исключения) книги по программированию написаны людьми лично принимавшими участие в больших и огромных проектах и не знакомиться с их практическим опытом просто не разумно.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 15 2009, 06:44
Сообщение #56


Гуру
******

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



Цитата(sergeeff @ Jun 15 2009, 09:31) *
книги по программированию написаны людьми лично принимавшими участие в больших и огромных проектах и не знакомиться с их практическим опытом просто не разумно.

Неубедительно. Я то никогда не буду принимать участие в огромном проекте smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 15 2009, 06:46
Сообщение #57


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Dog Pawlowa @ Jun 15 2009, 08:37) *
В Вашем варианте смешаны в кучу и быстрые действия и медленные, в результате быстрые могут оказаться не такими быстрыми, как иногда требуется.

Если нужно совсем быстро опишу эти быстрые действия в том же HAL как еще одну inline функцию.. делов то..
Вы просто м.б. не представляете насколько это здорово, когда не только программа портируется без изменений с одного проца на другой, но и драйверы периферии портируются тоже практически без изменений (либо с очень небольшим числом таковых).

Цитата
Если предусматривается какая-то более сложная логика, то это не совсем порт,

А кому нужен совсем "порт" в чистом виде то? (ну кроме студентов которые проходят лабораторки по портам).
Надо выполнить действие. выполнить быстро. Тут inline функция работает ничуть не медленнее макроса, плюс к этому качеству она обладает еще и свойством обычной функции, и является частью стандарта языка.

А что такое макрос?

не подумайте что у меня есть какие-то предубеждения к макросам, я их тоже пользую ;> но не для портов, а например так:

Код
/***************************************
* Read access to RTL reg page          *
* ---> Addr 0x00..0x10 (including DMA) *
* <--- returns register value          *
***************************************/
#define nic_ReadReg( addr )\
  (*(V8 *)(NIC_BASE + (addr)))
  

/***************************************
* Write access to RTL reg page         *
* ---> Addr 0x00..0x10 (including DMA) *
* ---> value, data to be stored        *
* <--- returns: nothing                *
***************************************/
#define nic_WriteReg(addr, val)\
  (*(V8 *)(NIC_BASE + (addr)) = (val))


Когда точно уверен, что мне никогда не понадобится свойство функции от этого действия.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 15 2009, 07:05
Сообщение #58


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(defunct @ Jun 15 2009, 01:25) *
А если проц поменялся? У меня это просто:
hal_SPI0_Prepare();

Ничего не мешает и подниматься на более высокие уровни абстракции HAL - пример со сведодиодом я лично приводил. В этом случае задача абстрагироваться от смены прцессора не ставилась, причина более чем проста - SPI все несколько разные и нагрузка у меня на них большая,посему совсем не хочется все SPI стричь под одну гребенку, дабы все выглядели в угоду HAL одинаково. Причем, как правило, равняясь по слабейшему, они будут выглядеть одинаково уродливо sad.gif. Даже на более высоком уровне абстракции "драйвер" не всегда несколько контроллеров хорошо стригутся под одну гребенку. Много чего обычно приходится придумвать для эффективной работы не вообще, например, "SPI" (про разные MAC, CAN,... вообще молчу) а "конкретного SPI" и на фоне этих работ, меня, честно говоря, совсем не волнуют "пролемы" HAL для одинокого пина sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jun 15 2009, 07:11
Сообщение #59


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Dog Pawlowa @ Jun 15 2009, 09:44) *
Неубедительно. Я то никогда не буду принимать участие в огромном проекте smile.gif


1. Как говорится "Умные учатся на чужих ошибках..."
2. Никогда не говори никогда.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 15 2009, 08:03
Сообщение #60


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(sergeeff @ Jun 15 2009, 09:31) *
2. "Букварный пример" он на то и пример, чтобы просто показать "подводные камни" макропрограммирования.
Не спорю. Но с тем же успехом можно Вашу inline-функцию, просто модифицирующую свой собственный аргумент (независимо от того, как в данной системе представлены порты) использовать как пример "подводного камня" при использовании функций. Cобственно, что-то похожее и показывают в разговорах о передаче по ссылке и по значению. Ошибки, на мой взгляд, одного уровня, нормальный человек их может сделать только в начале обучения либо поздно вечером в пылу спора wink.gif

Годится как урок "как не надо делать", а не как аргумент за то, чтобы не использовать.

Цитата(sergeeff @ Jun 15 2009, 09:31) *
5. Примеры с разложенными по строкам if .. else и тернарный оператор ? в 99% случае компилятором генерируются в одинаковый машинный код. Тут, как говорится, на вкус и цвет...
А я об эффективности кода и не говорил. Это иллюстрация к "упрощённый язык для объяснения школьнику" и "общение профессионалов".
Многострочный вариант читается так:
Цитата
если флаг установлен, то такому-то элементу такого-то массива такой-то структуры присвоить а
если же он сброшен, то такому-то элементу такого-то массива такой-то структуры присвоить b
а, одной и той же структуры!
а, одного и того же массива!
а, и индекс одинаковый!
щас... да, точно, всё до буковки одинаково.
значит так, такому-то элементу такого-то массива такой-то структуры в зависимости от флага присвоить a или b
тогда как тернарная операция сразу приводит понимание текста к последней строке. Конечно, только для человека, знающего язык достаточно хорошо.

Так значит тут - "на вкус и цвет", а макросы - снижают читаемость и сопровождаемость текста?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 07:08
Рейтинг@Mail.ru


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