Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: возможно ли на Си
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
defunct
Цитата(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
singlskv
Цитата(defunct @ Jun 15 2009, 02:25) *
Блин... дак ничем он и не отличается. smile.gif
Ну а если ничем не отличается, то легко реализуем с помощью макросов...
и очень даже эфективненько...

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

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

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

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

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

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


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

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

В Вашем варианте смешаны в кучу и быстрые действия и медленные, в результате быстрые могут оказаться не такими быстрыми, как иногда требуется.
sergeeff
Цитата(ReAl @ Jun 14 2009, 23:46) *
где "корень всех зол" в виде макросов отсутствует?


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

Неубедительно. Я то никогда не буду принимать участие в огромном проекте smile.gif
defunct
Цитата(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))


Когда точно уверен, что мне никогда не понадобится свойство функции от этого действия.
zltigo
Цитата(defunct @ Jun 15 2009, 01:25) *
А если проц поменялся? У меня это просто:
hal_SPI0_Prepare();

Ничего не мешает и подниматься на более высокие уровни абстракции HAL - пример со сведодиодом я лично приводил. В этом случае задача абстрагироваться от смены прцессора не ставилась, причина более чем проста - SPI все несколько разные и нагрузка у меня на них большая,посему совсем не хочется все SPI стричь под одну гребенку, дабы все выглядели в угоду HAL одинаково. Причем, как правило, равняясь по слабейшему, они будут выглядеть одинаково уродливо sad.gif. Даже на более высоком уровне абстракции "драйвер" не всегда несколько контроллеров хорошо стригутся под одну гребенку. Много чего обычно приходится придумвать для эффективной работы не вообще, например, "SPI" (про разные MAC, CAN,... вообще молчу) а "конкретного SPI" и на фоне этих работ, меня, честно говоря, совсем не волнуют "пролемы" HAL для одинокого пина sad.gif.
sergeeff
Цитата(Dog Pawlowa @ Jun 15 2009, 09:44) *
Неубедительно. Я то никогда не буду принимать участие в огромном проекте smile.gif


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

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

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

Так значит тут - "на вкус и цвет", а макросы - снижают читаемость и сопровождаемость текста?
SasaVitebsk
Цитата(Dog Pawlowa @ Jun 14 2009, 13:49) *
Описываю весь доступ к портам через макросы в одном h-файле и не парюсь.
В прочих файлах НИКАКОГО упоминания о портах, только макросы с осмысленными названиями. Просто для понимания. Существенно упрощает портирование.
К сожалению, есть проблема инлайнить функции, определенные в других модулях, теоретически можно тоже через #include, но это уж точно на изврат похоже.

Поступаю также. Один в один.
Как раз для переносимости очень удобно. Чётко знаешь что этот файл придётся переписать.
Никакой неразберихи в файлах проекта у меня не возникает, так как там уже используются "осмысленные" макросы. Типа LED_ON или RG_STB. Для одного проекта (проца) может быть LED_ON единицей, для другого нулём. Это не имеет значение. Так как правится макрос, и он по макросу LED_ON загорается. (Естественно я упрощаю). Можно былобы ожидать, что этот файл большим будет, но на самом деле - совсем пустяковый. Всё сведено в одно место, сразу видны все биты и порты, видна их инициализация. Короче очень удобно.

Если разработчик работает в коллективе, то должны быть определены какие то общие правила оформления проекта. Они должны постоянно корректироваться. Разработчики должны их придерживаться. Если груповой проект, то должен составляться план поекта и какие-то доп правила оформления (к типовым правилам).
sergeeff
Цитата(ReAl @ Jun 15 2009, 11:03) *
Так значит тут - "на вкус и цвет", а макросы - снижают читаемость и сопровождаемость текста?


Макросы - это препроцессор, т.е. "до компилятора". Варианты if... и ? - компилятор. Вы лично часто изучаете листинг препроцессора? Уверен - почти никогда. Значит вы просто полагаетесь на то, что вы со своим многолетним опытом, ошибок при написании макросов не допускаете и препроцессор все сделал именно так, вы себе это представляете. А если ошибка есть, она трудноуловима (при одних данных есть, при других - нет, а еще хуже при одних типах данных - есть, при других - нет). Вам что больше по душе, чтобы компилятор вам хотя бы подсказывал про подобные потенциальные проблемы, или молча, по своему усмотрению чего-то там понаделал, а вы потом, "по вторичным половым признакам" аномального поведения программы это все вылавливали?
zltigo
Цитата(SasaVitebsk @ Jun 15 2009, 11:24) *
Всё сведено в одно место, сразу видны все биты и порты, видна их инициализация....

...и взаимосвязь со взаимоисключениями. Причем, этот файл на самом деле и внутри сруктурирован - те-же биты, хоть и для светодиодов поименованы и соответсвенно ниже по файлу, т.е. уже уровнем выше smile.gif используются только эти имена. Все это хозяйство компактно, лаконично и достаточно легко изучается в том числе и глазами.
SasaVitebsk
Цитата(zltigo @ Jun 15 2009, 13:43) *
...и взаимосвязь со взаимоисключениями. Причем, этот файл на самом деле и внутри сруктурирован - те-же биты, хоть и для светодиодов поименованы и соответсвенно ниже по файлу, т.е. уже уровнем выше smile.gif используются только эти имена. Все это хозяйство компактно, лаконично и достаточно легко изучается в том числе и глазами.

Именно так. Единственно, что я струкурирую по портам. Типа беру бит, обзываю его и объявляю макросы работы с ним с учётом специфики. Это даёт возможность не пропустить какой-либо бит. Так же комментирую этот бит если надо. С точки зрения программиста, часто схема просто не нужна. Точнее её он структурно представляет, а управление ей он читает именно в этом файле. При возвращении к проекту, чаще всего заглядываю именно в этот файл, для того чтобы вспомнить весь проект.
Кроме того с помощью условной компиляции, либо сменой данного файла, вы можете версию платы менять. Например в версии 1а сменили ноги при переразводке.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.