|
|
  |
STM32F4 ADC DMA ? |
|
|
|
Jul 23 2012, 12:48
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
ViKo, Оптимизация ради оптимизации приносит только потерю вашего времени к сожалению. В итоге получаете код плохочитаемый, плохопереносимый - поменять канал таймера например - целая история. А вообще люди пишут свои USB библиотеки, TCP стеки, Оси, да что там говорить - компиляторы пишут  . Так что на этом фоне работать с регистрами это не такой уж страшный велосипед (или фобия).
Сообщение отредактировал kan35 - Jul 23 2012, 12:53
|
|
|
|
|
Jul 23 2012, 12:58
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Allregia @ Jul 23 2012, 15:46)  Конкретно указанная выше функция занимет 70 байт. Я наверное просто лопнул бы от счастья сьекономить на ней 10-20 байт.... Когда я начинал программировать STM32F103, инициализация с использованием библиотеки заняла у меня что-то около 2,7 KB. Меня это удивило. Ваша функция adc_init() занимет 70 байтов? Не желаете ли сделать еще одно усилие, и посчитать в листинге? Было бы интересно узнать, сколько же заняла. Моя ADC_init() заняла 80 байтов. Цитата P.S. Но примечательно другое - я написал сообщение вчера днем. И за весь вечер и все утро не нашлось ни одного человека. который бы чем-то помог. На это есть очевидная причина.  Цитата(kan35 @ Jul 23 2012, 15:48)  Так что на этом фоне работать с регистрами это не такой уж страшный велосипед (или фобия). Так это мне в плюс или в минус?
|
|
|
|
|
Jul 23 2012, 19:38
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(kan35 @ Jul 23 2012, 16:30)  Это конечно все лирика, но все же доверять только собственным исходным кодам практика довольно пагубная для инженера, согласитесь. Лично я не сталкивался (не помню), но на форуме проскакивали сообщения, где говорилось про ошибки в библиотеке. А чтобы найти такие ошибки, придется и по функциям пройтись, и по регистрам. Вот это, действительно, кошмар.
|
|
|
|
|
Jul 23 2012, 20:04
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(kan35 @ Jul 23 2012, 16:30)  Это плюс несомненно. А вообще, вы задавались вопросом "почему появились библиотеки периферии" - очень просто: периферия стала жутко сложная, регистры 32 битные - битов дополна. И программировать их напрямую как минимум долго, неудобно и надо постоянно рыться в референсмануале на 1000 страниц.
Это конечно все лирика, но все же доверять только собственным исходным кодам практика довольно пагубная для инженера, согласитесь. О сложностях, кстати. Да, периферия стала сложная поэтому не надо ее еще усложнять дополнительными абстракциями. Для меня, например, не постижимо по названию функции TIM2_Init понять зачем она нужна и что делает. Запомнить ее назначение можно только постоянно с ней имея дело (вынужденно, поскольку дольше приходится писать инициализацию) и детально просмотрев ее код, поскольку здесь нет ничего интуитивно понятного. Гораздо проще найти в мануале описание таймера где все регистры описаны на паре страниц, и записать этот десяток регистров используя битовые маски. Заимствовать исходники нужно когда они выполняют действительно объемные задачи. А здесь пару строк записи в регистры заменяют огромными библиотеками.
|
|
|
|
|
Jul 24 2012, 04:10
|
Знающий
   
Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594

|
Цитата(AlexandrY @ Jul 24 2012, 00:04)  Для меня, например, не постижимо по названию функции TIM2_Init понять зачем она нужна и что делает. Запомнить ее назначение можно только постоянно с ней имея дело (вынужденно, поскольку дольше приходится писать инициализацию) и детально просмотрев ее код, поскольку здесь нет ничего интуитивно понятного. Гораздо проще найти в мануале описание таймера где все регистры описаны на паре страниц, и записать этот десяток регистров используя битовые маски. Резонное замечание. Однако для того, чтобы впадать в отчаяние видя гору функций с непонятными именами (хотя на мой взгляд достаточно понятными) можно обратиться к примерам, которые включены в библиотеку, а так же включен пустой шаблон (template) от которого можно быстро стартовать. В этих примерах разобраны наиболее востребованные режимы работы периферии, например, для ADC приведено кажется более 10 способов обслуживания. Просто копируете оттуда нужный код и его модифицируете. Библиотека selfdocumented и с помощью "go to definition" можно быстро прыгнуть к поснению. Есть еще мощная штука - "Find in files" :-) - быстро все ставит на свои места
|
|
|
|
|
Jul 24 2012, 06:51
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Я использую библиотеки и могу сказать, что они слегка идеологически недоделанные, т.е. приходится самому реализовывать некоторый удобный и очевидный для меня функционал. Например: CODE static void uart_init_rcc(uart_t* const uart) { switch ((uint32_t)uart->sfr) { case USART1_BASE: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); break; case USART2_BASE: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); break; case USART3_BASE: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); break; #ifdef USART4 case USART4_BASE: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE); break; #endif
#ifdef USART5 case USART5_BASE: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART5, ENABLE); break; #endif default: return; }
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // Enable AFIO clock }
static void uart_init_nvic(uart_t* const uart) { switch ((uint32_t)uart->sfr) { case USART1_BASE: NVIC_EnableIRQ(USART1_IRQn); break; case USART2_BASE: NVIC_EnableIRQ(USART2_IRQn); break; case USART3_BASE: NVIC_EnableIRQ(USART3_IRQn); break; #ifdef USART4 case USART4_BASE: NVIC_EnableIRQ(USART4_IRQn); break; #endif
#ifdef USART5 case USART5_BASE: NVIC_EnableIRQ(USART5_IRQn); break; #endif default: return; } } Работа с GPIO у меня полностью своя, кочующая из проекта в проект, независимо от архитектуры контроллера. Считаю что если что-то решается гладко при помощи библиотеки стоит так и решать, ибо инициализация - это, так сказать, разовая акция и на скорость критически влиять не может. А что то до экономии пары сотен байт байт то это смешно. И аргументы насчёт непонятных названий библиотечный функций тоже для меня не понятны...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 24 2012, 09:48
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
А почему все зациклились на инициализации? Разве библиотека не навязывает использование ее же в обработчиках прерываний и вообще в любой точке кода, в которой нужно обращение к периферии? Интересно узнать от использующих библиотеку, во что выливается библиотечная функция чтения флага прерывания? Во что выливается сброс флага или двух флагов? Без библиотеки я знаю, чего мне это стоит: CODE 151:././../common/rf/transmitter.cpp **** DMA1->IFCR = DMA_IFCR_CHTIF3 | DMA_IFCR_CTCIF3; 1027 .loc 1 151 0 1028 003c 3C4B ldr r3, .L76+8 @ tmp165, 1029 003e 4FF4C062 mov r2, #1536 @ tmp166, 1030 0042 5A60 str r2, [r3, #4] @ tmp166, MEM[(struct DMA_TypeDef *)1073872896B].IFCR Могу ли я позволить себе тут полноценный вызов функции с подготовкой ее параметров и прочими накладными расходами? Наверное конкретно в этом случае могу, даже несмотря на то, что это обработчик прерывания. Но этот вызов будет лишь способствовать глобальному потеплению. А где-то эта лишняя задержка может уже существенно ударить по энергопотреблению или производительности конечного устройства. Полагаю, что все эти наши споры происходят лишь по одной причине - если бы обращения к библиотеке компилировались бы в такие же обращения к регистрам без лишних накладных расходов, то противников библиотеки практически не осталось бы. Я бы сам первый начал ее использовать. И чем больше людей бы ее использовали, тем быстрее в ней нашлись бы все (почти  ) ошибки. Но пока добавляемые библиотекой накладные расходы лично для меня неприемлемы. Кстати, будет интересно посмотреть, во что выливается DMA1->IFCR = DMA_IFCR_CHTIF3 | DMA_IFCR_CTCIF3; при использовании библиотеки. P.S. Вообще все эти войны С/Асм, С/С++, Регистры/библиотека очень напоминают замечательный мультик: http://www.youtube.com/watch?v=JMJXvsCLu6s...player_embedded
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 24 2012, 17:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Сергей Борщ @ Jul 24 2012, 11:48)  А почему все зациклились на инициализации? Разве библиотека не навязывает использование ее же в обработчиках прерываний и вообще в любой точке кода, в которой нужно обращение к периферии? Не знаю как другим, а мне - не навязывает. Я пользуюсь библиотеками, но там где time critical и надо шевелить ножками или флагами, пишу обычно типа: Код __INLINE void TestPinOn(void) { GPIOD->BSRRL = GPIO_Pin_15; } // 1=on, __INLINE void TestPinOff(void) { GPIOD->BSRRH = GPIO_Pin_15; } // 0=off __INLINE void TestPinToggle(void){ GPIOD->ODR ^= GPIO_Pin_15; }
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|