|
Bimjomym
|
||||||
STM32F1 и обработка float11.12.2013, 16:25. Показов 20065. Ответов 20
Метки нет (Все метки)
Добрый день. Возникла такая ситуация. Есть датчик, который выбрасывает в порт RS-485 данные вида АА 55 FF FF ... FF FF, 2 байта ключа: АА и 55, и 4 числа формата IEEE-754, итого 18 слов на скорости 115200 с частотой 50 Гц. Поставил преобразователь 485-уарт и завожу всё на уарт контроллера F103RE. Отлавливаю ключ АА и 55, отлавливаю по 4 байта и перевожу в десятичную, делаю с числом всю математику и прокидываю дальше в уарт другому устройству, потом ещё 3 раза по 4 байта и ловлю новый ключ. В общем-то, примитивная задача. Делал её на компе, на джаве, заработало всё сразу без проблем. Когда пересел на контроллер, застрял на том, что при преобразовании числа проседает скорость. Естественно, что напрямую из уарта в уарт передается нормально. Остается то, что между входом и выходом. отбрасываем математику, оставляем только преобразование 4 байт в десятичное и обратно. Сишный метод возведения в степень из математической библиотеки очень прожорливый. Заменил его отдельным методом. Потом решил поднять частоту. Было 24 МГц, поднял до 60ти и застрял. в даташите написано, что 72 рекомендованный максимум, а у меня один проц виснет при частоте >60, а другой при частоте больше 54 Мгц. 5-10 секунд проходит и виснет. Ставил задержку флеша FLASH_ACR_LATENCY_2, всё равно не помогает. Оставил 60. Всё равно, ключ ловлю, одно число обрабатываю, а остальные не успеваю, значит и про обработку данных говорить не имеет смысла. В датчике стоит ADSP на 300 Мгц, но мне не разрешают его перепрошивать, чтобы скорость понизить, поэтому работаю с тем, что есть. Есть ещё контроллеры F405RG, у них частота выше, но вот имеет ли смысл его паять на место F103? Приложу ниже код преобразования числа и методы отправки флот в уарт, и метод возведения в степень, может кто чего подскажет? Может ещё кто-нибудь подкинет мысль, почему не гонится контроллер выше 60 МГц?
|
||||||
| 11.12.2013, 16:25 | |
|
Ответы с готовыми решениями:
20
опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing Не понимает Dictionary<string, (float[][] train, float[][] valid, float[][] test)> DataSet; STM32F1 |
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
| 11.12.2013, 17:03 | |
|
0) Отступы в код верните (для этого сделайте обрамление тэгом "code"). Больно охота в чужой мешанине строк разбираться :-(
1) Код pow() подозрительный. Судя по условию "if (k & 1)", он с чётными степенями вообще не работает. 2) Откуда вызываете функцию обработки - не из прерывания ли? 3) "Гнать" F103 до 72МГц ни к чему, они и так на этой частоте хорошо работают :-) Проверьте этот факт с простой программой вроде мигания светодиодом.
0
|
|
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
| 11.12.2013, 17:15 | |
|
зачем ieee754 разбирать руками? тем более таким ужасным способом, быстрее это точно не будет.
из кода не понятно что именно за математику надо делать с приходящими числами, но для того чтобы 50 раз в секунду посчитать сумму 4х флоатов производительности stm32 даже на 24МГц более чем достаточно.
0
|
|
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
| 11.12.2013, 17:26 | |
|
1. В обработчике прерывания не должно быть вычислений. Обработчиком прерывания UART скидываете строку в буфер. При получении символа конца строки (данных) обрабатываете буфер из основного потока.
2. Отправлять строку в UART TX из UART RX тоже не хорошо, совсем не хорошо.
0
|
|
|
Bimjomym
|
|||||
| 11.12.2013, 18:03 | |||||
Ну так гнать-не гнать - это понятно. но после 60ти-то он у меня виснет. что я беру множитель 9 и ставлю кварц на 8 МГц, что 6*12 МГц, что 3*24 МГц, ни в одном из этих случаев не работает он на такой частоте. Получается, что вы думаете, для такой задачи мне должно его хватить? Я тогда буду думать, как сделать по-другому, я побоялся, что операции с плавающей точкой сильно грузят проц и работать оно в принципе не будет, не зря ж в датчике они частоту такую большую юзают |
|||||
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
||
| 11.12.2013, 18:07 | ||
2. В кокой среде работаете?
0
|
||
|
Bimjomym
|
|
| 11.12.2013, 18:17 | |
|
В CoIDE. Первый мой контакт с АРМами, поэтому я в такой растерянности.
|
|
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
||
| 11.12.2013, 18:29 | ||
2. Переработайте архитектуру программы, чтобы избавиться от вычислений в прерывании.
0
|
||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
| 11.12.2013, 18:32 | |
|
Я, наверно, тихо сказал, :-) поэтому повторю.
Отложите на время свои амбиции вместе с UART и ftoot. Сделайте наипримитивнейший проект мигания светодиодом. Добейтесь того, чтобы PLL работал на 72MHz, и частота мигания LED этому соответствовала (например, мигать с периодом 72 миллиона тиков - вспышки должны быть ровно 1 Герц). Только после этого (т.е. уже с решёнными проблемами зависания и "разгона") наворачивайте на проект UART, сложные вычисления и прочее - там будут другие вопросы. А сейчас Вы всё сразу смешали, и это затрудняет поиск ошибок.
0
|
|
|
Bimjomym
|
|
| 11.12.2013, 18:49 | |
|
Так я это и делал на мигании диодом, оттуда-то я и знал, что частота действительно меняется с 24 на 60. Вопрос изменения частоты уже оставлен, он был задан так, между прочем, а на случай нехватки мощности у меня есть F4 контроллер. Я вопрос частоты просто так, конечно, не оставлю, но чуть попозже.
|
|
|
Bimjomym
|
||
| 11.12.2013, 18:58 | ||
|
||
|
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
|
|
| 11.12.2013, 19:00 | |
|
Вставлю и я свои 5 копеек.
Помимо всех остальных грубых ошибок в написании программы, есть еще и ошибка ОЖИДАНИЯ принятия очередного байта в самом прерывании, что может привести к вечному ожиданию "непришедшего" очередного байта. Также полное отсутствие обработки флагов ошибок работы UART, что в последствии приведёт к зависанию всей программы. Причем зависание будет, и будет оно асинхронным по времени и весьма трудно отлавливаемым. Устройство может и пол года проработать а потом зависнуть. Так что тут нужно менять структуру алгоритма работы всей программы. Именно тут ошибка, а не во времени обработки ftoot.
0
|
|
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 11.12.2013, 19:03 | ||
Чтобы ничего не терять - делайте вычисления любой сложности в основной петле (или в подпрограммах, но всё равно в контексте основной петли, а не в прерываниях. А UART обрабатывайте в прерывании. Прерывание должно делать свою работу максимально быстро, минимум действий: байт кладётся в буфер (можно кольцевой), изменяются позиции чтения и записи, изменяется счётчик байтов, взводится флаг для основной программы. Никаких ftoot-расчётов и никаких задержек в прерывании.
0
|
||
|
Bimjomym
|
|
| 11.12.2013, 19:17 | |
|
Вас понял. Приступаю. Потом расскажу, чё-как=)
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
|
||||||
| 11.12.2013, 21:28 | ||||||
|
Код преобразования в ftoot - целиком в мусорку.
Вместо него что-то типа
0
|
||||||
|
0 / 0 / 0
Регистрация: 09.12.2013
Сообщений: 34
|
||||||
| 13.12.2013, 13:21 | ||||||
|
В обработчике UART только нужно забрасывание в кольцевой буфер байта сделать и просто сбросить флаг, а в основном цикле работы читай буфер, таким образом отвяжешься сразу от прерываний и будет заниматься всем в одном месте.
Сходу пример для Милиндра, но тоже самое у меня портировано и на STM8/32
0
|
||||||
|
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
|
||
| 14.12.2013, 14:01 | ||
{ if(UART_GetITStatus(MDR_UART1, UART_IT_RX) == SIT) store_char(MDR_UART1->DR, &rx_buffer); UART_ClearITPendingByt(MDR_UART1, UART_IT_RX); } А в чем сокральная необходимость сброса флага ( UART_ClearITPendingByt(MDR_UART1, UART_IT_RX); ), который сбрасывается аппаратно при чтении данных с MDR_UART1->DR. И как быть с обработкой флагов ошибок ?
0
|
||
|
0 / 0 / 0
Регистрация: 09.12.2013
Сообщений: 34
|
||
| 14.12.2013, 16:53 | ||
1) На уровне анализа буффера при отработке протокола, как это сделано у меня, в протоколе есть КС и жестко формализованные бинарные последовательности, если была ошибка то вернется отправителю ответ с типом ошибки 2) Ввести структуру состояния UART и там менять флаг об ошибке Если честно то когда анализируешь пачку байт и пришел битый пакет то сказать об этом железу не всегда имеется возможность, посылка все равно придет искаженная, а значит если пакет анализируется не по байтно, а пачками все равно надо будет клиенту перезапрашивать ответ. Еще один момент, мой код можно расширить на анализ флага ошибки чтобы в случае ошибочного пакета в буфер падал 0xFF который не нарушит последовательность байт по длине, но обработчик буфера точно определит не соответствие КС
0
|
||
|
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
|
|||
| 14.12.2013, 19:56 | |||
0
|
|||
|
0 / 0 / 0
Регистрация: 09.12.2013
Сообщений: 34
|
|
| 14.12.2013, 23:01 | |
|
А в чем сложность добавить обработчики и сбросы этих флагов в тойже форме что я описал выше и закидыванием в буфер 0xFF? Если у вас есть предложения по хорошему варианту использования UART на модели прерываний, который будет работь иначе от предложенной мной модели, расскажите или дайте код, всегда полезно узнать как другие строят такие программы.
0
|
|
| 14.12.2013, 23:01 | |
|
Помогаю со студенческими работами здесь
20
Чем отличаются float преобразования (float)var от float(var) STM32f1 и HC-SR04 Stm32f1 ds18b20 на таймере Самопереподключение USB STM32F1 Конфликт функций [stm32f1] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|