|
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師# u, }6 y% {. j d1 A7 c
關(guān)注我,一起變得更加優(yōu)秀!說(shuō)起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,數(shù)據(jù)的發(fā)送、接收是串口通信最基礎(chǔ)的內(nèi)容。這篇文章主要討論串口接收數(shù)據(jù)的斷幀操作?臻e中斷斷幀一些mcu(如:stm32f103)在出廠時(shí)就已經(jīng)在串口中封裝好了一種中斷——空閑幀中斷,用戶可以通過(guò)獲取該中斷標(biāo)志位來(lái)判斷數(shù)據(jù)是否接收完成,中斷標(biāo)志在中斷服務(wù)函數(shù)中獲取,使用起來(lái)相對(duì)簡(jiǎn)單。void UART4_IRQHandler(void)5 b" \2 ~) B, O j4 U
{% d& O# y( f! o& F
uint8_t data = 0;
" Q& c- d" C* z1 Y* C- S data = data;
# \0 _3 f+ y* L2 B if(USART_GetITStatus(LoraUSARTx, USART_IT_RXNE) == SET)6 X# t" G5 I7 A0 n! ~0 t
{
3 e+ ^" q2 {! r5 R2 c USART_ClearITPendingBit(LoraUSARTx, USART_IT_RXNE);# ]7 l( p# Q8 O8 K9 S
if(Lora_RecvData.Rx_over == 0)6 l: l6 }2 N3 ] q3 p* [
Lora_RecvData.RxBuf[Lora_RecvData.Rx_count++] = LoraUSARTx->DR;
6 f# p" t% j- o5 B5 c }, a# z; L5 R% N& K+ j3 G2 ~
if(USART_GetITStatus(LoraUSARTx, USART_IT_IDLE) == SET)( J7 B! ^; E& [ \3 b, c
{: `+ i7 [; Q" [: B
data = LoraUSARTx->SR;$ J: `& h, i* b& f
data = LoraUSARTx->DR;
+ X5 u( y: F2 J2 P
- ?. Y* M0 j" [6 P. s Lora_RecvData.Rx_over = 1; //接收完成1 P$ E6 Q7 {) Q. w- y* E4 a
}. O9 C. c7 L! q. b( }
}例程中,當(dāng)接收完成標(biāo)志 Lora_RecvData.Rx_over 為1時(shí),就可以獲取 uart4 接收到的一幀數(shù)據(jù),該數(shù)據(jù)存放在 Lora_RecvData.RxBuf 中。9 |3 h1 |5 H( L
超時(shí)斷幀空閑幀中斷的使用固然方便,但是并不是每個(gè)mcu都有這種中斷存在(只有個(gè)別高端mcu才有),那么這個(gè)時(shí)候就可以考慮使用超時(shí)斷幀了。, C, d# I6 f7 K5 y. {% d% a
Modbus協(xié)議中規(guī)定一幀數(shù)據(jù)的結(jié)束標(biāo)志為3.5個(gè)字符時(shí)長(zhǎng),那么同樣的可以把這種斷幀方式類比到串口的接收上,這種方法需要搭配定時(shí)器使用。
; d: D0 T* K+ U- g0 O% }其作用原理就是:串口進(jìn)一次接收中斷,就打開定時(shí)器超時(shí)中斷,同時(shí)裝載值清零(具體的裝載值可以自行定義),只要觸發(fā)了定時(shí)器的超時(shí)中斷,說(shuō)明在用戶規(guī)定的時(shí)間間隔內(nèi)串口接收中斷里沒(méi)有新的數(shù)據(jù)進(jìn)來(lái),可以認(rèn)為數(shù)據(jù)接收完成。% G( h0 x" g) }$ f: m! E! i
uint16_t Time3_CntValue = 0;//計(jì)數(shù)器初值& z7 A8 c* o3 m, I4 R% U
% o! A4 L5 l* G- @5 g1 q9 g/*******************************************************************************
\0 S& s% `8 ?$ ^9 N2 \8 _8 L * TIM3中斷服務(wù)函數(shù)& X/ @, \- M9 e' Q0 b* T
******************************************************************************/
4 `( L# J/ a7 |void Tim3_IRQHandler(void)
3 w4 j! U: J$ S{/ N N+ ?, u6 Q' L4 Y/ W" a5 b
if(TRUE == Tim3_GetIntFlag(Tim3UevIrq))
' Y# p! c1 X b9 x- x {
- g. z4 V: }+ S% r Tim3_M0_Stop(); //關(guān)閉定時(shí)器3
, D% H1 ^0 p+ p: f& J4 d Uart0_Rec_Count = 0;//接收計(jì)數(shù)清零0 l) T5 ^, R% Q: t: w
Uart0_Rec_Flag = 1; //接收完成標(biāo)志& r# [, Z/ \$ [8 m$ Y* Q" _) f
Tim3_ClearIntFlag(Tim3UevIrq); //清除定時(shí)器中斷
' y2 u+ ^3 c/ ^9 f' O3 |- ? }* D7 N- s3 g3 a8 ^7 k C# E
}
, X9 s6 a# ~3 J0 f& e2 L! Q1 }1 a 2 ~7 s! e9 z. H, Z" E
void Time3_Init(uint16_t Frame_Spacing)- i; O% G$ T% [. m2 c
{
$ ?) u" j# |. i7 Y2 e7 D7 o uint16_t u16ArrValue;//自動(dòng)重載值, v6 O7 ]2 e$ c" t
uint32_t u32PclkValue;//PCLK頻率' f8 L1 H" I6 B8 l2 }
) @& q z: N1 C8 _, Q' Y5 j. s9 h# i
stc_tim3_mode0_cfg_t stcTim3BaseCfg;
6 |# J- _8 x n$ `2 d7 R
6 V% A% m1 `3 ?% Q //結(jié)構(gòu)體初始化清零
' H, B4 P/ A+ C! y* |5 O! u7 u DDL_ZERO_STRUCT(stcTim3BaseCfg);* C! \. g3 v$ O5 u* ~, K. \
- H7 W! Z2 x5 p5 s8 m2 k! m0 X Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE); //Base Timer外設(shè)時(shí)鐘使能
9 [- g9 A1 `( n; p8 I( _ $ @- M6 H# d1 ^7 I3 W* R
stcTim3BaseCfg.enWorkMode = Tim3WorkMode0; //定時(shí)器模式6 H/ L) D8 C4 m# w
stcTim3BaseCfg.enCT = Tim3Timer; //定時(shí)器功能,計(jì)數(shù)時(shí)鐘為內(nèi)部PCLK. R" v' F- N$ [3 P3 i7 N
stcTim3BaseCfg.enPRS = Tim3PCLKDiv1; //不分頻5 W0 u7 n. B( h* r- \
stcTim3BaseCfg.enCntMode = Tim316bitArrMode; //自動(dòng)重載16位計(jì)數(shù)器/定時(shí)器
$ N4 E1 B0 c6 i# F stcTim3BaseCfg.bEnTog = FALSE;
# ^2 c, ^% Z# ` stcTim3BaseCfg.bEnGate = FALSE;1 A4 d1 |0 C" x9 V
stcTim3BaseCfg.enGateP = Tim3GatePositive;
; j; z/ n. j$ t/ i8 u$ l* b ; W, Z; b! y9 ?( {) |. p1 Z/ b6 H
Tim3_Mode0_Init(&stcTim3BaseCfg); //TIM3 的模式0功能初始化! O8 N6 T% a/ _( |" {; ?! { P1 S) D; h2 s
5 b7 V: i' i8 p7 Y6 Y: h" k
u32PclkValue = Sysctrl_GetPClkFreq(); //獲取Pclk的值
: i/ R2 s: Z. t- }7 [ //u16ArrValue = 65535-(u32PclkValue/1000); //1ms測(cè)試
) H/ [; z1 j8 U* y, D6 n: V" W0 L2 g u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing*10)/RS485_BAUDRATE*u32PclkValue);//根據(jù)幀間隔計(jì)算超時(shí)時(shí)間4 I T1 ^, x3 [2 k P& F
Time3_CntValue = u16ArrValue; //計(jì)數(shù)初值: f9 l4 m9 l7 `4 y
Tim3_M0_ARRSet(u16ArrValue); //設(shè)置重載值$ e% o% d% S( t0 b, |, U% N
Tim3_M0_Cnt16Set(u16ArrValue); //設(shè)置計(jì)數(shù)初值. H0 y% x: q; |2 q
4 p) }7 q; O5 F' r; V
Tim3_ClearIntFlag(Tim3UevIrq); //清中斷標(biāo)志3 W2 h. I& a: q3 X1 |: }- O, g
Tim3_Mode0_EnableIrq(); //使能TIM3中斷(模式0時(shí)只有一個(gè)中斷)
1 C: e7 v* \6 h. c8 ?, B r0 Y2 H EnableNvic(TIM3_IRQn, IrqLevel3, TRUE); //TIM3 開中斷
/ ?( w) p% K/ `! B4 a} ! h# {9 W6 \3 g2 \9 _+ I' Y9 E
5 N& V" t( K9 c/**************************此處省略串口初始化部分************************/
7 I! J m+ N: N: W//串口0中斷服務(wù)函數(shù)
5 j) L6 C% X1 |& Cvoid Uart0_IRQHandler(void)
1 o* V% A3 e( G: {: F) b$ S{
- z0 A- [$ e( {, `# t uint8_t rec_data=0;
! Z! v( _: u- Y: s 7 }3 ^: `, h6 I! J2 u( j+ g
if(Uart_GetStatus(M0P_UART0, UartRC))
/ L2 k% |, [' Q2 N, J {
% p1 @; T- f1 r0 Y) V& } Uart_ClrStatus(M0P_UART0, UartRC);
3 m( h7 I' i/ D rec_data = Uart_ReceiveData(M0P_UART0); 9 [1 [% U* M; _& g. j! {
if(Uart0_Rec_Count[U]//幀長(zhǎng)度, J, F% B4 n! a: j4 N4 c# W; M* C
{
9 W8 u$ f7 {: x, F$ z5 V/ Z M5 f' A6 H Uart0_Rec_Buffer[Uart0_Rec_Count++] = rec_data;
# A! O8 X% Q' a$ M }
4 ]' F% z" H1 \4 v; f' w2 } P; y Tim3_M0_Cnt16Set(Time3_CntValue);//設(shè)置計(jì)數(shù)初值 2 f" ?& R9 f6 m7 U( @
Tim3_M0_Run(); //開啟定時(shí)器3 超時(shí)即認(rèn)為一幀接收完成0 N# x4 p% _" r' Z. z' z
}
7 K1 Q7 W5 [ F3 W& v$ r}例程所用的是華大的hc32l130系列mcu,其它類型的mcu也可以參考這種寫法。其中超時(shí)時(shí)間的計(jì)算尤其要注意數(shù)據(jù)類型的問(wèn)題,u16ArrValue = 65536 - (uint16_t)((float)(Frame_Spacing * 10)/RS485_BAUDRATE * u32PclkValue);其中Frame_Spacing為用戶設(shè)置的字符個(gè)數(shù),uart模式為一個(gè)“1+8+1”共10bits。
! U {) F2 I3 p0 C: }狀態(tài)機(jī)斷幀狀態(tài)機(jī),狀態(tài)機(jī),又是狀態(tài)機(jī),沒(méi)辦法!誰(shuí)讓它使用起來(lái)方便呢?其實(shí)這種方法我用的也不多,但是狀態(tài)機(jī)的思想還是要有的,很多邏輯用狀態(tài)機(jī)梳理起來(lái)會(huì)更加的清晰。
" W) o1 _7 ~) N* Q相對(duì)于超時(shí)斷幀,狀態(tài)機(jī)斷幀的方法節(jié)約了一個(gè)定時(shí)器資源,一般的mcu外設(shè)資源是足夠的,但是做一些資源冗余也未嘗不是一件好事,萬(wàn)一呢?對(duì)吧。
3 P7 E* @! r9 u5 u! _//狀態(tài)機(jī)斷幀
1 f% Q3 \, S8 I8 Nvoid UART_IRQHandler(void) //作為485的接收中斷
/ n8 C R$ [1 [. ~7 r# F{/ i& f7 V5 f1 a7 \6 { [
uint8_t count = 0; R' D9 O! M0 C, e
unsigned char lRecDat = 0; $ U6 ]$ Y# K; \% t: Y8 N
8 P6 N( ^: H# d+ I4 [4 L( @: C
if(/*觸發(fā)接收中斷標(biāo)志*/) / ]- R* k1 P% x5 h% E; }
{
$ @/ {6 S% ~0 {+ m! V //清中斷狀態(tài)位6 l7 M' ]/ z, y0 n }
rec_timeout = 5;3 b* I; o! U' J$ T
if((count == 0)) //接收數(shù)據(jù)頭,長(zhǎng)度可以自定義
; w2 R1 c, s' ^' r' W0 ? {' g0 `9 K9 a% S9 E* c
RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;
9 h" u3 M! y- t gRecStartFlag = 1;
% B6 ~$ m! ~+ `+ A return;
0 j( z+ M" r; W2 V' a" c* n }
" t2 A; Z9 l2 }) W) G) f5 U" f3 p if(gRecStartFlag == 1)
/ t8 A( z; `) A$ X7 `1 m q" r {
# S! E2 `5 u! U. K RUart0485_DataC[count++] = /*串口接收到的數(shù)據(jù)*/;4 q( \) U* ^7 {
" B7 d2 b: h+ S2 N$ l
if(count > MAXLEN) //一幀數(shù)據(jù)接收完成3 e+ G9 q$ r w- J, u9 V$ m6 P
{
( _% M5 T* C9 q/ O count=0;
6 e0 J( ]4 r/ B. M4 [ gRecStartFlag = 0;
S/ A: R. z/ O & f# q# M, c9 i% D8 m2 }' K
if(RUart0485_DataC[MAXLEN]==CRC16(RUart0485_DataC,MAXLEN))
( c/ D2 {- L; o {
2 h8 Y5 y* B# c memcpy(&gRecFinshData,RUart0485_DataC,13);
' E! v$ Q( w9 H1 i8 C1 _7 D, ` gRcvFlag = 1; //接收完成標(biāo)志位 5 V" Y; _- G# Z! P. ]4 S
}0 y! J0 W7 [4 b5 F
}
8 t0 ^! C( N7 c) k# r" x }1 ]+ i' u/ }/ y" b) \; c p6 \0 [) D
return; + H& `) f2 I T" d
}6 ]& j+ ~8 a7 ~1 d
return ;7 o4 Q* `( |* u( Q9 d5 I& c
}這種做法適合用在一直有數(shù)據(jù)接收的場(chǎng)合,每次接收完一幀有效數(shù)據(jù)后就把數(shù)據(jù)放到緩沖區(qū)中去解析,同時(shí)還不影響下一幀數(shù)據(jù)的接收。
1 |0 j3 t. P* A1 \% y2 x整個(gè)接收狀態(tài)分為兩個(gè)狀態(tài)——接收數(shù)據(jù)頭和接收數(shù)據(jù)塊,如果一幀數(shù)據(jù)存在多個(gè)部分的話還可以在此基礎(chǔ)上再增加幾種狀態(tài),這樣不僅可以提高數(shù)據(jù)接收的實(shí)時(shí)性,還能夠隨時(shí)看到數(shù)據(jù)接收到哪一部分,還是比較實(shí)用的。
6 E+ Z% G; \; G. o"狀態(tài)機(jī)+FIFO"斷幀記得剛畢業(yè)面試的時(shí)候,面試官還問(wèn)過(guò)我一個(gè)問(wèn)題:如果串口有大量數(shù)據(jù)要接收,同時(shí)又沒(méi)有空閑幀中斷你會(huì)怎么做?6 Y5 ?; H9 d: X- E9 E) ~ Q
沒(méi)錯(cuò),就是FIFO(當(dāng)時(shí)并沒(méi)有回答上來(lái),因?yàn)闆](méi)用過(guò)),說(shuō)白了就是開辟一個(gè)緩沖區(qū),每次接收到的數(shù)據(jù)都放到這個(gè)緩沖區(qū)里,同時(shí)記錄數(shù)據(jù)在緩沖區(qū)中的位置,當(dāng)數(shù)據(jù)到達(dá)要求的長(zhǎng)度的時(shí)候再把數(shù)據(jù)取出來(lái),然后放到狀態(tài)機(jī)中去解析。當(dāng)然FIFO的使用場(chǎng)合有很多,很多數(shù)據(jù)處理都可以用FIFO去做,有興趣的可以多去了解一下。/********************串口初始化省略,華大mcu hc32l130******************/
( R1 [5 f6 u5 N2 svoid Uart1_IRQHandler(void)
3 \% i4 A0 `* s+ z/ l{
! R0 G% F5 R$ u/ u; N# i N' s uint8_t data;1 }1 H1 Y! ?. G
if(Uart_GetStatus(M0P_UART1, UartRC)) //UART0數(shù)據(jù)接收
7 P, W3 T! |4 ^ {
* D ]* M7 C+ d" D3 b% H3 k$ O; k6 ~ Uart_ClrStatus(M0P_UART1, UartRC); //清中斷狀態(tài)位% s3 b+ R$ r9 D
data = Uart_ReceiveData(M0P_UART1); //接收數(shù)據(jù)字節(jié)
% n0 L4 l4 o8 u comFIFO(&data,1);
: y5 V9 j# b& ^/ m3 l }
. [: b& v3 C6 p+ J}! B! f; N' a7 F7 @$ W
! \. w6 y' P. k, ]
/******************************FIFO*******************************/
9 v# s3 p! t( H3 ?2 u0 |volatile uint8_t fifodata[FIFOLEN],fifoempty,fifofull;2 Q. \8 p# x9 j* z, @+ L8 g
volatile uint8_t uart_datatemp=0;
) v& \' q$ T* I D
$ W( |% t# P6 t/ F6 Ouint8_t comFIFO(uint8_t *data,uint8_t cmd)& a4 @* Y" @* {1 O! B/ F
{0 [7 ]2 f) R6 s3 c+ o( i+ C
static uint8_t rpos=0; //當(dāng)前寫的位置 position 0--99 + T& ^ B. \- U8 v+ }: m f- H
static uint8_t wpos=0; //當(dāng)前讀的位置+ @; F, m% H/ x: k" L1 u9 K0 y
! {; |& b3 i' i( y) E& g2 k
if(cmd==0) //寫數(shù)據(jù)
0 h, r9 j9 L( Y; P {3 G& }0 M9 Q$ h# m3 ` ^5 o( ]
if(fifoempty!=0) //1 表示有數(shù)據(jù) 不為空,0表示空
4 s1 X+ O* W0 A* Y* s/ y {2 p- D+ G; F, }. l" R4 B
*data=fifodata[rpos];
' v7 e+ [& S: J0 c; H fifofull=0;
5 S) L; w8 C% `! B* B rpos++;
% Y. ^' F; U Y6 f if(rpos==FIFOLEN) : Y- `! ~/ T; N( D' f
rpos=0;
/ c: B( e2 a, Z7 y if(rpos==wpos)
' V0 _7 r' \$ A( W" e' Q% e" A fifoempty=0;6 ?3 L6 o: n7 V7 ~' H% a
return 0x01;/ X, L1 v5 J9 \6 M; Q9 P3 r9 B
}
+ Y" ?- D. X; d1 K; ~% ] else
" J& G( M, ~) M" L( X- }: H return 0x00;, A% U1 S( k/ P. ]8 T
% k* W- O( f3 \: D+ [9 q } 1 Y( k$ n" Y8 G
else if(cmd==1) //讀數(shù)據(jù)1 V3 B5 ?" n2 N0 Y2 P9 D
{* a6 v, h4 l' d, p# J
if(fifofull==0)
6 c0 i. w/ @* b6 T" g {
7 P0 |, Z* M& w4 B1 w- r3 L fifodata[wpos]=*data;
3 s, k' U4 y Y# ]# c: `. o fifoempty=1;' g! X+ U5 C$ m% _( @) t' y( W' N: Q
wpos++;' l/ U3 V1 @# ?$ D8 {. N
if(wpos==FIFOLEN)
7 T5 O) M i" C wpos=0;
4 g& D, y# r8 U I6 a3 h+ o- H4 d if(wpos==rpos)
7 c/ o) n0 E) {! F; a% J fifofull=1;
, Z! F9 c; F8 ~: ?; z# N! @3 | return 0x01;
7 k2 Q# K5 L$ m# Y9 j" r% z# ] } else5 p, l& D: c# [7 w
return 0x00;
, v8 V8 t* x! S6 _! _# g1 a8 d3 k; e }
3 U4 s& x f5 \, g* |. }2 W0 r return 0x02;
0 ~8 Q# J& I2 I}
l+ U- z9 ?4 g
4 F( O& w. u* o, h2 I. h0 ^/********************************狀態(tài)機(jī)處理*******************************/
+ b" w8 x; x1 i" f+ jvoid LoopFor485ReadCom(void)$ e: Z+ I. b( Y" j: W! q
{4 w. |" r5 V& f' q8 r. l* T+ j6 J
uint8_t data;
, q: {; O' L5 ^, o9 V
3 i* a9 a) i7 h0 J4 z while(comFIFO(&data,0)==0x01)
0 S9 ^. t+ J8 Q) F' k& |3 Y {
" [3 Y+ y/ ^1 _, u1 P: J0 O6 E if(rEadFlag==SAVE_HEADER_STATUS) //讀取頭
! E8 I# D0 R4 T6 ~5 b. U {$ w, s. A% V3 o
if(data==Header_H)8 L5 f% r2 G. B6 g
{% m* @ b6 n8 I0 `
buffread[0]=data;
) T1 {) @( e9 N continue;) a2 f" o+ ]( t7 ?" }
}
' j) U8 E" ]- P2 { M if(data==Header_L)/ [# |( M/ z% D' S, c- T
{
) R+ q2 }0 J" I& H; A/ u" x buffread[1]=data;+ {! G4 C$ [; a4 p$ s
if(buffread[0]==Header_H)8 F2 F9 ~' @* V. C6 `1 T4 {+ |
{
) p0 j" j% ~; ?" p. W rEadFlag=SAVE_DATA_STATUS;
% V x$ F. w# U6 ?/ v }) n ]' @/ `/ l
}
/ b' r9 w0 U8 I5 U5 { else
2 d8 r2 r5 D5 m$ r {; d) F4 M+ x& l% d, Z" V1 X
memset(buffread,0,Length_Data);# l9 j! h1 n a: ?( w, y ]
}
! m V0 [* z5 y" M }
, U/ a# @2 l4 }. e9 n else if(rEadFlag==SAVE_DATA_STATUS) //讀取數(shù)據(jù)% h% Y" T( e; o, d4 o# N
{
$ b: o- e; F9 e buffread[i485+2]=data;6 Y* [4 Z8 S8 u# I! R
i485++;
2 P! F. D# Z+ ?& o, E: ]8 i3 K if(i485==(Length_Data-2)) //數(shù)據(jù)幀除去頭/ k: n4 J$ [/ ~# @" }
{
1 f7 m& |8 o% N unsigned short crc16=CRC16_MODBUS(buffread,Length_Data-2);
! e$ |9 d0 J- _# [. C; A if((buffread[Length_Data-2]==(crc16>>8))&&(buffread[Length_Data-1]==(crc16&0xff)))/ `/ h+ ^8 W' c8 T7 J( ~
{6 t) P& m6 d# \* n( d! H
rEadFlag=SAVE_OVER_STATUS;
) q% h0 y0 O1 _" p- e memcpy(&cmddata,buffread,Length_Data); //拷貝Length_Struct個(gè)字節(jié),完整的結(jié)構(gòu)體
8 i% F! R- @$ q- y0 G }
' j2 ^ o1 t* U" ? { B+ c else
/ n. p2 M1 [+ p; e { o; ~( ]! U) A: `3 k% S# N0 U
rEadFlag=SAVE_HEADER_STATUS;
8 L. R3 b2 Z- r9 F5 Y2 C9 E }1 W9 e" w, A# h* V; x
/ G, J2 x3 o1 V/ O
memset(buffread,0,Length_Data);
7 W/ R) L; H; ~' ~8 j3 o4 b& l2 t i485=0;" _" v0 w, e1 o( m
break;
% P* {6 Q( @( S3 e- a# K }! I: `) f a _ t
}
( C( B3 }5 d8 `3 J }$ ^- Y: R1 M3 K* |+ Q- ]( _3 a% k" O H
}原文:https://blog.csdn.net/qq_56527127/article/details/123018515
5 i+ D) ]' } ^/ a: a
ohb1aidbpas64054373034.png (769.97 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
ohb1aidbpas64054373034.png
2024-12-2 23:14 上傳
7 _8 q+ t* a, S
-END-; z; z- b7 Q+ y# A( y" q
往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀6 @( n+ X* k; t0 u
6 b& m5 [9 ?* L& M. g3 j
' [8 d* L- c% i; K+ ]5 a' Z6 ~0 t+ E7 R ; ~' v/ ^5 J$ y7 M
. }: p4 f. h( [7 D5 z
5 v+ t. Z, r+ e
ptzib2nqqkv64054373134.jpg (112 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
ptzib2nqqkv64054373134.jpg
2024-12-2 23:14 上傳
6 { D/ `9 i) J9 s+ N7 V& `2 P
! G& L' l7 T1 L3 ?+ Y; }; e
嵌入式軟件調(diào)試,如何計(jì)算任務(wù)的運(yùn)行周期?
9 L0 J* x+ k, X0 Y% a
" L4 D6 f/ T. ]
: J5 X5 a8 I5 l& g. ~# \% v " j% C0 Q% r, t6 u/ r; V
8 y8 j+ B4 I" \* u+ c0 l7 q: _% S / y# G/ V' i0 r) O
. F% R N. U3 z( t0 X
3 W7 j6 O& Z h" ` : B: ?, S8 c4 S7 B! R- b; P- g3 D
3 L+ y, t( b& X# h* W! n
0 o% \& X) c1 s; s' u* d' H
iarkvaxoix564054373235.jpg (124.11 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
iarkvaxoix564054373235.jpg
2024-12-2 23:14 上傳
{1 _" j3 h/ k1 h+ e1 T
}3 n5 X/ a1 v/ U, \7 m) W7 l
嵌入式軟件,如何把編譯時(shí)間加入到bin文件,進(jìn)行版本管理?
/ t+ k' h: R7 z4 e3 Y9 c
" U, H& [8 m9 }* i6 z$ T- L
3 N3 g( u0 N) ~& `# l0 |
2 e6 F- J O) u9 D. @ . [2 d% e5 u6 M$ R
( u$ i& f# Q4 y( L; i$ l. A
" c" H6 ^0 m2 P, r2 ^9 s5 A + \6 n5 V3 C. i4 L8 y
4 U' F; p' J6 u3 K. ]8 U, U5 H
, ^, Y, h! N* ?1 T* [
! ?* K5 k$ t, Y# v. P
e31rvw53ost64054373335.jpg (258.23 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
e31rvw53ost64054373335.jpg
2024-12-2 23:14 上傳
3 ^6 u( |3 R [+ m/ Y/ S ! S1 [* I( F9 |2 X4 O( L
嵌入式初學(xué)者入門后,應(yīng)該如何開始進(jìn)階學(xué)習(xí)?$ [8 Q p7 O6 _, T0 O7 c. D
) h* O( @. {- W+ I# s }# P
5 ~; }; S5 d g. Z0 s0 g3 ~) W# A
l) N1 Y6 p. }1 D" u/ _& S
7 Z" ?/ l4 f, m6 @# Z5 o/ L 9 j% V5 a9 n* b3 R K* D/ c2 G
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師+ z% q& v4 V) ]" W( Z& t/ L' Y
關(guān)注我,一起變得更加優(yōu)秀! |
|