测试ST 官网的 FreeRTOS0 L' c6 ]4 U& J1 P8 @# |6 D a
1 a) `2 N& X1 ^+ n6 k
移植shell
- J) S* W4 g" f: o' P主要是串口对接, 需要重写两个函数* A& p. N" H8 \0 m* |
. `* [ e0 {: W$ ^+ Z# a/ c* _: X
- int fputc(int ch, FILE *f)
# ^& @2 _& E) o' W& a/ O2 X - {6 I8 U: a9 O* i5 k' r
- /* Place your implementation of fputc here */7 [1 R) D: w4 \% a) @0 I2 c
- /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
6 x% Y$ C8 ?3 @" A, l/ }1 b7 t; t- M8 { - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, UART_TIMEOUT_VALUE);+ w, Z* W) n1 d0 d+ G# K
- return ch;
9 u, h0 v% ]9 b* b - }# S' v& p8 Y/ P4 v8 E
- // #endif7 a% A" B1 D4 F2 B
4 H1 P+ r1 @" L2 ]/ O8 |- char shell_buf[RXBUFFERSIZE]={0};
9 T) p$ u1 E7 G8 v: X' T2 a - char shell_len=0;5 x8 X1 x; w7 `0 S' L ?. a8 b
- char *shell_buf_head=NULL;6 V$ m D) @" N, V/ P
$ N0 ~& A" B/ Y, t3 _- # V) `. j2 ?: h" B) s; ^1 d z
- int fgetc(FILE *f)
9 d& B D9 [1 u - {
" Z6 v; X% t/ K- e, y- k6 z - / O0 R, `8 K1 u" E" M
- while (0 == shell_len) {
, E' A+ F9 j" @4 D - osDelay(1);
% Y! a1 r2 `/ h& `% g - }9 J$ n; X+ {" R7 W
- char ch = *shell_buf_head;
8 k) D+ y2 T3 [( D( `2 N+ R0 ]3 q - shell_buf_head ++;
0 G; f. X8 L# Q, h: U - shell_len --;
$ `8 i& D: Z1 J1 X9 [% p - 0 [# @0 J* @% P/ `0 o) C& R
- return ch;2 ~2 u( Q) z6 `# l
- }
复制代码 6 E: r4 I2 S% g# {: W
增加了一个回调函数, 收到数据拷贝到shell_buf, 然后重新初始化串口中断接收参数,指针,size,count
, ]$ |, p m- f) e2 }7 b2 A8 \% W1 V, q
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)0 r1 L' R) N. A
- {2 I' B: T8 D7 e) y
- /* Set transmission flag: transfer complete */
0 I. Q+ x& e& \! O; X; m8 X8 \/ g - if(UartHandle->Instance == USART1) {. b" K: _! E5 Y# j" Z! |2 ?8 u
- // UartReady = SET;; P9 [. r) E: w- W, H# F
- shell_len = UartHandle->pRxBuffPtr - aRxBuffer;
- B0 K8 C. {% K; Z6 z& o - shell_buf_head = shell_buf;
. d& n( n+ [/ v' t4 e3 _$ Y - memcpy(shell_buf, aRxBuffer, shell_len);, ^3 z# R& V* ?7 {' |0 o8 _) o
- - Q* G& Z2 H K7 p
- UartHandle->pRxBuffPtr = aRxBuffer;, j$ Y/ a7 P: b& B3 S' i9 V1 R" K8 g7 Q
- UartHandle->RxXferSize = RXBUFFERSIZE;5 ~& O6 A/ y8 x7 x) s8 z
- UartHandle->RxXferCount = RXBUFFERSIZE;7 m5 b2 A& L6 Z! j/ v% d& _8 L& Y
- }( r5 E# C' Q) C3 V
- ! b) p0 i0 s; T; G. X
- }
复制代码 ! i0 ]& G/ j6 Q- L+ x
遇到的问题, 1. fgetc 不能直接调用HAL_UART_Receive, 否则会死等,导致其他任务无法运行。1 E, U1 \4 S+ @8 P, v
( J5 L1 d! b, Q9 I解决这个问题的方法是,接收采用中断方式。
6 a8 V2 U% X7 C5 @# Z7 G* J! S) C. r$ g* O8 l2 @
问题2. STM32CubeMX 生成的代码,串口中断接收是固定长度的方式, 对于shell 不适用。
0 R' X2 j/ k9 i; B7 Z! J( n4 x
5 p( C8 d0 o. W" v! Q) B解决这个问题的方法是,修改中断处理程序,如果是调试用的串口,直接处理接收数据 a/ W; @2 r3 R/ Q
% n: J6 c( b6 V3 g1 N E/ s- v- static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)
) W& b) o* ^6 d9 ? - {
) T- P) f4 N# W - uint16_t uhMask = huart->Mask;- X4 _* @2 u, }( z* e! [: A, v
- uint16_t uhdata;
* L- I6 Z8 ~ Y* h, ?3 w
+ a7 k- ?; H+ V* s" p, o/ H. V- /* Check that a Rx process is ongoing */
, Y# j$ X, `( y4 H/ d - if (huart->RxState == HAL_UART_STATE_BUSY_RX)
7 R5 ]( n2 _) c/ ^5 ? - {1 n. g( b/ k# G: {+ x) {- K
- uhdata = (uint16_t) READ_REG(huart->Instance->RDR);
" M% H, P8 H- e# g& W1 V! Z+ L0 [ - *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);
. l( m+ K2 k/ p2 `( ?+ p - huart->pRxBuffPtr++;( J) _+ F2 c* \1 D3 n& a) g
- huart->RxXferCount--;6 v5 ?5 A& }- Y" [7 S2 }
- 1 @' r# O7 w2 N) K) ^' }
- if(USART1 == huart->Instance) {
6 H- x+ d0 A, P" a/ t! O4 ] - HAL_UART_RxCpltCallback(huart);. b; |$ n& e2 F0 A4 w6 @( [" g
- }7 k1 z' C. Y6 t# _% z B
- if (huart->RxXferCount == 0U) {! W1 N' B8 h5 U9 s* s( P0 K U
- /* Disable the UART Parity Error Interrupt and RXNE interrupts */# _4 @5 m8 z7 X$ \8 s
- CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
( `( | t' E% I4 v8 @ - $ w& p( U e- c: }6 \7 E
- /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
5 L, y8 p: v$ V% k J' L - CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); O4 F# h4 i2 t) Y# ]8 ?
. t% h X, s8 R& V- /* Rx process is completed, restore huart->RxState to Ready */8 N0 S- n, k f& A
- huart->RxState = HAL_UART_STATE_READY;
' B/ n! q4 j b0 W5 X+ O( @7 p4 Y( H
5 }# T' n6 D6 M) J7 U- /* Clear RxISR function pointer */1 j2 \% G0 `! h% f7 y- o% W
- huart->RxISR = NULL;
, Q/ S& K3 I( h; x' f - 1 O; i9 D# t/ [
- #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
* m, ~' M& O, b4 f& S, e - /*Call registered Rx complete callback*/, w1 W) R/ J2 t- [- J( U7 |
- huart->RxCpltCallback(huart);
, j9 N% B, `. W N, h3 P# ] - #else9 j; y1 h" G* _
- /*Call legacy weak Rx complete callback*/, Y; b! }) \1 h! m" a( o
- HAL_UART_RxCpltCallback(huart); ]" D3 t$ ?' `4 F
- #endif /* USE_HAL_UART_REGISTER_CALLBACKS */: Z" Z( {# ^8 Q! p2 `- d. b
- }- \7 f% I: I$ ?4 _
- }: c1 D! p) A" A7 l2 Y6 A
- else' U v+ L& G9 `5 }* _% |
- {
: p/ j E# |( j4 A% Z4 J+ C: p - /* Clear RXNE interrupt flag */, c8 h" C0 `; a) ?
- __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
% y- d8 s7 r7 O% B w. q; [' _% L - }8 B8 c8 q; ?+ K' G9 e
- }
复制代码
^( k& S8 J/ z, Y8 [( k9 f问题3. shell 放在Mgr task里面,由于内存分配128*4 不够导致死机! U) w9 |+ p, c) Q6 B/ M1 A) P* {! Y
/ |) G: X! a: \解决这个问题的方法是,去掉没有用的shell 指令,限制最多支持64条指令。 任务内存分配加大 256*4" b+ z& p; z/ Z
8 H; c5 d, D, U6 p- o5 o9 I最终效果图
6 h7 [7 |) j' ~! D. B# v2 I* k# _5 _! N g+ }+ ^; l
( ^# w2 B+ K) D: }5 [
' W% S1 ]# `' r- k$ d: a4 l8 u9 J# }
0 b; g3 q1 P3 c) V/ z* Q
|