|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師8 m, ^4 I3 h+ G2 f& H0 K: y& ^, [
關(guān)注我,一起變得更加優(yōu)秀!說起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,數(shù)據(jù)的發(fā)送、接收是串口通信最基礎(chǔ)的內(nèi)容。這篇文章主要討論串口接收數(shù)據(jù)的斷幀操作?臻e中斷斷幀一些mcu(如:stm32f103)在出廠時(shí)就已經(jīng)在串口中封裝好了一種中斷——空閑幀中斷,用戶可以通過獲取該中斷標(biāo)志位來判斷數(shù)據(jù)是否接收完成,中斷標(biāo)志在中斷服務(wù)函數(shù)中獲取,使用起來相對簡單。void UART4_IRQHandler(void)
7 P: q+ V {8 M6 t3 l6 m{
2 p& x; k' k: z2 [. _, J9 D: a1 [ uint8_t data = 0;
# A1 N `" _6 R* } data = data;
& `5 b" n' B! y if(USART_GetITStatus(LoraUSARTx, USART_IT_RXNE) == SET)
' o2 z) T. @' `: S M) N3 [ {" ~( z3 X4 A" c
USART_ClearITPendingBit(LoraUSARTx, USART_IT_RXNE);. r1 x* \( S# y8 s7 [
if(Lora_RecvData.Rx_over == 0), O( [* T" R2 W* W
Lora_RecvData.RxBuf[Lora_RecvData.Rx_count++] = LoraUSARTx->DR;0 j; L0 A4 V# i0 f" ] h( M$ ]
}% @/ M) h* p: g' F0 h- X# g' o
if(USART_GetITStatus(LoraUSARTx, USART_IT_IDLE) == SET)
# U4 l8 |& \) n4 l9 B; G {; p6 F& C/ m1 R, g8 u
data = LoraUSARTx->SR;
$ s/ Z0 k+ b' C data = LoraUSARTx->DR;. Y- D Q5 q' f2 R. e2 A
3 u c: T6 J' }5 B( s$ ^
Lora_RecvData.Rx_over = 1; //接收完成- c2 W8 I; o5 M
}
4 p4 h8 F8 C2 O! }) ]* P}例程中,當(dāng)接收完成標(biāo)志 Lora_RecvData.Rx_over 為1時(shí),就可以獲取 uart4 接收到的一幀數(shù)據(jù),該數(shù)據(jù)存放在 Lora_RecvData.RxBuf 中。3 i8 A: t: e9 s" v5 J
超時(shí)斷幀空閑幀中斷的使用固然方便,但是并不是每個(gè)mcu都有這種中斷存在(只有個(gè)別高端mcu才有),那么這個(gè)時(shí)候就可以考慮使用超時(shí)斷幀了。
$ u* T3 S' l' l: ?" v, L8 sModbus協(xié)議中規(guī)定一幀數(shù)據(jù)的結(jié)束標(biāo)志為3.5個(gè)字符時(shí)長,那么同樣的可以把這種斷幀方式類比到串口的接收上,這種方法需要搭配定時(shí)器使用。
. k/ _3 @+ k, x& ]1 M$ F/ q其作用原理就是:串口進(jìn)一次接收中斷,就打開定時(shí)器超時(shí)中斷,同時(shí)裝載值清零(具體的裝載值可以自行定義),只要觸發(fā)了定時(shí)器的超時(shí)中斷,說明在用戶規(guī)定的時(shí)間間隔內(nèi)串口接收中斷里沒有新的數(shù)據(jù)進(jìn)來,可以認(rèn)為數(shù)據(jù)接收完成。
, g& s9 J$ x! m6 duint16_t Time3_CntValue = 0;//計(jì)數(shù)器初值: C! u9 Q0 I, M
3 g& s6 N% d$ s: U
/*******************************************************************************
( a1 ~8 J/ T$ O; y" d * TIM3中斷服務(wù)函數(shù)+ |4 X% J5 ?) D# D' O5 ?
******************************************************************************/% I9 e6 }9 ]+ R* c7 W0 G+ h4 f
void Tim3_IRQHandler(void). Y. L. ]! | [; V6 }
{0 \" f/ i: z; G7 j/ S9 T5 h: Z
if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))1 n7 }+ j& O- d. m, i* f" \
{
' L! Q) Y5 `: g Tim3_M0_Stop(); //關(guān)閉定時(shí)器3
. \* Q1 [# d. t4 {- i: g Uart0_Rec_Count = 0;//接收計(jì)數(shù)清零4 Y" \# H `. D* d/ ? ~$ J
Uart0_Rec_Flag = 1; //接收完成標(biāo)志 V1 z. _7 I& X! w1 s) ]
Tim3_ClearIntFlag(Tim3UevIrq); //清除定時(shí)器中斷7 c) i# q4 w' n! q* {5 ^& g% z' \
}7 O$ F+ N' k1 j2 N( I' }/ I
}5 K- U$ T; v" d+ R7 e) v6 d) M
7 ], z& |* C% S5 \( Fvoid Time3_Init(uint16_t Frame_Spacing)$ c9 C% [0 L; {$ ^, m0 ]% S e4 o$ \+ e
{" v% D j( O) G% i# w
uint16_t u16ArrValue;//自動(dòng)重載值
& G8 s* T% t7 U0 o uint32_t u32PclkValue;//PCLK頻率+ `! z; E! I0 }9 W* D9 @# V/ l4 h
) G6 Q. i" F3 B
stc_tim3_mode0_cfg_t stcTim3BaseCfg;/ z1 C1 M5 M. h7 a
0 \. Q# j6 v! U% f //結(jié)構(gòu)體初始化清零" Y [9 d# K% ~ i6 h2 f5 a
DDL_ZERO_STRUCT(stcTim3BaseCfg);. l" P: p; s( K8 {0 f# G
- M+ k* j; P" \/ U# e5 T; e$ r' } Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Base Timer外設(shè)時(shí)鐘使能$ |& b3 m" T- b, P
- x+ V4 _4 g3 h8 P3 s/ I
stcTim3BaseCfg.enWorkMode = Tim3WorkMode0; //定時(shí)器模式
! u9 Z/ Z! y( i" a stcTim3BaseCfg.enCT = Tim3Timer; //定時(shí)器功能,計(jì)數(shù)時(shí)鐘為內(nèi)部PCLK4 L. m3 b5 [) Q* x3 J- z
stcTim3BaseCfg.enPRS = Tim3PCLKDiv1; //不分頻
3 k0 [( P \; ]* k. s stcTim3BaseCfg.enCntMode = Tim316bitArrMode; //自動(dòng)重載16位計(jì)數(shù)器/定時(shí)器6 ?8 {. j& w; C1 _% v8 _5 ]" z8 a
stcTim3BaseCfg.bEnTog = FALSE;4 F: I3 d8 d0 O; p v* I# D/ A
stcTim3BaseCfg.bEnGate = FALSE;. U" D3 O4 o* j: u# V& D
stcTim3BaseCfg.enGateP = Tim3GatePositive;
+ P/ h6 N+ y% u5 F6 ?; F3 A ( X# m) ]' R+ C) y
Tim3_Mode0_Init(&stcTim3BaseCfg); //TIM3 的模式0功能初始化# g" Q4 K% \" ~. t, d Y
, Y0 Y3 L" O! J5 }
u32PclkValue = Sysctrl_GetPClkFreq(); //獲取Pclk的值" l3 g) U( ^# K+ K* |; t7 D3 t
//u16ArrValue = 65535-(u32PclkValue/1000); //1ms測試
3 V6 W. m/ } T& L3 o u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing*10)/RS485_BAUDRATE*u32PclkValue);//根據(jù)幀間隔計(jì)算超時(shí)時(shí)間
/ ]0 y, `2 ?6 [ Time3_CntValue = u16ArrValue; //計(jì)數(shù)初值
! q& w. q, [2 Z* w Tim3_M0_ARRSet(u16ArrValue); //設(shè)置重載值2 Z' v" c$ H3 B; C/ y# o6 D0 ]
Tim3_M0_Cnt16Set(u16ArrValue); //設(shè)置計(jì)數(shù)初值1 Q" g- U) Q0 M$ h. x
M# W( F. G, v( m4 n5 O3 _- w
Tim3_ClearIntFlag(Tim3UevIrq); //清中斷標(biāo)志
+ T" y/ {& X8 p Tim3_Mode0_EnableIrq(); //使能TIM3中斷(模式0時(shí)只有一個(gè)中斷)
. X1 T+ U9 _. p: t; ^" o1 a EnableNvic(TIM3_IRQn, IrqLevel3, TRUE); //TIM3 開中斷 # u) j% T# f ]& F& F6 n
}
9 Y9 ? H9 N, V& u) H
) l6 L; a8 @" ]6 l/ Y5 R( z/**************************此處省略串口初始化部分************************/
& ~! b" T9 T! c7 `: z. N9 E5 ^' ?9 U//串口0中斷服務(wù)函數(shù)
2 _# q# A# c0 N1 y0 d7 h$ qvoid Uart0_IRQHandler(void)8 n+ j- P% K/ L1 K6 q Q$ L, Z# `! \
{
# n5 ?# F6 a: K, z. i v4 X3 V8 u uint8_t rec_data=0;$ \5 D S- ? o2 j6 Y r
) G3 Q- O" X8 K# k8 u if(Uart_GetStatus(M0P_UART0, UartRC))
1 w) e4 R* A4 O {
. n3 o. P; y- g) r" G Uart_ClrStatus(M0P_UART0, UartRC); l9 n- B: x4 w; }( W
rec_data = Uart_ReceiveData(M0P_UART0); 5 \% c% \8 o4 q1 c5 ^# p. a g
if(Uart0_Rec_Count[U]//幀長度
C) }, \/ f, T$ f) N! e7 b0 l {
' ` I& ~1 I, s) z5 r6 T) [ Uart0_Rec_Buffer[Uart0_Rec_Count++] = rec_data;
- ]7 O3 ~/ O a1 M0 p }$ h( Q/ B( L. Z6 q2 p6 k% [
Tim3_M0_Cnt16Set(Time3_CntValue);//設(shè)置計(jì)數(shù)初值
; x3 G& w! j, H2 L6 u2 _ Tim3_M0_Run(); //開啟定時(shí)器3 超時(shí)即認(rèn)為一幀接收完成 [$ Z- k, @1 _8 L9 l
}. d9 d" S: ~+ X6 G6 u- c
}例程所用的是華大的hc32l130系列mcu,其它類型的mcu也可以參考這種寫法。其中超時(shí)時(shí)間的計(jì)算尤其要注意數(shù)據(jù)類型的問題,u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing * 10)/RS485_BAUDRATE * u32PclkValue);其中Frame_Spacing為用戶設(shè)置的字符個(gè)數(shù),uart模式為一個(gè)“1+8+1”共10bits。
: A. }( ]5 }( T& K$ d2 A# k% ~: d狀態(tài)機(jī)斷幀狀態(tài)機(jī),狀態(tài)機(jī),又是狀態(tài)機(jī),沒辦法!誰讓它使用起來方便呢?其實(shí)這種方法我用的也不多,但是狀態(tài)機(jī)的思想還是要有的,很多邏輯用狀態(tài)機(jī)梳理起來會(huì)更加的清晰。! e; c F% T" ^' Y" X
相對于超時(shí)斷幀,狀態(tài)機(jī)斷幀的方法節(jié)約了一個(gè)定時(shí)器資源,一般的mcu外設(shè)資源是足夠的,但是做一些資源冗余也未嘗不是一件好事,萬一呢?對吧。3 c. z. Z, b% k3 M
//狀態(tài)機(jī)斷幀) O. e, F: |' C1 ?" E$ s
void UART_IRQHandler(void) //作為485的接收中斷 ?: q* A( H( _2 p1 } H
{
* l# q; x9 o/ X% X# R' e uint8_t count = 0;
6 \* y2 I" t% D* A unsigned char lRecDat = 0; ; \4 z3 V7 h1 i, I4 H( g5 ^6 {
9 N# t; K Q. L3 W; y# y
if(/*觸發(fā)接收中斷標(biāo)志*/)
% }, H7 @+ q j- i {9 B. D' ~3 B' z0 `( l |* v3 i( [
//清中斷狀態(tài)位
$ o: K& F4 E2 l, \3 j5 ~ rec_timeout = 5;
7 P( A/ P/ d0 V+ V" U4 x( C if((count == 0)) //接收數(shù)據(jù)頭,長度可以自定義
% l+ r+ H" w$ l& e0 ` {
; w9 B4 R$ I Z7 p6 `7 j- v RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;
# u% M2 c+ G* ]5 y0 P4 r gRecStartFlag = 1;
2 h, Y& n+ p! U/ O Y return;; c- Q2 m+ [' X- ~: K- }4 @
}2 Z V. t9 k' f( w9 H2 n
if(gRecStartFlag == 1)
( ]) R* r7 O8 i$ n/ b( [% X {' k. B! g8 \. B5 o
RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;
1 o2 L$ |0 s9 h% J ' v" t+ N5 ^# f& {
if(count > MAXLEN) //一幀數(shù)據(jù)接收完成
/ h. F3 r- ~4 ?1 A. I s {
/ u: t+ R+ u% X1 F6 X5 T, p count=0;. s; u& F$ Z9 X+ K0 @- [) U1 I
gRecStartFlag = 0;
% i g/ Q% }) C/ T t3 k3 A7 O `2 ~3 b3 A" Y
if(RUart0485_DataC[MAXLEN]==CRC16(RUart0485_DataC,MAXLEN))9 m! M. v6 y6 F2 p% n: ^+ m1 r( X
{% B v4 X9 {7 g" l" Q1 ?
memcpy(&gRecFinshData,RUart0485_DataC,13);
* F" x# d* v/ q9 K# z6 F$ C gRcvFlag = 1; //接收完成標(biāo)志位
" J" S$ w" F. }" @- A }
8 z! J* _0 e. x' u! d( ?5 q }
1 H8 a! s d2 y* y0 N }
, f( R: @6 C& @4 T return; . D/ O$ P) O- h: O K" k* m
}4 \8 K. D, F' j6 H9 P& k% v% w
return ;; E# `/ g# x5 z
}這種做法適合用在一直有數(shù)據(jù)接收的場合,每次接收完一幀有效數(shù)據(jù)后就把數(shù)據(jù)放到緩沖區(qū)中去解析,同時(shí)還不影響下一幀數(shù)據(jù)的接收。8 _! y' r) V. ]' E3 Q- V
整個(gè)接收狀態(tài)分為兩個(gè)狀態(tài)——接收數(shù)據(jù)頭和接收數(shù)據(jù)塊,如果一幀數(shù)據(jù)存在多個(gè)部分的話還可以在此基礎(chǔ)上再增加幾種狀態(tài),這樣不僅可以提高數(shù)據(jù)接收的實(shí)時(shí)性,還能夠隨時(shí)看到數(shù)據(jù)接收到哪一部分,還是比較實(shí)用的。/ L& b) V; n4 l) s6 z. O) ~5 ~
"狀態(tài)機(jī)+FIFO"斷幀記得剛畢業(yè)面試的時(shí)候,面試官還問過我一個(gè)問題:如果串口有大量數(shù)據(jù)要接收,同時(shí)又沒有空閑幀中斷你會(huì)怎么做?
# ^! v( y2 B7 p1 j$ w9 o沒錯(cuò),就是FIFO(當(dāng)時(shí)并沒有回答上來,因?yàn)闆]用過),說白了就是開辟一個(gè)緩沖區(qū),每次接收到的數(shù)據(jù)都放到這個(gè)緩沖區(qū)里,同時(shí)記錄數(shù)據(jù)在緩沖區(qū)中的位置,當(dāng)數(shù)據(jù)到達(dá)要求的長度的時(shí)候再把數(shù)據(jù)取出來,然后放到狀態(tài)機(jī)中去解析。當(dāng)然FIFO的使用場合有很多,很多數(shù)據(jù)處理都可以用FIFO去做,有興趣的可以多去了解一下。/********************串口初始化省略,華大mcu hc32l130******************/, W$ A0 X6 e! S, P3 c) z% ~# G9 p
void Uart1_IRQHandler(void)
- A: E! F' A( p8 R# z{% F V6 `- _) O" P s" U
uint8_t data;% e" s- c3 O/ A: c: c7 h" x
if(Uart_GetStatus(M0P_UART1, UartRC)) //UART0數(shù)據(jù)接收
6 q; \8 s* C( [ {
; F8 D5 Z2 \) } Uart_ClrStatus(M0P_UART1, UartRC); //清中斷狀態(tài)位0 E( w% b$ q# M6 v! u
data = Uart_ReceiveData(M0P_UART1); //接收數(shù)據(jù)字節(jié)7 B; }4 X6 Y+ h2 [3 k* l4 |9 `
comFIFO(&data,1);* w# Z, q: x) G% `; i, i
}
% U8 R8 D+ E; h1 f. U; @ d" |3 t}' e: i% x3 V5 [7 S) A& g9 U, q5 P- z
2 G( G6 V% l- A( v4 o: p* m
/******************************FIFO*******************************/9 g8 n1 C$ z+ K7 \
volatile uint8_t fifodata[FIFOLEN],fifoempty,fifofull;
% R c+ a9 M6 M/ o/ U( Fvolatile uint8_t uart_datatemp=0;8 M( N! j; U- Q
* v; M7 t# U Q2 ` v8 A% Q
uint8_t comFIFO(uint8_t *data,uint8_t cmd)( ^7 c# ?9 R0 G( I: g3 q, l7 L6 E
{
" [ u, b# ]9 a6 X5 b1 j static uint8_t rpos=0; //當(dāng)前寫的位置 position 0--99
+ W) I2 [ {9 [8 @* G static uint8_t wpos=0; //當(dāng)前讀的位置1 d% Z: O Q$ q( |3 A1 A9 }
! p( c9 d0 f% v s6 N+ S' v if(cmd==0) //寫數(shù)據(jù)
4 j; D U4 G4 i {
( ` C( [' r5 h" G if(fifoempty!=0) //1 表示有數(shù)據(jù) 不為空,0表示空
0 R. w8 S1 o) u$ F) O$ g+ D {1 q) a" C8 y" M' S. w% m
*data=fifodata[rpos];
' D& o7 K. j% Y+ }- A b$ v7 ^9 ` fifofull=0;% M3 n9 {' a$ G! w2 q
rpos++;
. \. H- ?' K f Z F/ i if(rpos==FIFOLEN) 0 a9 i% o( c8 y3 c6 R& {( g# ^( w5 p
rpos=0;
0 @: C, E8 |9 c- \ if(rpos==wpos)
3 g8 P( |. n1 \/ A( Q# v fifoempty=0;/ K- Q3 s: a1 X! X2 T6 D6 e
return 0x01;( K* m1 a# c! z7 ^7 ^5 o/ G
}
" k. v) K! q0 ]0 C; `- y( { else; v6 q0 x; J4 [8 I
return 0x00;$ v8 n D1 g: y; @) T
7 c8 ]9 a q; {
}
: ]8 U8 ?# }4 B% \- a. |0 ^ else if(cmd==1) //讀數(shù)據(jù)' L9 L7 g6 x0 |( D$ r7 B6 u) d
{5 e$ X) c: M" o7 ?5 q: n
if(fifofull==0)
. n! M& t$ V! l( x {+ l4 f# M& s: Z* k& Y: Q
fifodata[wpos]=*data;4 v9 s7 U/ Y. }. c% j
fifoempty=1;, J1 B9 D& x3 g9 i1 M( D; g
wpos++;
# v. F2 {, Z0 l& `' K if(wpos==FIFOLEN) # x# X; t" f3 L* k# F
wpos=0;7 \( \3 z: Y/ |& ^( }) c8 M7 U
if(wpos==rpos) " z( y A Y2 ?1 W2 _
fifofull=1;
: s1 Q4 g* s2 W6 E return 0x01;
+ N. f8 E M7 j* Y9 M2 j8 D4 S6 G } else9 [% T/ \- l5 k: R7 ?2 L5 b
return 0x00;5 Y( V0 D& G" D
}/ j9 ?& |5 k8 E1 i
return 0x02;- [' z P1 ?! v3 F
}0 z: p5 y0 e L4 l% ?, q* d
+ ^0 Z3 j' b6 T% W2 u
/********************************狀態(tài)機(jī)處理*******************************/
) W0 B" D' Y4 t) a8 E( m [void LoopFor485ReadCom(void)! V2 t' H4 v7 G+ E
{
$ T( R( b. w, }0 N, h& L uint8_t data;" R# l* b( o5 S7 G6 a1 R% ?& ~
( ?$ [4 a3 c5 R: n! y- H) S while(comFIFO(&data,0)==0x01). T0 ?! g) r8 ^
{
* u, O: s" K& e* ~3 l8 ^ if(rEadFlag==SAVE_HEADER_STATUS) //讀取頭
2 c# W) o% }" G7 @ {/ p C' F* R3 d) z
if(data==Header_H)- Z: o! q5 J8 @! t- A0 `# @' c
{. b, x6 c6 b5 H* z. ]3 o7 v
buffread[0]=data; l$ p# J) m, z* t# T- W' v
continue;3 a, B4 \# h8 h2 u. k8 t
}
! }/ P) W9 p, d+ b. G- e$ A: z9 G j if(data==Header_L)2 e: O1 i* w$ M7 G$ {. |
{6 j$ y1 ]- e9 }' G/ U8 G3 w4 G
buffread[1]=data;% f4 u% m7 F3 ~; f0 M# |0 `. w8 N
if(buffread[0]==Header_H); {) Q" U* E- e' K' A% ]# a- J* R n
{; ]9 _2 y# i* E& d+ v& _
rEadFlag=SAVE_DATA_STATUS;" d- H$ J* L2 X( t1 c7 @( K1 z
}
) {& ?/ |* H' t, P- ~) p, r' o7 g }
7 w5 u0 @& d' c2 u else
; N" i' q8 ]6 Z: J" a8 ?9 X {
& D3 c0 y0 A0 ^5 i memset(buffread,0,Length_Data);
2 R" l1 {9 N1 @$ ~. K }
3 G# g6 y& z) c# _2 w5 S% Z7 A# b( P } 5 k! M% d c4 p p; k( X& M( C
else if(rEadFlag==SAVE_DATA_STATUS) //讀取數(shù)據(jù)
3 V' R( [3 ?, h# p0 L {
) a+ W( ]" C6 F) D$ A$ ^& ]7 c buffread[i485+2]=data;
% w; i. ^1 m* \- B7 y# n i485++;. d9 I8 N% w1 v4 _* l1 M; Y
if(i485==(Length_Data-2)) //數(shù)據(jù)幀除去頭
! B0 l4 ]" {3 F+ c9 e7 ^6 H {, {' Y. V8 [6 a/ G" Z
unsigned short crc16=CRC16_MODBUS(buffread,Length_Data-2);
2 F7 M% d7 L: }* l if((buffread[Length_Data-2]==(crc16>>8))&&(buffread[Length_Data-1]==(crc16&0xff))). _9 V( Q+ U% ~4 H$ Y2 c
{
0 J/ V. x, ]$ i, V rEadFlag=SAVE_OVER_STATUS;
! b- Q6 G) W- e memcpy(&cmddata,buffread,Length_Data); //拷貝Length_Struct個(gè)字節(jié),完整的結(jié)構(gòu)體
! x: j1 F3 z3 S/ }6 i7 s } . W0 r3 T# q9 L' E6 ~
else) [1 L }; ~/ k4 @! v' M) m
{
! J5 Y, t6 r7 e5 {! a3 f rEadFlag=SAVE_HEADER_STATUS;, Y/ r8 Q' X6 ~ b# x W$ I7 ]
}( p; N, L9 O; j& _) o4 V
$ W9 ]: e) Z; t3 ?" m; _4 k
memset(buffread,0,Length_Data);. p6 ~+ Z( D$ }9 n# T
i485=0;
4 r# ~+ c9 K1 T$ r5 ^. F break;
/ l$ D: F+ h6 Z+ Y3 \; ~2 ?4 o. _& I }
- ?* n( D% Q+ T% Q8 T }
& ~9 y9 ]: K- n, j. f4 B }
, Q3 r' {6 c6 E3 g6 `0 A! N}原文:https://blog.csdn.net/qq_56527127/article/details/123018515
9 Y( P3 m8 K# g: ~+ f4 C. `
ohb1aidbpas64054373034.png (769.97 KB, 下載次數(shù): 0)
下載附件
保存到相冊
ohb1aidbpas64054373034.png
2024-12-2 23:14 上傳
& B* Y& Z+ J5 m' h7 K. S4 m
-END-+ V6 y3 h6 K4 G- ?+ ~
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀 q6 g5 n$ f( e- @, h& N; R/ W
% k. C! \7 g, F6 V/ a3 k % ]* h0 R9 Y. V$ C. {& m
" A' q+ h: W1 e7 ~6 E/ e
' C* R+ H3 y" y5 p! i- e9 P9 F* |5 r
) ]& {6 L/ c9 c2 M" A
ptzib2nqqkv64054373134.jpg (112 KB, 下載次數(shù): 0)
下載附件
保存到相冊
ptzib2nqqkv64054373134.jpg
2024-12-2 23:14 上傳
% x- Q, Q: \/ ~. Q- | w; \
, T6 m6 Z4 G' F0 [" S2 p
嵌入式軟件調(diào)試,如何計(jì)算任務(wù)的運(yùn)行周期?
8 L" ]1 _1 x' X+ Q5 ?
% [$ `& e# w$ y, p) U+ Y 3 |/ K/ P' \# z7 f
: L2 W! B# G& L$ k9 P 2 f) _. _+ w" _3 b& ~
$ @5 M. D3 l: _( ~ F. S& s# i
4 t, S$ O& v$ W* p7 C
4 B! l }6 J+ i8 d) t% Z* u
; E( i/ h7 x9 Q) K# p
% e: C3 f% v/ ^: k
9 J2 i! l3 r: d" o& h) l
iarkvaxoix564054373235.jpg (124.11 KB, 下載次數(shù): 1)
下載附件
保存到相冊
iarkvaxoix564054373235.jpg
2024-12-2 23:14 上傳
; n R/ q# H, e$ l
' H: h: |- Y( P
嵌入式軟件,如何把編譯時(shí)間加入到bin文件,進(jìn)行版本管理?/ J+ P" b( n K& h6 i5 h8 _2 f
# j. N5 e5 q! q- x* m 7 L* o( b' t4 O' | M/ S
9 J6 ]. m7 P( t( H. `
% V- @6 y. `3 P 9 ]( Y" I& A! \, w& `# K
6 Q& a* J- t a/ k( U& b$ o( o
( I$ ?6 z9 G4 v) Y2 l7 } ' `, z. @. w" h: n
9 a) O& S, {# A$ E
) I% @% W; g8 U
e31rvw53ost64054373335.jpg (258.23 KB, 下載次數(shù): 0)
下載附件
保存到相冊
e31rvw53ost64054373335.jpg
2024-12-2 23:14 上傳
/ x( P) Q! f/ I! ^- H, p5 e
; l. v) U. [% f" c
嵌入式初學(xué)者入門后,應(yīng)該如何開始進(jìn)階學(xué)習(xí)?
; L- u: o3 ~5 b, @3 D- X ( [0 D) B2 n) I# y4 b6 q1 n
- s# D% a9 Y/ q6 Z
/ R$ l5 d6 c( C o
6 g G1 g( _4 k( v( h
0 i# C% Y! k6 a% Z% |; _3 s: k我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
& l2 F8 \0 f0 A# |0 a* h: ]) `關(guān)注我,一起變得更加優(yōu)秀! |
|