|
STM32H7+DCMI+DMA+обработка |
|
|
|
Sep 18 2018, 09:14
|
Группа: Участник
Сообщений: 7
Регистрация: 10-04-17
Пользователь №: 96 446

|
Всем привет! Кто-нибудь использует в своих проектах STM32H7? Очень интересная диковинка, с которой достаточно не просто разобраться... Суть вопроса в чем: пытаемся реализовать проект на борде пока что, снимается сигнал с аналоговой линейки, который подается на внешний АЦП и от этого АЦП идет параллельный интерфейс к DCMI (14 бит). Далее DCMI укладывает по DMA в (u16). Далее, начинается самое интересное... Чтобы обработать сигнал необходимо найти максимум в массиве.. Массив представляет из себя u16 и 512 кол-во элементов.. Этот цикл занимает по времени около 120 мкс? Мне кажется это не адекватно, это примерно уровень f4. CPU настроен на 400 МГЦ. Какие могут быть идеи? Может есть какие-то особенности для H7? Кэш используется
|
|
|
|
|
 |
Ответов
|
Sep 18 2018, 11:52
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aaarrr @ Sep 18 2018, 14:42)  На F4@168MHz такой цикл занимает 42мкс. Оптимизацию не забыли включить? И в какой памяти источник данных расположен? Вангую, что автор не только оптимизацию забыл включить, но прерывания забыл запретить при "измерении"  И 168*42/512 = 13.78125 тактов на один элемент - всё равно как-то многовато..... Цитата(Eros @ Sep 18 2018, 13:44)  Если есть на чем потестить, просто создайте массив, забейте константными значениями и найдите максимум, интересно за сколько справиться H7 .....и в зависимости от этих значений и результата компиляции цикла, получатся совершенно разные результаты - средняя температура по больнице.
|
|
|
|
|
Sep 18 2018, 13:26
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Tanya @ Sep 18 2018, 16:04)  Это как от значений? Так как неизвестно во что скомпилится этот сишный исходник, то возможно там будут команды условного перехода при сравнениях. И тогда: идём по одной ветке после сравнения - одно число тактов, по другой - другое. Такие простые вещи оптимизировать можно только на ассемблере. Вот например так (вроде этого хочет ТС): CODE PUBLIC FindMaxU16 ;extern "C" uint FindMaxU16(u32 *); THUMB FindMaxU16: PUSH {R4-R9, LR} MOVS R2, #512 / 16 - 1 MOVS R1, #0 p111: SUBS R2, #1 LDMIA R0!, {R3-R9, R12} USUB16 LR, R1, R3 SEL R1, R1, R3 USUB16 LR, R1, R4 SEL R1, R1, R4 USUB16 LR, R1, R5 SEL R1, R1, R5 USUB16 LR, R1, R6 SEL R1, R1, R6 USUB16 LR, R1, R7 SEL R1, R1, R7 USUB16 LR, R1, R8 SEL R1, R1, R8 USUB16 LR, R1, R9 SEL R1, R1, R9 USUB16 LR, R1, R12 SEL R1, R1, R12 BPL p111 CMP R1, R1, LSL #16 IT CC LSLCC R1, R1, #16 LSRS R0, R1, #16 POP {R4-R9, PC} Указатель (аргумент FindMaxU16()) должен быть выровнен на границу 32 бит. И данные должны быть в диапазоне: 0...32767 (ТС вроде говорил про 14-битные данные - тогда должно подойти). Этот код выполняется за ~963 такта. Нетрудно пересчитать в мкс если надо. На CPU ТС-а должно быть ~2.5 мкс. И время выполнения от данных тут не зависит.
|
|
|
|
|
Sep 18 2018, 14:10
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Tanya @ Sep 18 2018, 16:59)  Так ведь исходник будет независимо от чисел, которые должны быть перемолоты, оттранслирован при прочих равных условиях. Или нет? Исходник независимо - ну и что? Выполняться он будет за разное число тактов, в зависимости от данных. Я говорил о том, что тест проведённый ТС-ом для его исходника - некорректен, так как выполнение его исходника будет зависеть от данных. А значит нужно указывать - на каком наборе данных тестировать, или тестировать для самого худшего случая. PS: Код, который я привёл - он для CM4. Возможно на CM7 появились ещё какие-то новые команды, с помощью которых можно ещё оптимизировать. Не знаю. Всё в руках ТС-а.
|
|
|
|
|
Sep 19 2018, 05:38
|
Группа: Участник
Сообщений: 7
Регистрация: 10-04-17
Пользователь №: 96 446

|
Цитата(jcxz @ Sep 18 2018, 17:10)  Исходник независимо - ну и что? Выполняться он будет за разное число тактов, в зависимости от данных. Я говорил о том, что тест проведённый ТС-ом для его исходника - некорректен, так как выполнение его исходника будет зависеть от данных. А значит нужно указывать - на каком наборе данных тестировать, или тестировать для самого худшего случая. PS: Код, который я привёл - он для CM4. Возможно на CM7 появились ещё какие-то новые команды, с помощью которых можно ещё оптимизировать. Не знаю. Всё в руках ТС-а.  Я указывал, что изначально массив заполняется по возрастанию, т.е. это и будет по сути самый худший случай. Еще что у меня получилось: собрал с максимальной оптимизации (мой косяк, не заметил) получилось 65 мкс, и потом попробовал запретить прерывания получилось 50 мкс. Спасибо за совет, сейчас попробую ради интереса на ассемблере и использовать TCM RAM.
Сообщение отредактировал Eros - Sep 19 2018, 05:44
|
|
|
|
Сообщений в этой теме
Eros STM32H7+DCMI+DMA+обработка Sep 18 2018, 09:14 Forger На первой странице даташита есть такая фраза:
192 ... Sep 18 2018, 10:14 Eros Цитата(Forger @ Sep 18 2018, 13:14) На пе... Sep 18 2018, 10:16  Forger А какой компилятор используется? Sep 18 2018, 10:31   Eros Цитата(Forger @ Sep 18 2018, 13:31) А как... Sep 18 2018, 10:33    Forger Цитата(Eros @ Sep 18 2018, 13:33) Пользую... Sep 18 2018, 10:34     Eros Цитата(Forger @ Sep 18 2018, 13:34) Да я ... Sep 18 2018, 10:44      Forger Цитата(Eros @ Sep 18 2018, 13:44) Ну кеил... Sep 18 2018, 10:50       Eros Цитата(Forger @ Sep 18 2018, 13:50) В 5й ... Sep 18 2018, 10:58        jcxz Цитата(Eros @ Sep 18 2018, 13:58) Линейны... Sep 18 2018, 11:15     Forger Цитата(Tanya @ Sep 18 2018, 16:59) Или не... Sep 18 2018, 14:08        Eros Цитата(jcxz @ Sep 19 2018, 08:52) А за ск... Sep 19 2018, 05:55 Obam У вас в "LDMIA R0, {R3-R9, R12}" одни и ... Sep 18 2018, 19:38 jcxz Цитата(Obam @ Sep 18 2018, 22:38) У вас в... Sep 18 2018, 19:58 klen здравсвуйте!
а частота семплирования ацп какая... Sep 19 2018, 13:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|