Можем ли мы отредактировать функцию обратного вызова HAL_UART_TxCpltCallback для нашего удобства? - PullRequest
0 голосов
/ 11 апреля 2019

Я новичок в FreeRTOS и STM32. Я хочу знать, как именно работает функция обратного вызова HAL_UART_TxCpltCallback для HAL_UART_Transmit_IT? Можем ли мы отредактировать эту функцию обратного вызова для нашего удобства?

Заранее спасибо

1 Ответ

1 голос
/ 11 апреля 2019

Вы звоните HAL_UART_Transmit_IT для передачи ваших данных в режиме «прерывания» (неблокирования).Этот вызов возвращается немедленно, вероятно задолго до того, как ваши данные будут полностью переданы

Последовательность событий следующая:

  • HAL_UART_Transmit_IT хранит указатель и длину предоставленного вами буфера данных.Он не выполняет копирование, поэтому переданный вами буфер должен оставаться действительным до тех пор, пока не будет вызван обратный вызов.Например, это не может быть буфер, который вы будете выполнять delete [] / free до того, как произойдут обратные вызовы, или локальный буфер в функции, из которой вы собираетесь возвращаться до вызова обратного вызова.

  • Затем включается прерывание TXE для этого UART, что происходит каждый раз, когда DR (или TDR, в зависимости от используемого STM) пуст и может иметь новые записанные данные

  • В этот момент прерывание происходит немедленно.В обработчике IRQ (HAL_UART_IRQHandler) новый байт помещается в регистр DR (TDR), который затем передается - это происходит в UART_Transmit_IT.

  • Один разэтот байт передается, TXE прерывание снова запускается, и этот процесс повторяется до достижения конца предоставленного вами буфера.

  • Если произойдет какая-либо ошибка, HAL_UART_ErrorCallback получитвызывается из обработчика IRQ

  • Если ошибок не произошло и достигнут конец буфера, вызывается HAL_UART_TxCpltCallback (из HAL_UART_IRQHandler -> UART_EndTransmit_IT).

На ваш второй вопрос, можете ли вы редактировать этот обратный вызов «для удобства» - я бы сказал, что вы можете делать все, что захотите, но вам придется смириться с последствиями изменения кода, что по сутибиблиотека:

  1. Обновление HAL до более новых версий станет кошмаром.Вам придется вручную повторно применить все ваши изменения, которые вы сделали к этому коду, и протестировать их снова.В некоторой степени это может быть автоматизировано с помощью какой-либо формы контроля версий (git / svn) или даже файлов исправлений, но если измененный код изменяется ST, эти исправления, скорее всего, больше не будут применяться, и вам придется делать этовсе снова вручную.Это может потребовать повторного изучения того, как изменилась реализация, и выполнения всей вашей работы с нуля.

  2. Никто не сможет вам помочь, поскольку код вашей библиотеки больше не соответствует коду, который делают все остальныеесть.Если вы внесли новые ошибки путем изменения кода библиотеки, никто не сможет их воспроизвести.Даже если вы предоставили свои модификации, я искренне сомневаюсь, что многие здесь потрудятся применить ваши изменения и протестировать их на практике.

Если бы я выразил свое личное мнение, это было бы так:если вы считаете, что в коде HAL есть ошибки - исправьте их локально и сообщите об этом в ST.Как только они будут исправлены в будущем обновлении, полностью замените ваши изменения HAL обновленным официальным выпуском.Если вы считаете, что HAL-коду не хватает функциональности или гибкости для ваших нужд, у вас есть два варианта:

  1. Предложить изменения в ST.Вы должны иметь в виду, что HAL стремится удовлетворить потребности «общего назначения».

  2. Просто не используйте HAL для этого конкретного периферийного устройства.Этот «смешанный» подход - именно то, что я делаю лично.В некоторых случаях функциональность, предоставляемая HAL для данного периферийного устройства, «достаточно хороша» для удовлетворения моих потребностей (в моем случае одним примером является SPI, где я полностью полагаюсь на HAL), в то время как в некоторых других случаях, таких как UART, я использую HAL только для инициализации, пока занимаюсь коробкой передач сам.Даже если вы решите не использовать функции HAL, он все равно может дать какое-то значение - например, вы можете скопировать их обработчик IRQ в свой код и вместо этого вызвать ваши функции.Таким образом, вы, по крайней мере, пропустите некоторые части в разработке.

...