Tak tak, naštudovať aspoň obecne ako pracuje prerušenie nejakého procesora.
Kto by funkciu
UART2_IRQHandler asi volal? Že by to prerušenie?
No a nájsť volanie tej druhej funkcie s označením callback sa dá v zdrojovom kóde veľmi rýchle. Na dva skoky. Najprv sa nájde
HAL_UART_IRQHandler
http://www.disca.upv.es/aperles/arm_cor ... tml#l01517
a tam sa volá
UART_Receive_IT
http://www.disca.upv.es/aperles/arm_cor ... tml#l02364
Na riadku 02414 sa volá
HAL_UART_RxCpltCallback, ktorý si musí definovať užívateľ.
Odpoveď na čo je volanie HAL_UART_Receive_IT najprv main a potom v tej funkcii je jasná ak vieš ako to pracuje. Treba vedieť princíp ako to fičí a ako sa programujú neblokujúce volania. Napríklad aj v javascripte je to samá callback funkcia.
Takže po poriadku. Čo robí HAL_UART_Receive_IT
http://www.disca.upv.es/aperles/arm_cor ... tml#l00820
čo teda robí? - Požiada HAL o prijatie zadaného počtu byte do zadaného buffera, cez zadané UART rozhranie. Dôležité si je uvedomiť že ona nečaká na prijatie toho znaku ale len niekde (v tej štruktúre čo je odovzdaná ako prvý parameter) niečo skontroluje a nastaví a skončí s vrátením nejakého statusu. Main potom beží ďalej (asi v tom príklade nekonečnou slučkou).
Až sa prijme ten byte cez sériové rozhranie. Tak sa vďaka povolenému prerušeniu zavolá
UART2_IRQHandler
Ten zavolá obecnú obsluhu prijatia znaku ktorá je rovnaká pre všetky UARTy
HAL_UART_IRQHandler
Ten zase
UART_Receive_IT. Ten prijíma dovtedy dokiaľ neprijme všetky požadované znaky. V tomto prípade teda jeden. Čo sa vlastne aj práve stalo. Takže sa zavolá aj
HAL_UART_RxCpltCallback
No a tam si užívateľ napísal že ten prijatý znak chce odoslať naspäť, a v druhom volaní že chce zase prijať jeden byte do premennej byte.
Takže celá táto sranda nerobí nič iného len vráti prijatý znak a zariadi aby sa to isté stalo aj s ďalším. Celé to ale beží na pozadí bez toho aby to nejako unúvalo hlavný program. Ten si môže robiť čo len chce (aj nič).
-- Spojený príspevok 01 Jan 2020, 22:50 --
A ešte k tomu znaku
Je to operátor ako trebárs + alebo *. V tomto zmysle vypočíta adresu premennej v pamäti.
Teda
Vypočíta adresu kde sa premenná byte v pamäti nachádza. Nadáva sa tomu aj odkaz alebo referencia. Ak sa to uloží do premennej tak tej sa nadáva smerník(pointer) a je s tým kopec srandy ak tomu človek nerozumie a ledva ledva tuší o čo tam ide. Chcem tým naznačiť, že toto je pre C programátora ako malá násobilka. Ak toto nedáva tak má iba dve možností -
študovať a pochopiť to, alebo sa na C vykašlať. Cez toto skrátka nejde vlak.
V konkrétnom prípade na tom mieste funkcia očakáva ako parameter adresu buffera pre ukladanie prijatých znakov. A preto tam nemôže byť samotne
čo by znamenalo daj sem hodnotu premennej byte. Teda nie kde ta premenná je ale čo v nej je.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.