一、源码处理; l0 d5 c% u* c5 F" \, E* |6 `0 I/ [. I% h
文件下载
/ W2 l w- s \" T) a8 e0 e1、官网下载源码
3 C& _7 ^; W( w2 P) u& u0 m, v$ I7 `/ s
& i( m3 s# G* }& l, X
* j$ w6 o/ {% ]/ L$ R' a" d
2、找到相关的例程# J" k8 ~ W& p& M* Y3 E. B
( `$ }! [1 Y! w; i, l& ]) Q
2 ?9 U! A5 s' Q% j8 a9 K3、进入源码文件- i* M3 k# ^. o& i' S, B
. B5 P) a7 k' L& t$ S! f
, k, Y& ~+ J+ d+ b0 m
/ C) ~- |5 f3 ^, @/ G- t% ?4、找到相关的文件
6 x1 ?, S9 h" \8 A: v; f. ^- l' I' P' Q3 x3 g: V
+ ` N+ d: A! ^: t
. E) |, P/ m5 J- J; T- j5 gkeil、RVDS为需要的文件,MemMang为需要的内存文件
: S/ b! C; u; z* c
* f% [9 C& C: g& f文件移植
# ?9 u4 c& i, Q U( T# m" ^1、在之前led灯程序基础上添加文件
" R4 d& }% E6 \+ d6 ]2 [注释:在正点原子开源工程里可以下载2 E/ ?$ X3 k# U' f# v
Y9 S4 V4 D4 h$ ^" E2 e1 \; c7 y, c+ X7 y
+ ?6 D3 O5 u. u" P$ B4 `
: K; T& p1 a7 @1 a# S2、将相关.h文件包含进去
7 j5 @5 x+ P! y( w5 }
& U: Z; W0 q# B: [$ H6 z. f
! ^! k! @! g, R V1 h D' `) V- N, | m
此时编译会报错
& B3 w5 z+ T t) T9 j继续包含所需要的文件0 k" U. d" T* R: N0 C
- a3 L/ E; l1 O% b, E
( i6 i+ r Q: k2 o; N) k
0 e S+ ?* ^: y4 Y( Y( U
文件地址:. h% {0 Z$ f3 [! _( N# o' [2 R
+ R8 u. ], \& C4 t) I
: Q" D& E: x" Y; j) @3 U! |
6 T$ B& D! R& C3、修改相关文件
T! b, u( |0 o% s. w! K7 \4 G, F2 X# Z7 g' ?7 t6 ^3 d
注释:正点原子给的工程例程是支持ucos的,所以我们需要把一些oc相关的删除掉 a# E1 w2 ?) P* d
以下是修改之后程序代码:! H4 P: o. _- t' K* N/ B$ I7 ?
sys.h
# {# g) a a; O9 a
5 }1 l9 U6 o+ D$ `- |
( \ n! v! ]4 ]: R
/ g2 z" C% g! ?5 Z; ~: zusart.c/ Z+ f \; B# I/ f2 K0 \
+ \" N9 W0 r/ X2 y. D
, n! ~! ?! k" w1 @# L9 {* | w* G' M$ d
原来是include.h,需要改成FreePTOS.h. V2 t9 w" [- N2 w5 U0 Q j0 `
5 z' N& |! e2 E/ ?
delay.c
& \; z; V7 E: k" J9 a. X3 f/ J4 \ L; i7 g) c6 v& j0 U; R
1:SysTIck_Handler()
* {5 F) Z9 [; c- n$ T2 |- extern void xPortSysTickHandler(void);
( J) n' C' U# I P6 z4 _ - 9 y, w* |/ n* Z* R
- //systick中断服务函数,使用ucos时用到# }5 f6 a8 c; m' W8 t
- void SysTick_Handler(void)9 @ n: V8 Y9 g# p o k; M8 R
- {
9 o+ Q- R5 b* G( I; z% ] - if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
. `: c O0 P& I8 i - {# y% H: N4 j( W8 Y$ y
- xPortSysTickHandler(); N6 X, ?. @1 q6 q
- }3 o, @' ` Y4 ]* A6 |: { E
- }
复制代码
* V: O, d0 H) Y/ X5 u2:delay_init8 d. j1 o) L+ D" I- ]+ h4 x) J/ @
* w* I! g& K" ?8 w7 B7 N/ d
- oid delay_init()" w+ [5 Q0 J5 o
- {) n( G6 U% a8 p) A# }
- u32 reload;( {; U* d- w8 ^/ Q
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK a1 T) U! m' `1 P1 Z! j# u! z
- fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用9 {2 n3 [" p4 Z. o# Y
- reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M
# j% p" B" Y% \# u - reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间
' @9 M2 R0 G$ [% A. ^+ r8 p - //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右
0 ~( J# c( C: M! g; P - fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位 5 U3 I6 S; U) m5 w: I
4 U: L1 C9 L0 I- |% f% {5 K; N! ?- SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
. |: c; ?: }* E. a/ o( i2 z - SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次 ) Z, c: g/ l$ T8 p& i
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK * d5 L5 }) H& |8 r/ c; C' f. v/ x
- }
复制代码
# E' K! t4 u* I3:两个延时函数
* a, A5 b% J( t6 B4 z7 L# H! T. I: h* {. Q2 H; R
- //延时nus
, @9 g' ^# L) t6 S0 W - //nus:要延时的us数. & v" G! W+ y% _# h: ?
- //nus:0~204522252(最大值即2^32/fac_us@fac_us=168) ) ?; H) z+ N& V
- void delay_us(u32 nus)
/ Y2 Z5 T, [8 ]1 d2 Q { - {
' ^7 k# p, g! x% s% P9 ]( d! s# k; ] - u32 ticks;+ t" w5 N0 o/ j/ p! y# E1 o
- u32 told,tnow,tcnt=0;' M4 x4 d* F$ i. t" G
- u32 reload=SysTick->LOAD; //LOAD的值
* j ?- K. t4 m& Z1 N; H7 | - ticks=nus*fac_us; //需要的节拍数 ' ?% `# v' \& K* K8 s" p1 ?7 y# m1 V
- told=SysTick->VAL; //刚进入时的计数器值
' a* j- t+ o* R" f6 l5 R" c8 ], { - while(1)
) t7 g1 O% \2 Q; U9 T2 C - {1 _' A2 B, B8 m. D! n9 ?8 ]% \# c/ Y
- tnow=SysTick->VAL; ! G* l2 _+ W0 a6 {0 W( x
- if(tnow!=told)
% r2 M7 E3 j/ j, u - {
j# Y# R, V) a4 y - if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了." F3 K$ g8 e" h. k3 ^; b* S
- else tcnt+=reload-tnow+told; ) ^; Z/ L2 F+ C! _6 Y
- told=tnow;2 e' Q- T; Z* p% \& k
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
' l! q6 G3 L6 x, {3 v& J* _ - }
) ], z* a& c( [- L6 n - }; / X/ S0 K, u, T
- } 6 y0 i) h4 Z! t& q6 G
- //延时nms
$ M a, L; b3 ? - //nms:要延时的ms数
/ p) `& R9 F3 R0 v R - //nms:0~65535
* L f2 c: U$ \$ Z - void delay_ms(u32 nms)
" |; n; }9 ]( a, ]$ d3 Z - { 6 s! E W( I3 L, s* a; a+ _$ o
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
* e; \' R$ O; t; z( Q8 O - {
n- o5 [4 ]) ^; H( O% @7 {" J( _6 q - if(nms>=fac_ms) //延时的时间大于OS的最少时间周期
: A/ d, z2 s, z' p0 g# F- E - {
j1 I% `% w l - vTaskDelay(nms/fac_ms); //FreeRTOS延时. e1 [# i J5 G- k1 n4 W) S) W7 w
- }+ x9 E4 O$ Y& M: N( h
- nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时
( t5 L' H6 E. i, h% u" T+ i - }2 Q/ B0 X" K+ ~ o( N
- delay_us((u32)(nms*1000)); //普通方式延时& i' D: d) P( I
- }
3 @! j3 W1 Z" P. h - ; m) h) z5 M5 M( A; e
- //延时nms,不会引起任务调度1 F N5 M! n) U% m Q: @
- //nms:要延时的ms数6 e/ Q8 S: u" h& |& P
- void delay_xms(u32 nms)7 [) F# J0 U: p, K2 J
- {5 D7 s* N9 ?) E5 r5 u5 C
- u32 i;. k% n' Q% U% d, a" x5 b# { \
- for(i=0;i<nms;i++) delay_us(1000);3 R' p# x5 p0 {% D( ^+ ^
- }
复制代码
8 f8 I7 s3 q' N% s+ `' q4、屏蔽中断
& L" p2 X ~$ O1 n% g- j+ j
/ r+ X q* R% ~3 f: ?+ i
B4 |1 }8 Q8 s! Y0 I' b3 U5 x6 H0 ^( G4 a4 h
5、最后编译一下,就创建成功啦!!!. O+ q- E( q4 e' F
1 Q4 b5 F' t0 ~1 i. R- C: Y9 d
创建任务并执行任务
2 l' o _% R" _创建任务分以下步骤:
8 y3 f4 p" I v. }- 设置任务优先级, r* E$ o. z. ?( c
- 设置任务堆栈大小! A4 X7 t, w+ _$ i3 Q9 q
- 设置任务句柄
4 ~/ O w: Z* `- |0 G4 G - 设置任务函数
复制代码 我创建了一个任务,使得两个灯同时闪烁,以及串口输出Halloword,以及在移植OLED屏幕的程序7 U ~ m( `8 @2 U, M, F! n
* p9 O* `+ r% m0 a7 sOLED程序移植相对简单,只需要把相关文件夹进去就行 c0 k) x0 {9 Q h9 f2 m. Q4 `
这是移植所需要的的一些相关文件:: D7 S. S% z0 L$ S" L) b3 O$ j
) W' H* c% |) j% |% l7 S
, [8 _# P+ P0 \% w6 v" s Q/ E其中NRF24L01.c是无线通信模块的,我还在肝中,有需要请私信我。
/ K8 e1 z, M2 g" s; k$ Z# c主函数:+ f. z% P( f O0 |# ]
% \& a5 s7 D, j# i; ?0 [: \; \2 q- #include "sys.h"# M1 @6 C6 ^2 c+ B: U" L
- #include "delay.h"7 m' J! \+ u8 }9 g2 y4 B
- #include "usart.h"
- e$ y( r1 t. z- b( ^ - #include "led.h"
& p3 y! K+ Y. \' c - #include "FreeRTOS.h") n p- ]# C2 v4 x& O( L& `& [
- #include "task.h": e& X2 r& }8 U! Y
- #include "lcd.h"' h0 Q" ^, ]- Y0 P9 ~1 @# E
- " A! j+ K3 e; F' k$ y
- //任务优先级
9 H u6 P1 N$ f1 t1 n - #define START_TASK_PRIO 1
, J) r, [. I# t0 B+ x( A - //任务堆栈大小
t/ J( k- @% d1 Q* ]+ K$ } - #define START_STK_SIZE 128
2 g' M7 U& Z, m' Y: o m' r - //任务句柄. \) m. R5 X9 z, G7 S* ]8 i5 U4 d
- TaskHandle_t StartTask_Handler;
& U7 A. y' @2 e! Y0 T9 O - //任务函数
' ?1 y) s& }, M/ Y1 K - void start_task(void *pvParameters);
8 C. K: D( Q* [, u. }& u
4 a- ?$ l8 o9 y8 a- $ t# q: x: C& W) L$ O. F# K+ j
- //任务优先级1 t s& ]: R9 s! K5 d
- #define LED0_TASK_PRIO 27 F0 r0 y; {9 _7 z
- //任务堆栈大小 $ `( Y( D& |3 m4 M- y7 I5 J( |# V
- #define LED0_STK_SIZE 50
% F! n$ N: a5 ^6 y& g - //任务句柄
* T, g5 @/ f6 ^$ t- z- w - TaskHandle_t LED0Task_Handler;. i+ ~, p: T4 M
- //任务函数- O) P4 f7 [6 k; w* Q: P' {5 k
- void led0_task(void *pvParameters);- C* q! w/ _4 W5 N) L# D3 l& ]
- % V' y( N5 I1 Y, K% X
- //任务优先级
" g+ n$ U2 J5 O. Z - #define USART0_TASK_PRIO 33 f! H8 k- Z1 M
- //任务堆栈大小 + }' F7 f2 h0 G/ P0 @" [) e. f f
- #define USART0_STK_SIZE 50
. ]% U% z: d8 }3 F7 j - //任务句柄7 h4 n, `2 ^- p! f, |' q. Q2 |
- TaskHandle_t USART0Task_Handler;$ h( j/ D& A) I5 u! R$ D
- //任务函数
% P/ s/ U4 i7 k% M5 j @( a - void usart0_task(void *pvParameters);
) K7 w, p5 l# c7 J: Y - . ]" ?; }, s# s/ O! J
- 3 h& J' S# u' u
- //任务优先级
6 Y5 x$ P+ h( P( Z2 T$ e- Z2 K - #define TEMPER0_TASK_PRIO 4
2 d3 @4 B+ S" z - //任务堆栈大小
5 ]9 b6 W6 r- I r0 N+ u - #define TEMPER0_STK_SIZE 50 9 v8 Z2 ^( {% L
- TaskHandle_t TEMPER0Task_Handler;
- V/ J. H) [" N6 ~5 ? - //任务函数
. ^# i u& m! R% [/ X' e/ V! @ - void TEMPER0_task(void *pvParameters);' e' u4 _$ a. ]& U1 Y
- 0 y& g; I3 g* f+ G
) B8 o' d& T2 A4 W! u- //任务优先级3 d, j: S7 w3 G. B/ w6 Y6 a
- #define LCD_TO_TASK_PRIO 56 T7 H6 |3 T% ^2 ^2 y+ p% K7 Y8 q
- //任务堆栈大小
4 `# ]3 Z% P7 I - #define LCD_TO_STK_SIZE 50
1 x+ M0 \7 J( @1 l; Q - //任务句柄
# c! _9 x$ A" p - TaskHandle_t LCD_TOTask_Handler;
, v) q. p [- _0 I6 J - //任务函数" q1 z7 J) Z g/ k% t. S
8 N6 k% h Y t' c- void LCD_TO_task(void *pvParameters);9 A3 W+ m( E. t* H& T
- //任务句柄
! D+ r5 W$ o t7 J V
" o& J! K$ U" ~. d- TaskHandle_t TEMPER0Task_Handler;
0 Z3 o. s2 s+ ~5 b! x - //任务函数5 k; Q H* m' [1 k8 }$ r
F3 K# G1 {* T p9 Q- void temper0_task(void *pvParameters);3 G6 k, u& U, V" E& w
- int main(void)$ }% _ |. L5 z# k
- {
7 e- j& T& L( P2 ~9 ]: L# i - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
7 y9 S1 u, V6 P% U+ i- M - delay_init(); //延时函数初始化
6 u: d2 q5 Z7 A) l7 d4 `# v# a( |# T - uart_init(115200); //初始化串口* e" x: G6 J2 y! E8 c9 k! v
- LED_Init();
9 Y" a; l9 w& D - //初始化LED
- R: U' W9 O" u t" m9 ` - LCD_Init();4 |3 \9 m( D( g
- POINT_COLOR=RED;9 Z" R/ m) [2 u; }2 Y. ~4 n
- //初始化LCD* O1 M0 `! x4 X) |% L* S6 S3 ~
-
0 {/ I6 ?% W3 u: @8 l, ?0 p - //创建开始任务( g' n* x& I- a u0 }) [
- xTaskCreate((TaskFunction_t )start_task, //任务函数
0 L. O$ R7 `$ [+ M - (const char* )"start_task", //任务名称
) l' y5 g$ V, u1 ~2 G A3 A - (uint16_t )START_STK_SIZE, //任务堆栈大小# B% Z9 @+ ]; ]3 u+ R) X- ^
- (void* )NULL, //传递给任务函数的参数
5 E! x( x4 T: O; I% H - (UBaseType_t )START_TASK_PRIO, //任务优先级
) \3 j: t; N" z - (TaskHandle_t* )&StartTask_Handler); //任务句柄
8 z6 M: ~; H1 i( h - vTaskStartScheduler(); //开启任务调度* ]; E* ~& C$ Z+ p& }
- }
( i7 u7 j9 b' H P
+ _7 B% u+ P9 |7 u8 r- //开始任务任务函数
. v: X" Y1 e. h! Y4 i' @4 k - void start_task(void *pvParameters)/ R$ k; t; Z6 \: g( t( D
- {
9 m& @" }" g3 s8 @0 `& [ - taskENTER_CRITICAL(); //进入临界区
5 E6 m# q& p. [. @/ D7 | - //创建LED0任务
- `, v! j! S+ L1 L# p3 T+ Z" ? - xTaskCreate((TaskFunction_t )led0_task, 8 Y8 [4 ~* q" @
- (const char* )"led0_task",
2 ^7 @' E) W7 G$ t - (uint16_t )LED0_STK_SIZE, 9 z9 l+ S: F, z
- (void* )NULL, + _# C5 r' X3 r6 h
- (UBaseType_t )LED0_TASK_PRIO, 3 C$ {& a$ W2 r& G& f0 M
- (TaskHandle_t* )&LED0Task_Handler);
X1 B+ Q; d9 {7 @, F$ h - //创建usart0任务
( x+ t' @- ^- ]+ c - xTaskCreate((TaskFunction_t )usart0_task,
- L: Q- Z2 Y, r" c6 [2 {5 ] - (const char* )"usart0_task",
/ X, T2 O) @. F4 t - (uint16_t )USART0_STK_SIZE, , a u7 ` T# s7 s; u. {; y# r
- (void* )NULL,
( ?+ x4 M1 Z2 ?" n2 N2 R$ w+ Q - (UBaseType_t )USART0_TASK_PRIO,& m+ A4 q2 s& Y o
- (TaskHandle_t* )&USART0Task_Handler);
i1 _2 G- t3 ~* E; V3 } - //创建temper0任务. R% A* s- ^: x6 e* Q4 T+ v# p
- xTaskCreate((TaskFunction_t )temper0_task,
! U- r) o2 d! n5 f0 ], Q1 p - (const char* )"temper_task", - l& ?' ?9 C. U( E# P6 s# r
- (uint16_t )TEMPER0_STK_SIZE, ; Y' O8 M; Q1 d, L' X$ _& D
- (void* )NULL,
- p P9 {$ a- u. l7 h! K( N - (UBaseType_t )TEMPER0_TASK_PRIO,
8 A) X) d0 K6 E5 l - (TaskHandle_t* )&TEMPER0Task_Handler);
" P- j2 N% G( y) q& g% P* S* u - & ~3 P- u( u, b( c
- xTaskCreate((TaskFunction_t )LCD_TO_task, $ v8 i- l2 `7 n
- (const char* )"LCD_TO_task", 7 c' G- E( L1 o& G# R/ w) |
- (uint16_t )LCD_TO_STK_SIZE,
: a7 q8 J7 i4 J& e; x! }% C8 s - (void* )NULL,5 b" t; T, V8 j' i! v
- (UBaseType_t )LCD_TO_TASK_PRIO,* F( b9 B. p/ L3 z" b
- (TaskHandle_t* )&LCD_TOTask_Handler);) f' Q O! `( n, t7 u! ?
-
+ W( B5 m* n& [9 y; g - vTaskDelete(StartTask_Handler); //删除开始任务/ @( X4 _& j4 I$ C- ^
- taskEXIT_CRITICAL(); //退出临界区" j; E$ p4 E- C
- }
& Y& c) O4 `7 M$ p' B0 N& y - # h9 c( h& Z0 {, F6 R+ H, w. z& I$ z
8 d: N+ k% |* M r: z0 W! P# g- //LED0任务函数 # e! X5 S* e+ T5 E
- void led0_task(void *pvParameters)& ^6 o- m Q% ]2 ?
- {* X; B5 P& F. E6 p
- while(1)- }, H) Z7 d6 D) v @" \' [, v
- {
9 N9 i6 s" v" U - LED0=~LED0;
7 q" g1 `. V# }/ |! {& m) T: o# H - if(LED0==1)
- j) r$ u+ A% D5 w - printf("灯灭\r\n");
! m, O& `' `, y5 h! I% o, g% L - else N4 w+ a9 W. f, C
- printf("灯亮\r\n");
% G$ a- O' R% ^0 S - vTaskDelay(1000);7 r. W$ j1 Z8 I) J5 T6 ~0 A4 S
- }* i$ e6 }7 F. v7 D; P7 t$ [
- } 9 _4 M$ q3 l" l0 ^5 O
: v; C0 u$ d8 i* B0 T- " Y, F. t* ~8 A( ]; l. {2 D
- //usart0任务函数
' r8 \% F" [) p: u& \- N - void usart0_task(void *pvParameters)+ r+ t1 d; A5 A- A" b0 Q
- {2 z6 R9 O$ l" F
-
1 L9 ~6 Z; u* F - while(1)
' G1 f" D4 C, Z7 [) S: H& j - { 1 N1 k% C4 ~# P+ G
- printf("hello lee");
$ |6 T2 f. ^9 X - printf("\r\n");
* Q& ?' b+ \$ o: g - vTaskDelay(1000);: q6 l4 b& p2 `9 f
- }
* z9 E1 j! c6 l1 n* l) K - }0 |9 i. Q. Q. E& c& O
- . ~+ k& z0 j* r |: M& v
- //temper0任务函数(暂时为LED1翻转)4 V+ D/ \ B3 @( L, E A4 C! v' r/ V
- void temper0_task(void *pvParameters)
7 [7 A3 G8 _/ p: i. |4 K - {
3 }5 P- b; m8 Z" a: ` S1 t - 9 h0 p* Z4 i$ Y/ Z* f* j
- while (1); `( O0 ~+ \5 f: V6 m
- {
5 ~- } P# \6 K' z2 l2 V - LED1=~LED1;+ a" D, m' J! E6 `
- vTaskDelay(1000); " {) {% g* p e6 w) S
- }
L3 g* t2 J6 m8 h m9 d8 J1 P7 W - }
/ a# f. ~& j% N& d/ D W- D- ^ - 9 X2 s/ c( q- {+ w5 O1 q
- void LCD_TO_task(void *pvParameters)
$ }# V/ ]3 j% |; F+ T - {9 x- g+ z9 B1 H* @: Q
- u8 lcd_id[12];2 d" T) ?/ f1 J. L8 q8 ~
- sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id); 3 r; {# F1 V% N) a- R' X+ M4 _2 W
- while (1)
8 A# v( F3 L/ Y$ F - {
: a! `5 u3 W1 O4 E# w - LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^");
+ q9 m8 z; j1 r* W p - LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");5 F0 J! g3 }! w5 y$ l* ^% p/ h9 K
- LCD_ShowString(30,90,200,16,16,"DARKSTARS");
+ a8 v. i5 h* r h" w% ?3 X - LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID( {& O( Q) U4 p
- LCD_ShowString(30,130,200,12,12,"2020/12/4");
7 Y# e' u2 T# ? - vTaskDelay(1000);
$ V2 x. [( X; t8 I4 v - }
; A+ d2 B' p9 Q# B2 z# T - }
% e# z* B& X, [6 d: v
复制代码 9 n c2 I$ D7 P0 G
0 n' W. U- r9 v7 N3 q
/ O2 Z6 Z+ D5 V. ]3 F% u8 ~1 x1 k3 R$ h$ L" Q4 f% `
& k' v$ t& b$ v: E& U6 J
2 b! x/ F2 H1 N& D
6 e& a( a, h+ a8 A9 }, K# y4 a; J8 j( H; k3 R1 a
3 K# B( X7 v: ~* N6 w7 m
8 A/ e3 M* K/ t0 ?& B; j总结* x+ Y' e% H: p. C: R( P( x
通过这次系统的移植,我感受到系统的魅力,有了系统之后,许多程序就能并行运行了,这样我们就能完成更加高效,更加同步的信息处理和信息传输。对于高刷新率的信息处理,移植系统无疑是更好的选择。9 X' Q7 m6 I! M& \! v- Z' o
) c5 k p+ o9 t' ]* r, R. v4 h9 d6 g2 Y
0 i! U" t5 k7 b. W+ |7 B6 u z/ l
9 a0 I' }9 o2 k2 k& s. {# u( I X! I7 ~5 a( J- g" B m+ j
|