|
Эффективно и быстро управлять линией порта STM32F407 |
|
|
|
May 21 2014, 03:11
|
Частый гость
 
Группа: Свой
Сообщений: 133
Регистрация: 12-01-05
Из: Украина. Чернигов
Пользователь №: 1 908

|
Мне необходимо быстро менять состояние линии порта (програмно, без таймеров и прочего аппаратного). Пишу кусочек кода для проверки скорости функций управления линией порта portC.13. Код while (1) {
HAL_GPIO_TogglePin(GPIOC, 1 << 13);
} Получаю меандр с частотой порядка 2.4MHz. Это очень медленно. Посмотрел как работает функция и переписал код так: Код while (1) {
GPIOC->ODR ^= 1 << 13; } Получил меандр 8.4 MHz Уже лучше, но все равно очень медленно. Учитывая что ядро летает на скорости 168 MHz. Подскажите пожалуйста как сделать управление эффестивнее и быстрее.
Сообщение отредактировал IgorKossak - May 21 2014, 14:49
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
May 21 2014, 04:26
|
Частый гость
 
Группа: Свой
Сообщений: 133
Регистрация: 12-01-05
Из: Украина. Чернигов
Пользователь №: 1 908

|
Нужно просто быстро. Порт сконфигурирован на 100 MHz. Попробовал предложенный способ: Код while (1) { GPIOC->BSRRH = (1 << 13); GPIOC->BSRRL = (1 << 13); } Этот вариант работает быстрее получил частоту 14 MHz Думаю этого будет вполне достаточно. Посмотрел код дизассемблером, выглядит прилично думаю врядли смогу его сильно оптимизировать. Спасибо всем за советы и adnega за его вариант решения.
Сообщение отредактировал IgorKossak - May 21 2014, 14:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
May 21 2014, 05:00
|
Частый гость
 
Группа: Свой
Сообщений: 133
Регистрация: 12-01-05
Из: Украина. Чернигов
Пользователь №: 1 908

|
Цитата(ViKo @ May 21 2014, 10:54)  12 тактов на весь цикл? Многовато. А листинг покажите. GPIOC->BSRRL = (1 << 13); 080002d8: ldr r3, [pc, #16] ; (0x80002ec <main+116>) 080002da: mov.w r2, #8192 ; 0x2000 080002de: strh r2, [r3, #24] 117 GPIOC->BSRRH = (1 << 13); 080002e0: ldr r3, [pc, #8] ; (0x80002ec <main+116>) 080002e2: mov.w r2, #8192 ; 0x2000 080002e6: strh r2, [r3, #26] 120 } 080002e8: b.n 0x80002d8 <main+96> Как-то так
|
|
|
|
|
May 21 2014, 05:37
|
Частый гость
 
Группа: Свой
Сообщений: 133
Регистрация: 12-01-05
Из: Украина. Чернигов
Пользователь №: 1 908

|
Цитата(scifi @ May 21 2014, 11:26)  Плохенький листинг. Четыре инструкции просятся, чтобы их вынесли за цикл. Оптимизация по скорости не была включена, видимо. На самом деле мне цикл и не нужен , нужно просто устанавливать порт в нужное состояние. Я использую цикл для наглядности, для проверки сколько времени нужно чтобы порт в нужное состояние установить. Хoтя с оптимизацией надо бы разобраться. У меня Eclipse и GNU Tools ARM Embedded Тут такой опции нет "Speed optimize" есть "Optimize most" Цитата(scifi @ May 21 2014, 11:34)  Потому и говорю: оптимальный по скорости результат гарантированно можно получить только при помощи ассемблера. По видимому дальше можно улучшать только ассемблером. Подскажите пожалуйста как правильно оформить ассемблерную вставку, например для этой программы. Спасибо.
|
|
|
|
Сообщений в этой теме
derun Эффективно и быстро управлять линией порта STM32F407 May 21 2014, 03:11 adnega Цитата(derun @ May 21 2014, 11:21) Мне не... May 21 2014, 03:24 ViKo Цитата(adnega @ May 21 2014, 10:34) Кодwh... May 21 2014, 04:06 Golikov A. скорость ножки задали? Надо задать максимальную ча... May 21 2014, 03:54 demiurg_spb Цитата(scifi @ May 21 2014, 12:06) Если х... May 21 2014, 04:08  adnega Цитата(demiurg_spb @ May 21 2014, 12:18) ... May 21 2014, 04:27   demiurg_spb Цитата(adnega @ May 21 2014, 12:37) Bitba... May 21 2014, 04:52    ViKo Цитата(demiurg_spb @ May 21 2014, 12:02) ... May 21 2014, 04:57     demiurg_spb Цитата(ViKo @ May 21 2014, 13:07) Потому ... May 21 2014, 05:08      ViKo Цитата(demiurg_spb @ May 21 2014, 12:18) ... May 21 2014, 05:14       derun Цитата(ViKo @ May 21 2014, 11:24) А оптим... May 21 2014, 05:20        scifi Цитата(derun @ May 21 2014, 13:30) Задава... May 21 2014, 05:24         demiurg_spb Цитата(scifi @ May 21 2014, 13:34) Потому... May 21 2014, 05:39          scifi Цитата(demiurg_spb @ May 21 2014, 13:49) ... May 21 2014, 05:48       demiurg_spb Цитата(ViKo @ May 21 2014, 13:24) Давайте... May 21 2014, 05:38      ViKo Цитата(demiurg_spb @ May 21 2014, 12:18) ... May 21 2014, 05:57 scifi Там ещё одна проблема есть: даже если не нужна точ... May 21 2014, 05:39 adnega Но всегда нужно помнить, что в любой момент может ... May 21 2014, 08:10 megajohn и чё тут меряются строками кода, если нигде не нап... May 21 2014, 08:13  scifi Цитата(megajohn @ May 21 2014, 16:23) и ч... May 21 2014, 08:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|