一、源码处理1 r0 Y) e! H: \0 S/ }% K! Z* I
文件下载
, ~! M f8 G0 d/ q; S3 [1、官网下载源码0 `2 x& U) H/ f; F+ |6 c
* n) f" y+ I9 | l4 ^1 }9 a& z# x
x: v/ n: d( p6 o$ t
2、找到相关的例程
/ M& v; Y" @: y. g% h7 a+ Y) G6 f* x+ `6 I6 R
7 M* s1 R( {: g
3、进入源码文件
- \- z8 d& A% F' F' r
% d# R& `! |' U2 H3 a2 q3 U
: E6 P+ q" Z2 r- d* c- q6 r/ N. z9 r- @0 I) j
4、找到相关的文件2 D' Y1 j& \: y9 F; h+ b
! K( ?! Y! F7 i! N) t
9 {+ `% g5 r, a1 c5 O, x+ B
5 h0 H# X- j5 L ^4 S T5 ekeil、RVDS为需要的文件,MemMang为需要的内存文件9 R$ T7 x9 ?7 F& h1 z
# J V: q0 f6 R, [. m1 ~
文件移植
! d2 ~- U& s' |* @* J. J1、在之前led灯程序基础上添加文件- A- B5 @6 e8 O
注释:在正点原子开源工程里可以下载) Q! a- D; A% u- C8 ?. v- I
/ L$ b3 I, _ c; A
# w% L& p4 y6 F7 N8 w
" Q2 m6 q* w: _) s5 ^% z! J; v. d' |. i
2、将相关.h文件包含进去! M% x/ M& s/ d0 }9 x" g+ c
+ M7 F3 H [( m2 r: Z% q2 C3 n. c+ G; f4 w, A _: O: z6 Z
* ~3 \) R5 P! A( k% `9 i
此时编译会报错/ R" F3 J5 n% ~! d8 N6 y3 R6 u$ p
继续包含所需要的文件& E9 Y( g8 T9 f5 s3 K* Q/ a9 n# d
+ t- Q/ C5 O5 r1 B; J# M9 N( N: D
0 Z( P' u/ t: b% s( T: D6 f k% D! [7 j2 v
文件地址:; j/ Y! _$ |( E- q% j
: }4 ?+ m1 Q+ s
. O+ I, y5 B: l7 a e! c
' ^) ^3 V- B' P
3、修改相关文件: r6 R* `3 N, Y
8 U5 W, C; R" A5 L: |注释:正点原子给的工程例程是支持ucos的,所以我们需要把一些oc相关的删除掉
* J- [+ Z$ A {" p# y8 Q/ T以下是修改之后程序代码:; @6 V( z9 ~) O- W5 E; x6 }
sys.h
& f5 }' i$ u* @& q) L. p
3 m$ d$ p3 ?* t2 m' e( \! E; b' S% w7 W! g7 Z3 v# k6 @& Y
( B8 ?2 |& |" X5 P* S, J$ }% C
usart.c
8 }! x. K) s( X# ^' f* _: J) u. e5 k8 Y% f& M- V' H6 k
7 J5 ` @: }9 v" |9 E% m2 g7 b& c* Y) i9 K4 H6 g
原来是include.h,需要改成FreePTOS.h
. ]$ G4 n& Z$ i6 c: b7 u- H& v4 O7 A( n' [. S; T+ N
delay.c: `" ^5 n6 p; W, R; [* u9 r- H
& o! f9 T0 H, ~( v! i$ V3 @3 ^$ J% G
1:SysTIck_Handler()0 K' G' ~- ?7 q
- extern void xPortSysTickHandler(void);* X( }, f7 V {3 E
- Z; \0 ]6 b, u5 O* p' H- ^1 n/ c
- //systick中断服务函数,使用ucos时用到, m% y; F% O6 s& V; D; |
- void SysTick_Handler(void) M+ [; o) S4 R5 s$ c
- { / {' [2 A6 t( \1 H5 v3 ]- b
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
, }5 A% c* f# l/ r1 H* f - {" }) j! j) n$ @; c9 m6 t% U3 V
- xPortSysTickHandler(); 9 |) A: A( X. F2 }+ Q% r6 ?
- }6 x8 W; d& f- o/ ^. t+ t
- }
复制代码
# `6 `& O$ O; \1 o6 [' D2:delay_init% ], m6 I8 P; g2 d( _! T
4 a( G7 F& L ]8 e) n- oid delay_init()
2 v! O8 D5 J6 u' b - {
- [4 l4 }- s4 F$ T* d - u32 reload;8 r' p6 z+ K8 ?: L& l3 b. @+ M
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
3 }* ^7 o8 i9 {( o2 ^2 u - fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用
) f# Q9 \' |6 o5 b - reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M 6 `( I' D6 F _+ ~; R% d
- reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间
! {& b2 P( G6 k) L7 w( m# g - //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右 q5 q. W/ w. U% H
- fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位 3 S$ ^$ v/ C) \& l0 w
- , n7 }" h1 c6 v F2 C1 A
- SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
4 b' D; y3 D: J - SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次 $ N9 \8 l0 f! d$ X. S; C
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK $ }8 ?& u$ ] l( x7 ^; I% r
- }
复制代码 - _; }4 P. F; U( i
3:两个延时函数( \8 o7 A ` \3 C
& v# g( Y3 R8 h, l- //延时nus
* ?& V. \9 O, W - //nus:要延时的us数.
/ J0 B- c$ I7 V# N) E: i4 d - //nus:0~204522252(最大值即2^32/fac_us@fac_us=168)
+ a9 B/ {. m7 G - void delay_us(u32 nus); }% p i# b- r7 O+ R( |8 @0 n
- {
* Z- m' ]+ h: f - u32 ticks;; j- F. A& h( D% J$ m
- u32 told,tnow,tcnt=0;
) I+ g# |7 `( i. h6 F3 [! v2 } - u32 reload=SysTick->LOAD; //LOAD的值 , G) b& v5 r& }
- ticks=nus*fac_us; //需要的节拍数 % \0 L- b% Y0 ?# |2 z# U: z
- told=SysTick->VAL; //刚进入时的计数器值
9 D/ i3 G8 O$ a& [2 y5 l3 v - while(1)
4 j" l' o: N" O; P s+ b/ m - {. ]& Y! }7 j7 G$ ~8 [. L2 C( }$ t
- tnow=SysTick->VAL; $ }8 G1 |. y( L! v4 t n i
- if(tnow!=told)
/ Q' s4 { W% t/ G - {
6 B! Q4 e) l1 s - if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.( C. C" B$ U; [6 K- X
- else tcnt+=reload-tnow+told;
' C# A/ A4 U" h- F - told=tnow;. M( `) @' x. I$ X( a9 w9 s
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.4 Q6 t5 J3 m8 S5 d
- } : x& V& k8 S* j" ~" P/ v- f' W. \
- };
, P) \) m' t6 k" d4 S - } 5 p% D' t# [" n( J) g& X9 ^
- //延时nms9 b8 x0 q4 X/ Q4 Z" {
- //nms:要延时的ms数
O$ D% i2 L7 F- U - //nms:0~655352 L# ~" `2 j" r( V
- void delay_ms(u32 nms)
' F" E! U3 O: w8 L, W# I: l - {
& O9 u+ i+ q* ?: p* S. P' J& A+ l - if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
- p, M, C' b; b# _8 w+ U - { . s) H7 H% o* N4 T
- if(nms>=fac_ms) //延时的时间大于OS的最少时间周期
# ]. H6 @9 |! ?: |% L2 C - {
6 n: r; I5 r- q2 ?) a - vTaskDelay(nms/fac_ms); //FreeRTOS延时
; a( e5 |0 |7 l! h4 R - }3 r! G4 T3 T% b3 L8 F" N1 e
- nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时 3 x" ?& ]: i# P0 s( U' ~* q
- }6 u0 F# K6 ^- T
- delay_us((u32)(nms*1000)); //普通方式延时
% ~! |( K% @. g - }
& e: d& [: c/ f, M) m - 1 n8 [# b+ Y& N. m% K/ l5 q
- //延时nms,不会引起任务调度
% [: b0 ^2 p& ^ - //nms:要延时的ms数$ V( }, [- i: \/ S
- void delay_xms(u32 nms)
4 m$ _2 }1 J, H$ ? Y# ] - {% u1 X9 K* c$ D3 ] u
- u32 i;4 S( M, N( D* p: P
- for(i=0;i<nms;i++) delay_us(1000);
4 n/ t# s8 k n6 d6 E - }
复制代码
3 S/ _; D5 U4 w2 H& }1 j* E4 A4、屏蔽中断
& D1 G/ [, p. V" V! S! G" C9 h, }. F! J
& R( O( D* W. {) N4 h4 ]
! a5 R$ h7 g; G0 w$ T/ ~$ D$ B5、最后编译一下,就创建成功啦!!!3 ?4 C4 y; Q) d) a* |% b( S6 c3 E
% _4 V* w* Q q L O创建任务并执行任务
, {; P# X% _& L3 C7 D+ m创建任务分以下步骤:4 b+ e! {, X4 J
- 设置任务优先级# {. P1 P6 Q# ~7 I4 \
- 设置任务堆栈大小: \' b {+ `& n0 e% K9 I
- 设置任务句柄 X, ], X( {% o' n2 \- ~8 i% e
- 设置任务函数
复制代码 我创建了一个任务,使得两个灯同时闪烁,以及串口输出Halloword,以及在移植OLED屏幕的程序1 \ J8 T C; C6 ^0 f8 \
9 n# Y' D' Q3 {: q8 D3 D. }1 I% [OLED程序移植相对简单,只需要把相关文件夹进去就行5 t% J3 N) y7 f; q! ^( j. y
这是移植所需要的的一些相关文件:
! M, z5 J4 U0 n( [! Y+ V, U5 Z2 ~, F' E% Y5 r `- A R+ ?( L
1 k1 h* f& F8 s9 h5 ]) z1 s8 }其中NRF24L01.c是无线通信模块的,我还在肝中,有需要请私信我。: u' t" G1 s( L& q2 ]
主函数:% x% U6 H4 q# N# b
/ z7 t! h: l' V0 w+ ?6 p% f; w/ C- #include "sys.h"3 M0 A8 V) a* D7 B$ U
- #include "delay.h"
* l5 z7 L4 c) o& I/ c/ ~. x1 Q/ F - #include "usart.h"
; M$ ]0 j) c% k5 @ - #include "led.h"
% J; f; C$ u, O( _8 q - #include "FreeRTOS.h"
! O( ]% P* A- ^- A& \( Q1 Z. N - #include "task.h"
/ \% K* _0 T* g1 }3 I) Q! e% G8 d- c: m - #include "lcd.h"( b5 t, {5 v5 ~
- # M* a/ {* D6 u" X
- //任务优先级2 u, c; R: F! j4 a% s' c( A
- #define START_TASK_PRIO 1/ ~" ~/ [, l% b8 Z7 K3 a" [* L& w
- //任务堆栈大小 w( C# J$ B- k% y, f) W
- #define START_STK_SIZE 128
+ g* K! t" |7 ^% z5 I - //任务句柄
: L4 \( Q( u0 ]4 e' }* o% }% u8 Z - TaskHandle_t StartTask_Handler;
$ g- @! t9 F) D/ ]" E: X9 P - //任务函数5 P7 |. o& r B+ r" O- x, `* g
- void start_task(void *pvParameters);
4 O b. [2 T, J7 }$ x - 8 |: |3 m; F; |- ^0 K! Q
- % c+ I6 j- d2 Y- M# [( }/ }
- //任务优先级; Y1 N5 Q8 ~1 b$ F5 e
- #define LED0_TASK_PRIO 2
2 m0 ?, R! D+ [9 _; Y - //任务堆栈大小
" |; O& ]. k! B; M - #define LED0_STK_SIZE 50 3 k3 I% A1 [% l! O
- //任务句柄$ w3 h8 Y0 k, l+ D3 b& y4 I3 u
- TaskHandle_t LED0Task_Handler;4 P1 ]; f p! L i
- //任务函数5 z& ]; x' Y" F0 X! L
- void led0_task(void *pvParameters);/ U& t7 l* }6 s' u3 @4 d
- + \) H. h7 k6 r3 \$ U2 U
- //任务优先级
% M# V# k! H& V1 ]) d3 q - #define USART0_TASK_PRIO 3
' e0 G! k" \& F8 ? - //任务堆栈大小
% N f4 {6 f' G( A3 p1 c - #define USART0_STK_SIZE 50 ) i+ R8 B B7 A; `5 i
- //任务句柄; A3 `! R) U5 e* ~
- TaskHandle_t USART0Task_Handler;" ]' m: }) `2 C+ u0 U. H0 @' G
- //任务函数
9 ^6 V/ j& l; G! A - void usart0_task(void *pvParameters);& Y3 D8 X7 Z& i2 x P" \
- , v) V7 _8 ?, N& Y2 a
6 O3 I4 a+ A; \0 P- //任务优先级
b) V/ z$ c. G0 x# Z$ {4 \7 y: L - #define TEMPER0_TASK_PRIO 44 ?4 b3 Y2 S# F3 e6 p4 V. D
- //任务堆栈大小 # u z4 x. f" N }/ g
- #define TEMPER0_STK_SIZE 50 , `% i3 @7 I. D; V W& {" E
- TaskHandle_t TEMPER0Task_Handler;
' c' `; Z) @5 H8 j; v - //任务函数
! O3 g6 k% f# r6 r, g( {0 y8 { - void TEMPER0_task(void *pvParameters); R$ B+ g' |$ I" `! |1 r) g& z
- 4 Y ~1 }7 E" T! ?
- : D6 y! u8 M" ?4 U( k. Z( q0 v
- //任务优先级! A7 N( N5 \2 O- Z& C. D
- #define LCD_TO_TASK_PRIO 5
' I) S: G0 H: l# E7 Y3 W - //任务堆栈大小 * A1 ?2 i8 k) j5 [
- #define LCD_TO_STK_SIZE 50 + z* m( \6 m2 o$ N4 w b
- //任务句柄' f5 L4 p0 m" \
- TaskHandle_t LCD_TOTask_Handler;
) B5 W/ |/ f6 t g, e' [, ` - //任务函数+ }! r3 _, W5 h" F+ S. X. z
2 \6 z' b+ b3 B k" M- B& a- void LCD_TO_task(void *pvParameters);
) B& L+ Z! N# R8 V: g! Z - //任务句柄
" ?9 v8 j( \# V
% \% \# d; |5 m& i K1 G5 v- TaskHandle_t TEMPER0Task_Handler;3 B6 U \1 `- |
- //任务函数: e( l" |0 k; ]: D& P" g j
- 1 m; P# T0 q6 r" }# H+ k: H
- void temper0_task(void *pvParameters);
( s' f4 d( x! t e - int main(void)1 I0 y( V' J8 Z' \- c
- {0 r" B g1 _9 ]% ?- W
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
) C" A8 P4 W2 l - delay_init(); //延时函数初始化
$ ]: X, V, J# b' H# Y - uart_init(115200); //初始化串口
% t& \: w& m5 u/ b% P: I, w( q - LED_Init();
. C- W& X& k8 d5 L0 b; ]$ x" v% U* L3 R9 f5 P - //初始化LED
- w* I7 W" K' X, K$ } - LCD_Init();6 B9 Q7 I5 N& C9 {. X {1 d- C
- POINT_COLOR=RED;& ]2 ^2 P, N8 o7 `" M: H
- //初始化LCD
2 F" w }% T c9 h6 V: | -
& |0 u* Q; m8 P+ U5 s - //创建开始任务
. a4 s+ J7 p* k- H6 I, i3 I - xTaskCreate((TaskFunction_t )start_task, //任务函数
$ [+ d" f* J3 o0 A; I8 O' H - (const char* )"start_task", //任务名称
. L5 v/ }+ H5 A/ o - (uint16_t )START_STK_SIZE, //任务堆栈大小
, p8 V" l' w& n - (void* )NULL, //传递给任务函数的参数
* O' F# c) q$ \4 d" b - (UBaseType_t )START_TASK_PRIO, //任务优先级' o6 b2 [6 ~; \3 R/ m5 q1 ~
- (TaskHandle_t* )&StartTask_Handler); //任务句柄
6 z0 w$ ]$ a) L - vTaskStartScheduler(); //开启任务调度' l4 ^% Q2 M" C5 Y) t% s0 k1 |
- }
( M! Y3 ]- V3 j* A1 b' T1 v# m
( Q0 Q/ X9 O) u+ V0 u n: l6 t- //开始任务任务函数
: r" ^) w; |8 x8 b - void start_task(void *pvParameters)
5 m: |' R* C" I - {3 [# I/ X+ `* k! @3 E7 r
- taskENTER_CRITICAL(); //进入临界区# V F5 G' h% d9 ]6 P( f" n5 k
- //创建LED0任务2 n- U. S6 O* b/ f
- xTaskCreate((TaskFunction_t )led0_task,
. D' J- b, E2 J( r& ?1 } M6 q g - (const char* )"led0_task", 8 E; K3 u7 m$ O; V4 r
- (uint16_t )LED0_STK_SIZE, 1 K# o) I4 f% v
- (void* )NULL, ; q3 r( R8 u' G# Q% E5 l
- (UBaseType_t )LED0_TASK_PRIO,
. y5 C( L/ \6 o) g- P - (TaskHandle_t* )&LED0Task_Handler);
8 F! I, \+ s# J2 I - //创建usart0任务
5 R. M- ^- z' V& e: y+ Z - xTaskCreate((TaskFunction_t )usart0_task,
/ x/ M$ @7 _+ i/ b, K0 @ - (const char* )"usart0_task", & Y" f+ t3 L$ m! b7 `
- (uint16_t )USART0_STK_SIZE,
* x/ @/ L2 I3 w& I0 {' w - (void* )NULL,
! R3 W3 C& W9 D; F$ G; V$ E - (UBaseType_t )USART0_TASK_PRIO,
9 r0 @( {5 R) \$ N. a) o- \ U - (TaskHandle_t* )&USART0Task_Handler);
, Q% S3 I8 G$ X, b4 ]& [% V! C - //创建temper0任务
9 f4 \- i6 ^1 s3 W - xTaskCreate((TaskFunction_t )temper0_task,
7 Y% r: m# m+ p# I- q3 ? - (const char* )"temper_task", 2 i, J& z0 A3 y4 L4 d* g u* w
- (uint16_t )TEMPER0_STK_SIZE,
" `* p9 o4 y9 v$ U) E; y; m" I3 T - (void* )NULL,( L4 K8 r" I# K# c0 b# Z
- (UBaseType_t )TEMPER0_TASK_PRIO,0 F) `- m) `2 w
- (TaskHandle_t* )&TEMPER0Task_Handler); / S; D' d _3 h. S7 L i* u$ c
-
% q- F7 ], ?3 Z4 | L - xTaskCreate((TaskFunction_t )LCD_TO_task, 8 S6 i! `% p- n* P9 j* i0 {
- (const char* )"LCD_TO_task", $ \( F# G, }3 Y/ @5 T( D
- (uint16_t )LCD_TO_STK_SIZE, 6 E: |+ n! m$ C+ I/ {' T
- (void* )NULL,
$ n) z* p) m4 U - (UBaseType_t )LCD_TO_TASK_PRIO,) A1 s; n! ~) |0 b$ k' |: Q
- (TaskHandle_t* )&LCD_TOTask_Handler);
3 u( H' N R, u: j/ H5 ]' L# z -
2 X8 M' _, p- r, |% g" o - vTaskDelete(StartTask_Handler); //删除开始任务
3 U3 \- K# I2 b2 K- [" u* p - taskEXIT_CRITICAL(); //退出临界区2 g8 ~6 ~& F/ P- v* c! O% l
- }* K2 o* ^; `0 ]3 C9 T8 _3 r3 b
- 3 A" D, w1 F t4 c2 j3 Z+ u; @
% O; S$ O5 ]4 @. z- //LED0任务函数
3 ~( Q3 W. m1 ?; T. G$ ]1 i - void led0_task(void *pvParameters). r f6 A; e5 u$ t
- {% f3 ~9 K* K7 ~2 j: `# w, F
- while(1)
. O+ B1 C1 g% U1 f - {0 T- K- n2 G0 l# H+ \2 s
- LED0=~LED0;
3 q; ]0 z5 D" b. m9 I+ k' E: i - if(LED0==1)1 p1 h B D& l
- printf("灯灭\r\n");! u- f- f$ `$ S6 Z4 T& \) P: N
- else6 D2 W) W U5 C; t
- printf("灯亮\r\n");
k8 B4 |) ~5 V' F/ G$ J. S - vTaskDelay(1000);: B9 X) _. C$ H, f {
- }
$ P0 a+ B0 P9 q0 V, S) } y' }3 b2 g% k - } + @* b8 p' R: G; u" u1 Q) k
2 {, j" g* w3 F0 z1 ~
( Q6 M6 N& X0 Q! A- //usart0任务函数
# p+ v) U0 s$ w: O" x - void usart0_task(void *pvParameters)
! W O# c6 k3 U2 }2 Q - {: G+ O6 }9 v Q8 P: C( A
-
8 F! b* {2 x. o' K+ X - while(1)7 H) ~- R! u T- H% x7 H+ \- N
- { 5 G+ }2 B8 n# r p. y( D+ u% C
- printf("hello lee");
5 X9 J3 ^1 i2 |! l - printf("\r\n");
: q% q7 W' p( A, R# x5 {/ {# l - vTaskDelay(1000);" s7 [# H( c: Y0 y
- }2 i2 `4 P4 B6 ~. _" \
- }# [; n- ^3 I T# c
/ K* _2 ]2 m3 U- O3 ?2 I- //temper0任务函数(暂时为LED1翻转)
% A6 K# r! n4 a9 o; [) M - void temper0_task(void *pvParameters)$ j5 m4 S* ] c! E# n
- {
/ s! U/ o" Z& }0 k( B6 ? - ( V) l: ~ Z$ W a& { W) p
- while (1)+ A* c! R- e2 c% V2 F( f7 B
- {
7 R# ]6 r U) X/ V/ d- x* n - LED1=~LED1;
* t t! F( r$ [5 Z - vTaskDelay(1000);
2 T: j1 ?( d/ T% a9 E6 f/ N - }/ J8 y7 T, \* ]
- }
6 B* e1 R% i0 p
: [9 U% x, T) ]" U8 W1 F- void LCD_TO_task(void *pvParameters)! _( A2 c$ Y$ D' u7 O/ ~. T+ |
- {& k( X/ S! L- i6 f
- u8 lcd_id[12];2 J3 Y5 t8 Q) i! W$ k/ @8 q
- sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
9 y6 U, E) B7 j; v, m - while (1)
, \$ f, W; r: ]* z- k5 e! u+ L - {
8 K& U2 `0 C9 o$ r - LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^"); 8 l7 S3 W, S+ A# f% x3 w* j
- LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
- Q$ z% U( N9 ~' Z - LCD_ShowString(30,90,200,16,16,"DARKSTARS");
$ K1 L' z& D; b - LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID4 X6 d; d. @3 h, n5 P
- LCD_ShowString(30,130,200,12,12,"2020/12/4");2 P5 q* M$ g3 N: B% a
- vTaskDelay(1000); ) l! b3 @! Q# M4 C" W
- }2 N. G# Y, I% W" I
- }4 Z4 N, o, A" k! d. F
复制代码 & }: `5 U1 x: x' A* ]8 t- C; K
$ O3 r9 D1 {( Z4 Z* \0 r! c6 \5 j8 O$ Q4 D2 X$ k0 v, E% \+ k
~" P& H" ~6 v1 o
- W+ B) v9 @- t' J8 f7 m! G- s; l# s; P
6 H/ `6 M5 ~+ W% z7 r; o& h T9 f) m+ Q$ A8 ~0 W6 `1 ]
0 [; ?5 v; F: u# Y
; p# ?2 R* e% g# B# t总结& l% Y8 H. ^8 K; I+ u! a
通过这次系统的移植,我感受到系统的魅力,有了系统之后,许多程序就能并行运行了,这样我们就能完成更加高效,更加同步的信息处理和信息传输。对于高刷新率的信息处理,移植系统无疑是更好的选择。
( G! t4 o+ o, B5 g3 f" _9 H4 C2 b2 p8 R* n; c, s
/ b _1 F* c Y
9 a* `% X. X5 [
9 L( p* j; z, J; O1 t$ n |