|
|
  |
возможно ли на Си, объединить биты регистров портов микроконтроллера |
|
|
|
Jun 14 2009, 22:00
|

Гуру
     
Группа: Свой
Сообщений: 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); Ровным счетом никаких отличий  Вы написали "десяток функций" для дергания пином с разными именами, кто-то напишет десяток макросов с разными именами, кто-то опишет десяток дефайнов для макросов а-ля Волков.. На самом деле из всех этих вариантов самый правильный скорее всего будет тот, кто банально содержит минимум разных букв. Зачастую меня более всего устраивает и такое самое простое и незатейливое: Код #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
|
|
|
|
|
Jun 14 2009, 22:13
|

кекс
     
Группа: Свой
Сообщений: 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)  Ровным счетом никаких отличий  Ну как же никаких... Вы можете поставить макрос в очередь задачь? А инлайн функцию - запросто, компилер поймет что от него хотят. Там где можно заинлайнит, там где нужно вызовет по адресу.
|
|
|
|
|
Jun 14 2009, 22:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Jun 15 2009, 02:03)  Вы читали о чем я пишу? Я пишу что надо забыть о портах, номерах пинов, и т.п. чтобы спалось спокойно. Наверное пока не уловил, поэтому и переспрашиваю...  Цитата Kernel у меня работает с функциями и с задачами а не с идентификаторами пинов. А может Вашему кернелу уже работать с объектами а не с отдельными сущностями ? Цитата Точно также как в примере с реле я работаю и с более сложными процессами: modem_Dial(); Kernel_SetCb( modem_Dial, 60000, SEMA_NULL); // повторный дозвон через минуту если не удалось дозвониться. совсем не уловил почему countdown счетчик для пина должен принципиально отличаться от таково же для модема ?
|
|
|
|
|
Jun 14 2009, 22:25
|

кекс
     
Группа: Свой
Сообщений: 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 счетчик для пина должен принципиально отличаться от таково же для модема ? Блин... дак ничем он и не отличается.
|
|
|
|
|
Jun 14 2009, 22:30
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Jun 15 2009, 02:25)  Блин... дак ничем он и не отличается.  Ну а если ничем не отличается, то легко реализуем с помощью макросов... и очень даже эфективненько... Ну положите в конце концов адрес функции обработчика при инициализации... зачем его каждый раз передавать ?
|
|
|
|
|
Jun 14 2009, 22:37
|

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

|
Цитата(singlskv @ Jun 15 2009, 01:30)  Ну а если ничем не отличается, то легко реализуем с помощью макросов... и очень даже эфективненько... Что реализуемо с помощью макросов? Изобразите свой полет мысли, а то получается разговор слепого с глухим. Цитата Ну положите в конце концов адрес функции обработчика при инициализации... куда положить? Цитата зачем его каждый раз передавать ? Чтобы можно было зарегистрировать сколько угодно и каких угодно колбеков вестимо, с разными таймаутами и разными условиями запуска.
|
|
|
|
|
Jun 15 2009, 05:37
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(defunct @ Jun 15 2009, 01:13)  Вы можете поставить макрос в очередь задачь? А инлайн функцию - запросто, компилер поймет что от него хотят. Там где можно заинлайнит, там где нужно вызовет по адресу. В моем понимании макрос работы с портами - это действие, которое должно быть выполнено сейчас же. Ногодрыганье в самом чистом виде, без малейшей возможности компилятору сделать шаг в сторону  "Прокладка" для портирования. Если предусматривается какая-то более сложная логика, то это не совсем порт, а, скажем объект какой-то типа звукового сигнала со своими параметрами, или моргающего светодиода, как в примере zltigo. Для обслуживания такого "объекта" прописывается свой сервис в каком-нить бэкграунде. Его параметры устанавливаются типа так: void Beep (unsigned int ms, char beeps_qty), после чего "приложение" забывает о существовании этого объекта. Типичная организация системы без ОС. В Вашем варианте смешаны в кучу и быстрые действия и медленные, в результате быстрые могут оказаться не такими быстрыми, как иногда требуется.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 15 2009, 06:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(ReAl @ Jun 14 2009, 23:46)  где "корень всех зол" в виде макросов отсутствует? 1. Я нигде не утверждал, что макрос - страшное, ужасное зло. Бывают случаи, когда только они и работают. 2. "Букварный пример" он на то и пример, чтобы просто показать "подводные камни" макропрограммирования. 3. Все очень быстро в пылу дисскуссии забывают изначальный вопрос автора топика. 4. Любую программу можно написать десятком разных способов. Не спроста Кнут назвал свои книги "Искусство программирования". 5. Примеры с разложенными по строкам if .. else и тернарный оператор ? в 99% случае компилятором генерируются в одинаковый машинный код. Тут, как говорится, на вкус и цвет... 6. В большинстве случаев (есть и исключения) книги по программированию написаны людьми лично принимавшими участие в больших и огромных проектах и не знакомиться с их практическим опытом просто не разумно.
|
|
|
|
|
Jun 15 2009, 06:46
|

кекс
     
Группа: Свой
Сообщений: 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)) Когда точно уверен, что мне никогда не понадобится свойство функции от этого действия.
|
|
|
|
|
Jun 15 2009, 07:05
|

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

|
Цитата(defunct @ Jun 15 2009, 01:25)  А если проц поменялся? У меня это просто: hal_SPI0_Prepare(); Ничего не мешает и подниматься на более высокие уровни абстракции HAL - пример со сведодиодом я лично приводил. В этом случае задача абстрагироваться от смены прцессора не ставилась, причина более чем проста - SPI все несколько разные и нагрузка у меня на них большая,посему совсем не хочется все SPI стричь под одну гребенку, дабы все выглядели в угоду HAL одинаково. Причем, как правило, равняясь по слабейшему, они будут выглядеть одинаково уродливо  . Даже на более высоком уровне абстракции "драйвер" не всегда несколько контроллеров хорошо стригутся под одну гребенку. Много чего обычно приходится придумвать для эффективной работы не вообще, например, "SPI" (про разные MAC, CAN,... вообще молчу) а "конкретного SPI" и на фоне этих работ, меня, честно говоря, совсем не волнуют "пролемы" HAL для одинокого пина  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 15 2009, 08:03
|

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

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