一、源码处理/ y& V' a+ d0 X
文件下载* c% l+ ]' A7 u' A! F6 T
1、官网下载源码/ d' n# u C& Z) ^* g! T
, w# m6 C l# t
2 C% ~! K+ r$ Q
% J5 Q, ?0 C! w$ G9 y& [
2、找到相关的例程
) v% q7 r. L- m# K5 L. i1 a4 E7 n; {
% _) o6 Q' X/ U4 k+ T3、进入源码文件3 |" y! N2 a) Z0 L5 N1 e% X
+ `8 M$ G4 w2 A; t: o! S5 e! C l( W
4 C/ a/ E0 B( E1 F
4、找到相关的文件
9 w3 i+ b' V/ P3 h2 j7 R5 G8 I/ a+ r
5 N2 s @* D/ g: Q* {7 F
1 z/ ]$ {: e- J" a Mkeil、RVDS为需要的文件,MemMang为需要的内存文件9 P) w G9 ]6 k' z
( O$ i* l' a4 v( I* j! w! i
文件移植5 ~8 I+ \1 v" N8 f3 X& y
1、在之前led灯程序基础上添加文件
4 N K2 @" T8 j" z; Y% v: m注释:在正点原子开源工程里可以下载
7 m7 a; [- {! y" w
$ e* C' O: ~! {6 o8 O4 S" E/ S6 O& M
; e3 J" {: g7 i$ j% \, F) X/ i- V' N1 N) r( _2 g
2、将相关.h文件包含进去7 ^$ z+ r9 ^( H8 i# {7 A' i* H
5 k; B# W/ {" Q/ M$ K! U; N
2 n* H9 V: i% n5 D
$ e6 b9 Q; ?1 ]- k此时编译会报错
# d% R+ P. a7 ]2 R8 y2 l4 G! j继续包含所需要的文件
5 ^$ T) L6 Z& S- i9 v! S% n5 J0 X4 [5 f0 \# B# j# \# O5 v& s* r
) p8 ^ P$ ]1 o2 F0 U8 i
( o5 I, O7 o/ D/ w& P2 K; F6 _. s9 f文件地址:
) Z- f9 J3 c) A' K( L; o, j) m) u# K. }- y. `( A# c
9 L7 N# H! Z% ^& W. o! E7 y+ p6 X7 T* U) l# _
3、修改相关文件7 R) A! m; _( \. i7 s7 o
' |% M0 D3 K/ u' `+ ~5 a, k注释:正点原子给的工程例程是支持ucos的,所以我们需要把一些oc相关的删除掉- Z) J, F7 e7 B. ~1 q+ J
以下是修改之后程序代码:
2 O% M: p0 ]) rsys.h
+ v U7 @; h& f B* V$ A( F- `4 l# v- \+ f' T" n: l8 j6 f5 G8 B
, q8 d4 B- P0 ^' L
0 ]% {1 H( z0 v1 ~) j8 r' R
usart.c
# J' V, y$ N; y, ]$ L3 h& D6 o* t5 ?# p( z( E z( @0 `
# Y3 P2 _; J3 t
7 ?4 d% L( u+ m) x/ _: h) U7 }原来是include.h,需要改成FreePTOS.h% P9 x3 O7 M& X6 _
, ^* u% X$ S0 e2 j
delay.c
" O3 I$ v2 s( Z2 l' |3 A, f" _; U& R1 B. J- G
1:SysTIck_Handler()
; h, ]: P' `4 f9 M8 `8 a9 U- extern void xPortSysTickHandler(void);' Y6 g p7 t6 T
- 9 e7 t3 J4 O& u$ u e+ v, S% V. @
- //systick中断服务函数,使用ucos时用到( c/ d8 w# s# i. p; }: k
- void SysTick_Handler(void)2 ~ c0 C' b7 N* A& U/ ^
- { 6 c. q/ t$ n; [5 @
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
' }, p2 \5 M2 c9 q" O9 J - {( Z! |" u' d& Y- E
- xPortSysTickHandler(); 8 D! O: C5 l0 v! H9 o( p
- }& B9 r V b- t/ T
- }
复制代码 . b& h, J) I; c9 O4 N# W: t# [
2:delay_init# G" d/ Q7 P8 e4 R! H
' l6 i1 z( N! I0 e- oid delay_init(), v3 C3 ~9 S" [
- {* B) A3 D& P! M% L
- u32 reload;7 D7 G2 v: U) Z/ }5 M$ |
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK5 D9 T1 c( T2 @+ s! {( S
- fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用8 ^ f0 C$ T' q- g2 H% @; i5 w
- reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M
2 b( C: o* k; V4 X+ N8 O$ l( e - reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间
' o F+ H" L1 a k4 g - //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右 * _# C8 n" \) b4 ?! [, `
- fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位 - X. s% o# f6 Z* Y* u
- ! r0 b7 C; f+ `8 |0 b6 d' V' u
- SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
; v6 N( c$ N" e; m2 v2 H: G# W0 ? - SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次 6 e# t1 P& _& D2 L
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK R# T1 }& `' B- M, F
- }
复制代码 ' E' h9 L3 g% q F. {+ H# [2 p% ]
3:两个延时函数
* x# v& C) | S3 a
' E) X0 n8 q- H! O; K. n' v- //延时nus( h- [0 ]3 n9 h6 k9 d X7 J7 X
- //nus:要延时的us数. 5 f: z j4 Y% p$ J+ L6 K, z0 H" s0 i
- //nus:0~204522252(最大值即2^32/fac_us@fac_us=168)
1 S5 K4 {$ G' { - void delay_us(u32 nus)
4 h0 A8 g% y0 C - { 4 s p' [# `' }" x. {
- u32 ticks;% \3 ^% [6 _, [
- u32 told,tnow,tcnt=0;
8 M5 d& X: g0 t" J$ K - u32 reload=SysTick->LOAD; //LOAD的值 * W1 u- S5 S6 _1 U) @
- ticks=nus*fac_us; //需要的节拍数
+ ^+ i6 R* ]( ]- Z - told=SysTick->VAL; //刚进入时的计数器值) j3 Q, R" k+ |9 x, [2 `
- while(1)
$ ?& c1 i: s$ ?# a2 E6 s, d% ? - {
1 r- q1 o2 k( b4 F, Z; U8 \0 A; d! h7 B - tnow=SysTick->VAL; 7 G% a+ y0 R7 V4 D' S
- if(tnow!=told)
$ I F* e9 U. O; @; _# u - {
! w8 ?! L5 `6 ?9 Z9 Z/ ? - if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.& `2 ]- o; b* B) H* f: N( Y
- else tcnt+=reload-tnow+told; $ Q2 ^2 @6 ]8 E
- told=tnow; O4 S3 z+ f" p) F
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
$ A" \' z( ^+ S1 F7 @6 S; H - } - d: {& e9 X) m5 i6 h) E. I
- };
( u( h6 B& b2 M6 `0 F) ` - }
8 @5 u6 f% T$ j, l' X - //延时nms' W' @. u% }/ U& B8 p
- //nms:要延时的ms数
) a8 W( | l5 a5 I% q) k& x, J - //nms:0~65535
$ y9 @) s& Z b$ S6 H8 o& h - void delay_ms(u32 nms)
+ o2 Z3 D$ B2 j( M3 Q5 n - { 3 x9 E0 h8 v. u6 s
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行4 J5 \3 E: C e) b/ ]- `& R, g3 P1 ^
- { 7 B. B" `0 B# e
- if(nms>=fac_ms) //延时的时间大于OS的最少时间周期 ! @9 b, k" B: \+ W2 W- P$ U4 v& H
- { ) g' Q7 H" O9 S0 g; l8 x) i
- vTaskDelay(nms/fac_ms); //FreeRTOS延时
1 E, b& U1 d: J( g' u - }$ I0 s/ }% I2 g& U! J
- nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时 1 ^ p& d9 i9 a+ c
- }7 |3 w6 ?' p+ [ Z/ D" y q h8 h
- delay_us((u32)(nms*1000)); //普通方式延时8 C" r5 }% Y* T
- }4 a- D" ^5 C4 E* p5 C4 l! z- n; h% C
- # M7 I( w0 O# p8 J* a0 l# k6 t
- //延时nms,不会引起任务调度) T- I/ y) B& L5 v) W6 M& _
- //nms:要延时的ms数+ ~: a3 W7 ^5 [( }1 J4 |
- void delay_xms(u32 nms)
@8 R/ S# w) Z; p - {
) F: N+ [5 R+ N3 l9 N - u32 i;
- R+ E b7 \ H8 D- ` - for(i=0;i<nms;i++) delay_us(1000);
7 Q& Y8 S9 k# n( o( \ - }
复制代码
P# Z8 O( P \% T' c0 o; n4、屏蔽中断
: @& B( @1 c# w( N6 `* W( S: N4 G" G! [! t- [$ K; ~5 n
2 M$ @6 j6 _& F0 W& }
/ |) { S" a, L) _5、最后编译一下,就创建成功啦!!!
5 o" v# W: }+ V! D
# `7 S" L! @' i1 r7 V; i. l创建任务并执行任务! `+ S3 T( N0 s$ a/ N
创建任务分以下步骤:
1 ^5 l+ p% p5 B7 |8 x& A- 设置任务优先级; t) b' R' `, k" A* ]
- 设置任务堆栈大小0 u2 q* Z. Q- s
- 设置任务句柄
; r; q9 }4 f, e" c, `! Y; Q7 E - 设置任务函数
复制代码 我创建了一个任务,使得两个灯同时闪烁,以及串口输出Halloword,以及在移植OLED屏幕的程序
1 l: S: ~: @( T: ?* m0 Q6 `# x% O: K7 B' Y* \! s
OLED程序移植相对简单,只需要把相关文件夹进去就行 D t8 P5 O/ D! \8 |) [: V
这是移植所需要的的一些相关文件:
$ [$ o. j( R' j1 F! \
! w' O% E) U# N) f
' y/ _" w8 O7 {其中NRF24L01.c是无线通信模块的,我还在肝中,有需要请私信我。0 R. v W* E2 g3 @! }8 @1 s
主函数:
5 y0 Z4 D! f5 Q8 {% X! }' ~; b$ D5 J9 o3 q( c
- #include "sys.h"
* k7 n( K% @/ [: a - #include "delay.h", f( D. v6 S! C5 B
- #include "usart.h" `5 U2 t* C: _4 j8 I' ?# x
- #include "led.h"
d4 @4 Z1 t" ? - #include "FreeRTOS.h"! F0 l* p2 X' Y. c, t
- #include "task.h"1 x! w: e! Z3 ~& c" m1 \
- #include "lcd.h"
* O g+ W! R h0 j2 ]. X - $ Q7 ?5 d. k% d+ e) J3 w
- //任务优先级
- t+ x/ E7 u$ s8 }& F& i - #define START_TASK_PRIO 1
2 W; t7 o6 g* T2 H" V2 a7 R - //任务堆栈大小 f8 U, t7 j; O" j
- #define START_STK_SIZE 128
$ l: H. P( {! g' |" {1 g - //任务句柄
# G7 u. Z$ O) G4 h5 p$ b1 [5 ]( M - TaskHandle_t StartTask_Handler;. m: g% B" e' F% J
- //任务函数
4 k" d- E9 z5 F - void start_task(void *pvParameters);' o8 _) F/ p& H( e/ A& u9 J
- ) b: t. y$ ]; T) b8 o
- : a t u; F; _0 T) B, f1 q
- //任务优先级
( B2 H2 @8 Y' `/ Z- i e - #define LED0_TASK_PRIO 2
% s/ a% J$ V. q' E4 z0 |& J/ s - //任务堆栈大小 # p' f9 [3 J0 [; `1 o
- #define LED0_STK_SIZE 50
; y# F( A6 s/ O, c- `( I - //任务句柄/ `2 {5 o; H s6 g5 W% E
- TaskHandle_t LED0Task_Handler;
; R; C1 S/ @- x' f - //任务函数
; B# p' A6 i) Z1 |& p - void led0_task(void *pvParameters);
' E: [% S$ t6 |) a - ) W" s: y7 n0 E8 _6 a8 U! T# h9 i
- //任务优先级. ~3 E4 g, Y1 l4 T+ i
- #define USART0_TASK_PRIO 3
0 a, p8 {( } F7 L: [ - //任务堆栈大小 0 \7 ]* {& {/ I( D( c* g1 m
- #define USART0_STK_SIZE 50
+ h6 Q2 \# o* I) j( N+ P - //任务句柄
, C/ p: @0 J+ o - TaskHandle_t USART0Task_Handler;, E; b; \ D+ Q; s; P! L# ~/ G( B
- //任务函数, y @: N: s4 C r+ h
- void usart0_task(void *pvParameters);
" b S0 d7 r& _, ]5 ~/ }
' S1 T: ^: C, A* T2 C4 \- $ E) O- j" \! v4 e
- //任务优先级! z5 b0 j, o6 r; J: N
- #define TEMPER0_TASK_PRIO 4
1 j- }2 N# x w/ l - //任务堆栈大小
( ?2 h) F: J2 C: U - #define TEMPER0_STK_SIZE 50 / p, s/ N+ ]* ?+ c0 |/ L
- TaskHandle_t TEMPER0Task_Handler;
- q! J- o4 C6 w# `% ? - //任务函数
6 p2 w3 i% }8 H# @ - void TEMPER0_task(void *pvParameters);* m5 i4 T4 y7 _' p) O' _ D
) ?2 S+ [0 y7 t
$ v# s# b" ? x4 V6 R6 X3 {6 B- //任务优先级- J: T5 u; Z! }0 `$ S7 J3 I- T9 h$ e
- #define LCD_TO_TASK_PRIO 5: q+ k2 C. \- i; a d& Z' x0 S
- //任务堆栈大小
0 R& n K, a$ j! D; L" L) n" ~ C - #define LCD_TO_STK_SIZE 50 ( G/ D3 _8 A" P
- //任务句柄
$ W" j9 S1 G; u$ l - TaskHandle_t LCD_TOTask_Handler;
$ j3 G0 H; B2 [4 A0 _* _6 O5 q - //任务函数* z7 t( R/ K% ~5 b$ [1 B1 _* m
- ' B1 l1 i1 G" V ^" _
- void LCD_TO_task(void *pvParameters);
5 S' ~+ P4 N5 L# B/ W8 j6 y M; o( M9 y - //任务句柄! d) r) A; W; w# ^+ o3 Q/ [9 |
- & ?% N& M0 q4 E/ J& ~4 H o
- TaskHandle_t TEMPER0Task_Handler;
7 S; f+ r% t+ b7 i( C* l - //任务函数+ Z$ y& U% N$ _3 } O/ r% Y9 [
- - {/ @+ a8 w1 L2 s) c
- void temper0_task(void *pvParameters);: o1 @. N9 R% u3 @0 c
- int main(void)
: e' D# w0 G- x' [/ q- { - {
" |' V: d8 C+ d7 Y8 i' D: K - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
+ m8 ?: M- [: g$ L* l+ @0 i - delay_init(); //延时函数初始化
8 T" |( a0 w/ S6 Y5 }5 ^) F; k. d - uart_init(115200); //初始化串口+ g6 Q, d& P, P. n9 }/ m$ U
- LED_Init();& r0 t; `: l6 `8 L q3 i
- //初始化LED
1 {/ Q2 Z* ^+ S/ m - LCD_Init();
. U: e5 K( N v$ G9 q; d6 c3 a' ~& m - POINT_COLOR=RED;* M, h! c L& c$ h1 E
- //初始化LCD
/ k v5 A; a8 ~6 p - 8 t+ \3 n6 ^ b- V' F5 f0 E) `; O
- //创建开始任务% C. { a. Q: W8 }
- xTaskCreate((TaskFunction_t )start_task, //任务函数
! c9 @4 q& `) U1 Q8 ]4 M - (const char* )"start_task", //任务名称 w+ `8 ], m, @* J6 {- B/ \
- (uint16_t )START_STK_SIZE, //任务堆栈大小
# F: D/ D- I4 Y$ }% F - (void* )NULL, //传递给任务函数的参数
4 G4 A8 I4 m0 f+ ]) s - (UBaseType_t )START_TASK_PRIO, //任务优先级/ l9 ^, b1 E+ \" p: |7 P+ l' ~( W8 H
- (TaskHandle_t* )&StartTask_Handler); //任务句柄 ; w2 E7 J, g; ^% b6 p6 O5 |4 g
- vTaskStartScheduler(); //开启任务调度6 m8 f& [* H+ o! Q! @
- }
0 ]( i4 g Q. X- U - / ?8 a/ r$ M! N3 _+ [, }7 x
- //开始任务任务函数
. c8 s$ j# b, a4 H - void start_task(void *pvParameters)3 d Q; c# C& Y( F& p
- {" o) I! M( w. W8 G: {# Q
- taskENTER_CRITICAL(); //进入临界区6 \3 ~/ U I$ J; [4 D0 D2 S8 ^' h
- //创建LED0任务
- ~! C: Q, v1 P# ^. ^ - xTaskCreate((TaskFunction_t )led0_task, 9 b$ k* }9 e4 o! z2 a' t
- (const char* )"led0_task", 4 T, s, u0 \& g6 Y: p0 v" G. ^( [( [
- (uint16_t )LED0_STK_SIZE,
, s$ m2 w6 x6 e - (void* )NULL,
: M% G0 f5 `1 k( O# d$ Z - (UBaseType_t )LED0_TASK_PRIO,
& S3 r' |7 a/ @* ~; M - (TaskHandle_t* )&LED0Task_Handler);
I2 x0 N* P }/ M - //创建usart0任务
$ ^- e. n7 j+ l; J3 ` - xTaskCreate((TaskFunction_t )usart0_task, ! D- a2 ]3 `4 `& c$ d6 m" U+ S
- (const char* )"usart0_task", 9 q# H, a0 ?$ X% l% O( y" K
- (uint16_t )USART0_STK_SIZE,
1 ^( ^9 P* E# z' i9 @/ x# B - (void* )NULL,
2 E; Q9 ]4 \ z, _# F - (UBaseType_t )USART0_TASK_PRIO,
8 K" F6 u `: G* b: |% y0 o. i. m - (TaskHandle_t* )&USART0Task_Handler);5 I9 b3 @/ W `0 i; X& _
- //创建temper0任务
L- A. [1 M3 \/ @# ? T - xTaskCreate((TaskFunction_t )temper0_task,
9 \- L1 Q H: |) y8 j; u - (const char* )"temper_task", * Z5 x1 \7 C# U" _" M
- (uint16_t )TEMPER0_STK_SIZE,
) c4 ]7 p- h" {; G7 x - (void* )NULL,
Q5 ^! @( }- w& } - (UBaseType_t )TEMPER0_TASK_PRIO,
0 G" V9 A+ r4 r! D - (TaskHandle_t* )&TEMPER0Task_Handler);
2 Q) K2 Y: S& ?) D9 r, x. H/ Y -
. B. n& E/ C5 @3 w% D4 n. W - xTaskCreate((TaskFunction_t )LCD_TO_task, E# Q: G8 S; k
- (const char* )"LCD_TO_task",
; D0 d! v% e5 ~& S _ - (uint16_t )LCD_TO_STK_SIZE, 8 n( k* X/ C8 u" \2 M1 ~
- (void* )NULL,: `. R9 W3 ^" R/ R
- (UBaseType_t )LCD_TO_TASK_PRIO,; y* p9 }$ _, j1 o; T4 ]2 q
- (TaskHandle_t* )&LCD_TOTask_Handler);
+ S7 ^: ^. l* F -
: M) [: T+ j+ Q& o - vTaskDelete(StartTask_Handler); //删除开始任务: N/ f6 e! |7 g/ _% X+ ~6 R
- taskEXIT_CRITICAL(); //退出临界区
( M+ |3 Y7 d7 F8 r8 @9 z+ f! r - }
# l2 [/ T' ~+ J2 s/ ^6 ?
% e4 X3 u% i& j, h4 W$ s
% @" [+ A: e' i0 w- //LED0任务函数 0 l A( z. U- n! d3 \$ y( V
- void led0_task(void *pvParameters)
, m1 V2 a1 H! [; h. _9 o z - {0 ?& B. S7 m1 F$ E
- while(1). f1 M5 y% k: q+ ^3 A6 ]
- {
( c- O3 v" n* U6 P - LED0=~LED0;
/ r6 ?' S/ O, f: I# o - if(LED0==1)' n- n- U# L k* Y( {
- printf("灯灭\r\n");2 A( `; l1 |; T) G" Y% a, P9 v
- else
9 g0 ^1 Y0 |3 B m - printf("灯亮\r\n");6 R" K& }$ A$ ~
- vTaskDelay(1000);& P$ b9 b- \( Z
- }
+ D; r) M1 n# W, Q* c - } 6 z V9 v1 o2 X ^& _7 V% ]; r
+ F) Q) {% Q) \' \( `! G+ C- 9 e+ n! h9 g- g5 ?1 _- ^9 S
- //usart0任务函数( b1 ?/ M0 x1 Z' r! ?
- void usart0_task(void *pvParameters)& Z$ R3 \2 E6 d' ^
- {% y+ \/ x7 T" E7 y9 v
- ' b2 n/ t7 @0 [7 O+ z4 v' G( }9 H1 `
- while(1)
+ o- J0 q8 t/ K5 r+ [ - { 6 q" c! y3 L+ c: W
- printf("hello lee"); g; r2 C2 f" }9 [4 Z7 W- E* o& T
- printf("\r\n");
9 ?" Q- b" y2 V) D* C- d - vTaskDelay(1000);4 L7 H9 ?7 C! _
- }4 f$ {2 ?" [2 T* ]7 c. v* c
- }
/ ^; `/ O- t! Y6 y" G$ r
5 w4 U1 p0 ]3 k- //temper0任务函数(暂时为LED1翻转)
& c# [) v: V+ b8 u2 p2 @ - void temper0_task(void *pvParameters)# \5 U5 ?# ^0 D- y
- {
* h" A7 ]8 ^- v0 m. B6 h! t -
6 c8 Z% ~4 _3 l6 h3 @! J: F - while (1)1 X( v, Y+ B9 a3 t
- {
) e$ o9 Z" H+ Q0 V - LED1=~LED1;
+ r8 C* _- c z7 ?+ D' r6 k - vTaskDelay(1000); . L, X. B* x6 }) ^+ ?
- }( c! y( ~+ X* |* \4 l
- }
0 Y( T$ D" {" X- n6 l2 a - 2 E- c% y/ ]+ L7 h+ M
- void LCD_TO_task(void *pvParameters)4 L) E& n" f/ v1 B ^; I9 W
- {
3 R5 k% v6 L# \5 W3 f - u8 lcd_id[12];# \5 C- g1 F0 D& X! d9 j
- sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
: }9 e2 H( @" ]4 K! i - while (1)
! ~# E9 n5 G0 I6 _$ e - {
" X# _- B6 a- u; r - LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^"); \2 u+ @* R2 S# v
- LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
3 q2 S( b; P1 a# @ - LCD_ShowString(30,90,200,16,16,"DARKSTARS");' T6 S1 j. I- i) {2 }
- LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID
* l4 V& B: m! x# ~( [1 a& o - LCD_ShowString(30,130,200,12,12,"2020/12/4");
1 @; c: X ]" t$ k/ m1 v+ w - vTaskDelay(1000);
( B& Z, @+ y" u, o( ? - }8 T; Z; \2 W) v0 u, K$ f
- }
) w7 ]- y7 V6 o) _" w: ]. m
复制代码 0 o; ~( p# l/ z9 c: r. u, F
$ \* r% U1 j' W7 O9 Q
" t6 J5 c* I5 b# {% U8 ?; n A* t4 X. S3 c- Y" {% k3 O: F, V& b
5 V3 ~% B R' N" e
% f5 I3 m; U: C8 y+ L* M- Z1 N$ T3 k. V9 P$ M
. _5 q) p/ S/ L, Y. d, A( M
9 O1 E! a; s, |8 s
/ d0 @% W- K# X总结0 f$ ?8 w6 ]8 I, q
通过这次系统的移植,我感受到系统的魅力,有了系统之后,许多程序就能并行运行了,这样我们就能完成更加高效,更加同步的信息处理和信息传输。对于高刷新率的信息处理,移植系统无疑是更好的选择。1 j8 ]5 \2 Z* ~$ c
+ Z3 E' a' \* X0 K
) [' \* I/ B1 Y; v4 f6 M2 L* g4 k+ l2 t
# \0 ]+ Q; r( E |