一、源码处理/ v w+ ?/ {, G- E0 T
文件下载* e+ J: ?+ [, f
1、官网下载源码
/ S# j! } m! h" F
" S0 f# K) g1 Q( t5 R
$ ^. i6 M, f' [6 N& f( _! J
1 [ z- i) Q. f# |2、找到相关的例程
6 e: @9 r g5 n- {0 X7 X) f% w, l$ H. Y) j$ N9 r
3 {0 N* @$ X9 I' }! n
3、进入源码文件$ I/ F4 x" U6 g
4 M+ f5 u+ \' U$ L) b# Y5 }& J6 l
0 s: ^3 s) }7 g, K6 N
& c; i7 X Z2 }3 D% p; E4、找到相关的文件
4 k' B2 d3 V% D' {2 i+ s3 j
. ? r4 a. G7 R7 u+ w1 `" a- a7 \, ~* r @ v5 n4 M
: |6 R' a0 _& w
keil、RVDS为需要的文件,MemMang为需要的内存文件
. ~/ j1 G1 \+ L1 k( B+ v) P8 ]$ `, C, o$ z( z, e$ F0 n
文件移植( u5 K: K' g) J& D1 G( Z {
1、在之前led灯程序基础上添加文件/ l* y# T/ k$ L) n" u% W( @
注释:在正点原子开源工程里可以下载4 \; `1 b5 U) o% r: Y# o
( ^# g/ W: J. G- E1 b
$ Y1 ?+ x, _. t
3 L7 n" O E5 n, o6 t( l# R/ l, r7 D a
2、将相关.h文件包含进去
' x/ q5 ^) r$ J0 N" }/ ?9 l f4 k* P! a6 a3 u
# U9 C" Q; I& S, d! |2 Z& ?7 i& ]" X+ Q% t
此时编译会报错! H( o' C3 `* A) _+ d
继续包含所需要的文件
. j' j; o1 ~: ?! r9 o9 P
6 Y% C8 S8 `4 \, K8 @' H2 v" m1 F
) n: C) O0 T' x: i/ |; d7 g! }( ]$ {( u
文件地址:
6 M/ b! R3 E: g8 [# i
6 j$ [" T3 q2 n( m
1 c. V/ ^$ q! W% Y) T8 B* C s2 v& m' p( c+ _, j% b5 t
3、修改相关文件! O" A% I) Y4 Z1 r n
2 S8 b4 I h1 ^0 E
注释:正点原子给的工程例程是支持ucos的,所以我们需要把一些oc相关的删除掉
( @! O- O9 |! v5 f- J以下是修改之后程序代码:
& R; |8 T+ c/ t4 |/ Zsys.h N: D% U) [0 ^4 L# ]
5 n; X! U- Y9 a+ R
& y5 N2 t+ d- U3 n$ n
# h5 L8 _& C {% E9 n, u
usart.c
, \: W* y. M4 u9 \( g9 Z) |# L; j: }0 z7 @7 S3 J5 _! I0 Z
9 ?3 O$ }2 Z6 y% N4 I! T" i$ O1 q+ H+ ^+ u: ~$ K5 T
原来是include.h,需要改成FreePTOS.h s2 a5 R! D& d4 \9 t
j4 }$ s" Q9 H* C/ odelay.c4 y( K0 k& K$ _! F$ ]
; r/ e) G! n& v7 U9 q G0 K' ]
1:SysTIck_Handler()7 N. C2 j+ H( i% Q, }6 H' ]
- extern void xPortSysTickHandler(void);
( A a" w1 P4 \2 i - ( \* ?# v0 T1 A2 _( ~5 B- n
- //systick中断服务函数,使用ucos时用到
# r* x5 k1 M( x; g! g - void SysTick_Handler(void)
# ~0 j5 ]2 K/ H! K/ S - {
' j k _ p* R( [0 V) P" k - if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
" _0 m3 c) o% I6 K* R - {" D1 T- S6 M+ C8 w5 _4 U
- xPortSysTickHandler();
4 g; Z8 T7 ~' E! q- h - }
! Y8 b# B B D( ? Y9 r - }
复制代码 7 F6 e6 I* v, l0 r% T( y6 C
2:delay_init
4 Y8 r7 o9 c! e4 T# j$ ?$ P; _! Z" r
- oid delay_init()! M4 U3 X, D2 E4 M
- {
) \# \, B7 e' r; {* b" R3 G h8 Z - u32 reload;
# s3 I! e) ?/ X1 R% O z) F, i - SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
K: f' E: A( f5 u. G" D% \ - fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用
8 d) z; P& z, j# _2 m - reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M ) B+ ~! _6 h/ t, V' [+ b) R2 _
- reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间5 W, U, x+ |4 d% U o
- //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右 ! J; \: F) T5 C0 @. ]
- fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位 % V( d, P5 p& B7 N
- ; {9 d; u6 N% @, }
- SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断( Y: \2 N$ N- Y
- SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次 ' u0 ~ G$ b+ z* h
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK ( O q5 p, ?1 j) n% K
- }
复制代码
- P, \8 T6 D3 B) N3:两个延时函数
D" ~9 a1 _/ [0 D9 @7 V. ^/ [. p) v' g" J1 z- x
- //延时nus) m& p: r( e( ^0 S; e
- //nus:要延时的us数.
. N2 q W4 ]% D1 a; i/ y, o0 r - //nus:0~204522252(最大值即2^32/fac_us@fac_us=168) 4 a7 `- i' D. B6 G) s- x1 s
- void delay_us(u32 nus)) j# _& H# q) P
- { & {- H/ e# N8 e, m1 v8 e: r
- u32 ticks;
& R, E: o2 h3 ~% `8 Q, J, V- b - u32 told,tnow,tcnt=0;% Y I* T9 S# N# @
- u32 reload=SysTick->LOAD; //LOAD的值
2 f3 ^3 k7 [; |' f' h - ticks=nus*fac_us; //需要的节拍数
- P) D$ l6 d3 [# |; I - told=SysTick->VAL; //刚进入时的计数器值
3 A3 I7 e; X" O: n- H. C* d( M$ l - while(1)4 g5 I8 Y' l6 h
- {( ~2 R- p0 P" z' ^. y* V
- tnow=SysTick->VAL; N# |8 e- s$ }0 |- b
- if(tnow!=told)9 Q. }' l6 ]1 _, ?6 c: { n: {! l- l
- {
* g" K: c3 f4 U! q& } - if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
1 y; K1 t1 {) O2 M - else tcnt+=reload-tnow+told;
5 q* {- F4 r" S5 g; g; R0 \ - told=tnow;& G! h3 q3 y/ b/ N) ?( u' b0 K
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
( d' f( m5 f( U9 X8 s( n! j' M I& y - }
# d9 l8 \2 O- ~- ` - };
, K9 _1 n: I! t r( c/ a - }
1 U8 j ]/ B! a _# }; X - //延时nms
7 |( I/ x# g, m; \" z - //nms:要延时的ms数) H7 C9 G+ w( e' N
- //nms:0~65535( C# P( t2 e& ~1 X
- void delay_ms(u32 nms)' _* s4 _# v$ }. L8 b5 F
- {
& [* x7 h; }. m) Z8 A - if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
! V$ p" z$ W' ~) K5 a - { * ^/ X, N- r: Q- i, }/ \
- if(nms>=fac_ms) //延时的时间大于OS的最少时间周期 3 ^, z n% t1 r, h, ]
- { 0 S% j. y8 ?# D l
- vTaskDelay(nms/fac_ms); //FreeRTOS延时
5 P$ N+ y8 T! x% h5 x - }
) }+ S1 H$ K! d# a4 r( J1 q - nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时 / q7 ^6 X& B) W& h
- }
5 V+ v- Q! w8 o6 m' p - delay_us((u32)(nms*1000)); //普通方式延时
7 X6 Y8 M8 ^- m - }
8 F: v9 }, y5 f0 x$ _4 e - % P; w" C! `/ N5 T- {: L& Z# u
- //延时nms,不会引起任务调度" g" g* s: d0 \. u% \( a
- //nms:要延时的ms数1 [/ ]! y$ o/ N2 f- s9 K
- void delay_xms(u32 nms)
& ^% \! o0 I& a/ K! j* i0 o Y - {
7 t$ ]$ n$ i' f5 J$ \2 [ - u32 i;
9 P. S8 [/ W+ X+ n( J) I - for(i=0;i<nms;i++) delay_us(1000);
* M5 p( A. `/ K( U - }
复制代码
0 Z3 {2 r( f6 u1 y7 h2 C9 Z4、屏蔽中断
. y% A' Y7 a0 }' {$ c$ d" ]7 e k$ H V7 p# k" ?4 t& l- X+ k6 {
6 [4 O) w- \$ E
9 \* j6 I$ R. P
5、最后编译一下,就创建成功啦!!!
9 R2 |$ t( f% {4 ^% B, k& f9 ]/ U$ Q* m
创建任务并执行任务
0 C$ d8 _0 A, l ^1 I创建任务分以下步骤:
8 m( A v7 V5 i. v0 g D2 H# [- 设置任务优先级
% Y" P) i, g1 C7 L. C - 设置任务堆栈大小; Q' ~/ g: L# q9 v& K3 c# k
- 设置任务句柄
6 [* \ ]' z# q& l0 |5 _ - 设置任务函数
复制代码 我创建了一个任务,使得两个灯同时闪烁,以及串口输出Halloword,以及在移植OLED屏幕的程序, Y0 P# d8 c5 X+ G- u' q
! {" O$ J" T. u) @6 V7 cOLED程序移植相对简单,只需要把相关文件夹进去就行
6 s4 x8 J2 p) T. @这是移植所需要的的一些相关文件:
- @8 k5 m9 M3 Q6 ~ J$ A( N# I, y9 k; A( g$ _$ j( R7 B6 r
2 o( P" ^7 z+ m7 `4 r) A
其中NRF24L01.c是无线通信模块的,我还在肝中,有需要请私信我。7 N: I5 n o1 _
主函数:8 H+ L- I+ Y1 E9 }( x z
9 }4 T$ y* @, f
- #include "sys.h": X4 ~4 V& u7 s% a8 G
- #include "delay.h"
4 b- o; _6 Z2 a, M - #include "usart.h"& R4 J& F6 B+ T7 C, T% x. Q
- #include "led.h"
2 u* P0 k' ]0 C; b, | - #include "FreeRTOS.h"
& ^. E p' p+ T9 e* T. E - #include "task.h" t- E" Q) e" E! g( U4 p
- #include "lcd.h"/ o V' ]6 P- [1 a3 ]
7 T) L! m6 v2 Z& u- //任务优先级1 a( b( S/ ]# s( e
- #define START_TASK_PRIO 1. z8 e% `# q9 t* y* E. G1 b
- //任务堆栈大小
0 M k% d. Q* t2 Z - #define START_STK_SIZE 128 * M. W7 Q- }* r9 s8 c& B8 c
- //任务句柄
5 l1 g# I5 ]. O - TaskHandle_t StartTask_Handler;
9 w9 o( o( [ m - //任务函数
/ W9 [9 O0 j4 b - void start_task(void *pvParameters);
! ~9 Q- e" y0 X
( v# B6 l8 y7 P1 n
% I+ d' c+ _/ U& r+ }- //任务优先级8 }3 o ]9 Q! N$ P. t0 ^# F
- #define LED0_TASK_PRIO 2
$ k& T1 ]- f& ~- J& p: J) m% o - //任务堆栈大小 ) R# e* P( m" s
- #define LED0_STK_SIZE 50 # G) E$ {$ G6 x4 m: b
- //任务句柄, p) R) p2 @* ?. }
- TaskHandle_t LED0Task_Handler;
# U1 d/ K& S+ d4 m$ |! x - //任务函数
0 ]% R$ C; f6 \/ B4 X& u - void led0_task(void *pvParameters);, I: f) }1 E" z' t0 P. z. S
- $ E" t) ^2 a+ U1 `% j3 B
- //任务优先级
! C7 Z& s9 u! l7 ^/ f - #define USART0_TASK_PRIO 3
' E; j: r9 ~# c! T/ _ - //任务堆栈大小 & C) O9 }& W3 j3 Y! e2 ~
- #define USART0_STK_SIZE 50
1 z1 u9 u# @/ k7 i ^ - //任务句柄
: x3 P3 z: Z5 Z7 | - TaskHandle_t USART0Task_Handler;/ I9 h, d2 g G8 m
- //任务函数
7 _4 l9 [- J0 z! K# C$ @ - void usart0_task(void *pvParameters);% E& A$ D* l! o4 B9 N8 U
- / y+ |* b3 X8 n5 |( i
1 l9 l+ G0 S6 B' F' d7 C ?( z- //任务优先级
2 J- @* N0 Y! X" P0 x - #define TEMPER0_TASK_PRIO 4& v3 O! V% m- @8 {/ U$ e
- //任务堆栈大小 + K+ t8 {( z; M
- #define TEMPER0_STK_SIZE 50 ) |; |: P5 J) Z, g! r. J
- TaskHandle_t TEMPER0Task_Handler;
5 ]3 ]5 j; _" ^$ N# n( G0 e - //任务函数
' ~9 Q: p2 I0 O) F$ B - void TEMPER0_task(void *pvParameters);( W& l# h1 M0 k: r
- $ h1 z0 P+ q0 q) c7 Z4 G, g
# h5 x8 b# A! g5 x$ K; A$ t* G4 w$ [7 a- //任务优先级+ a! @. _* h" R
- #define LCD_TO_TASK_PRIO 5
( i l$ f* W/ \' c4 O2 c" `: W - //任务堆栈大小 - Q: B$ A# h( e1 k" z; u( U x
- #define LCD_TO_STK_SIZE 50 3 T# I) K' s7 S; O
- //任务句柄% r' x+ Q+ L+ m% `8 k+ C
- TaskHandle_t LCD_TOTask_Handler;
$ p1 [% T3 o4 V9 q! n - //任务函数3 e Z ], v( X: M1 V( H0 R1 l5 Z
- # ?4 i+ y7 c, x, i3 D
- void LCD_TO_task(void *pvParameters);
) X* Q* X/ e+ f - //任务句柄
% h2 i! P' f) g: h - 1 P+ n% D1 J' W1 [ I3 @6 m5 S
- TaskHandle_t TEMPER0Task_Handler;
9 d& Z2 r8 X% X* D& E% t - //任务函数5 q+ F/ i% Z; B! r
K4 `/ Y$ g: I- void temper0_task(void *pvParameters);
2 D; M. w, z2 y% X: r) ]1 l7 n - int main(void)
" ?( F1 Z& l/ p! X* [ - {
* C @3 f A% z+ a+ W - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
$ ?! y' t }5 `% y3 g) e - delay_init(); //延时函数初始化 / H& s/ g) r% `* T i r
- uart_init(115200); //初始化串口) x" o! b' P1 Q
- LED_Init();$ s" H1 ?, y e2 S! L
- //初始化LED2 ]4 w4 f! z9 a: Y: T
- LCD_Init();* w/ ]! q6 `) z8 o8 _ E# h
- POINT_COLOR=RED;/ ^' |* L. N0 P; n
- //初始化LCD9 A, p) N9 b7 I( z
- 5 R. w# P9 l! N( Q# M0 [; b" R
- //创建开始任务5 O, u8 o7 M. ]* _& A
- xTaskCreate((TaskFunction_t )start_task, //任务函数7 J* v" z& z/ X' ]
- (const char* )"start_task", //任务名称5 h. Z, R3 }. N! a+ ]# n( H
- (uint16_t )START_STK_SIZE, //任务堆栈大小* u0 Q- n7 K# [- j* Q; P
- (void* )NULL, //传递给任务函数的参数$ q; {$ i* ]: `8 \" z7 G! b, {+ B+ ^2 `: K
- (UBaseType_t )START_TASK_PRIO, //任务优先级0 E8 v- h- q3 P! _1 `0 C4 m& p
- (TaskHandle_t* )&StartTask_Handler); //任务句柄 ( t2 K0 X d9 R) l+ g. C Q
- vTaskStartScheduler(); //开启任务调度
' W8 n% T# E# D7 K' o n; l. Z - }: N9 b- V3 {! i$ E. v5 I6 v- Y8 L Z
/ f) i+ k* ^3 G% l% O/ s# H- //开始任务任务函数
( p, D3 r9 t7 W - void start_task(void *pvParameters)
& ^- J4 \7 c! e5 F6 P& _/ b - {
: N# e* J0 l5 }$ O$ g. i - taskENTER_CRITICAL(); //进入临界区
" W8 i2 W1 w, i. j9 ^2 a. J( ] - //创建LED0任务
+ ]1 c, o) [, O: Y, c - xTaskCreate((TaskFunction_t )led0_task, + z/ k# [4 q9 k4 {: w1 J
- (const char* )"led0_task",
b) Z2 c; U! w# z- ` - (uint16_t )LED0_STK_SIZE, ) R- M' V! Q, J- h8 l }& y& X
- (void* )NULL, ; ^: m: u/ E5 _
- (UBaseType_t )LED0_TASK_PRIO,
) E$ Z" v3 h& G+ L# E% s: P - (TaskHandle_t* )&LED0Task_Handler); + e, W0 {+ y% Y' T/ K
- //创建usart0任务1 C+ L! u+ p. `/ d. E
- xTaskCreate((TaskFunction_t )usart0_task, 0 Z2 e/ H9 [+ o& V' P
- (const char* )"usart0_task", ( t# G9 h9 T2 M, L- A3 b
- (uint16_t )USART0_STK_SIZE, ; C2 G$ B+ |! ` C' J2 t; L2 m: X
- (void* )NULL,8 l( L7 y: @! P5 v
- (UBaseType_t )USART0_TASK_PRIO,
i) G1 p1 I0 E6 ]5 |+ y+ F1 P - (TaskHandle_t* )&USART0Task_Handler);0 l' _. }1 [! X* T& F
- //创建temper0任务+ J: u: p7 ^+ ?5 u. e
- xTaskCreate((TaskFunction_t )temper0_task,
7 I; o ^+ q) F3 W* D - (const char* )"temper_task", $ i/ Z! E, K5 e0 T9 N) {
- (uint16_t )TEMPER0_STK_SIZE, 9 f% c, |' ?. Z8 Z
- (void* )NULL,
7 P0 n" H, q9 E1 r7 N) @" _ - (UBaseType_t )TEMPER0_TASK_PRIO," e, y! h! Q& X% u9 F# x1 N
- (TaskHandle_t* )&TEMPER0Task_Handler);
. I' `) b% u! c7 u { - ) N1 g% ^3 ^) x5 n* Q. z
- xTaskCreate((TaskFunction_t )LCD_TO_task,
, @2 u: M* T# s7 S - (const char* )"LCD_TO_task", 5 M! j" _0 u6 l3 m% M
- (uint16_t )LCD_TO_STK_SIZE, . V7 x# {9 h$ @, I" k$ n
- (void* )NULL,1 T, E* {; g. Z
- (UBaseType_t )LCD_TO_TASK_PRIO,
6 B! p# ?* B/ X8 n( s" ^ - (TaskHandle_t* )&LCD_TOTask_Handler);$ B7 L, a( b4 T
-
7 K: L/ m( Q0 w - vTaskDelete(StartTask_Handler); //删除开始任务7 Z7 e: Z$ M/ w _5 p7 J9 {
- taskEXIT_CRITICAL(); //退出临界区
6 Q3 x1 G) K; T- m+ W - }
! Q6 w1 h- o4 o+ i; @
4 F, A# m. }( D4 A) t
; z* F% j2 u3 R: E- //LED0任务函数
7 h' K: t1 d3 G% J' o6 `3 Y - void led0_task(void *pvParameters)" e. j- _$ T: U2 P9 l
- {
: J1 ~6 ?! }3 q# S5 s9 `$ L3 d8 f - while(1)
: d! e0 g4 G* s: x- ~, m; J - {9 V3 w. S8 B% ~! o5 ^. n# C( S: Q
- LED0=~LED0;
+ S& F0 M4 _+ H - if(LED0==1)
/ c, l+ \. k9 e; T7 x) \! j: } - printf("灯灭\r\n");. r c2 X) D9 ~% W8 ~
- else
4 o; ^) E# W3 m' S8 } - printf("灯亮\r\n");
8 D. K R8 u% {% j7 O; c: W - vTaskDelay(1000);' _ j& D* Y9 |# V
- }: _, P, H% F$ X% Q) M! Q6 m. U/ g
- }
) _/ W1 T' M# f% {3 N/ f c
! Y- L* V+ {/ U8 T' X
' H) ^: P0 X% s/ H- //usart0任务函数
7 o2 W% B; F' C: W- ] - void usart0_task(void *pvParameters): p2 B4 ^4 ^) F$ k3 J6 o
- {3 n5 A5 J6 B& M. \7 P$ G4 |& D
-
/ g7 |- [2 o6 p - while(1)
v/ r/ V5 z1 f% N7 n* u0 y; P8 S - {
3 [$ y6 z; T3 X+ W - printf("hello lee");
1 R: r4 L# Q/ ^( a - printf("\r\n");
& w/ K: L+ |4 A( I - vTaskDelay(1000); j8 H8 ~' \" t& x
- }# `) |- d, w/ P- n+ B3 v
- }. b3 Y \' S* U) U& a
- . d* f/ q0 C9 }" s' x$ r& v
- //temper0任务函数(暂时为LED1翻转)
; ~0 T- E" L. r8 C - void temper0_task(void *pvParameters)
2 P1 g! p/ \- g# n ` - {
1 A# F q8 w: l h1 ~ -
% [, h1 f4 a+ m) V6 \! v. x) z - while (1) d' f' u1 ^ v( s; O
- {
: N; g6 L" O8 Q( a* c - LED1=~LED1;0 C, T( y1 q: I$ B2 G9 [9 M
- vTaskDelay(1000);
) k3 w# p# j7 W3 k - }
5 O- T1 A% J- g; Q: y- @ - }4 b4 N: ^7 W! {0 l: Y$ C
% g4 O) s. D2 l2 r- void LCD_TO_task(void *pvParameters)* m3 U- h7 }: v; ^9 ^
- {
2 k& r2 K: s `6 L - u8 lcd_id[12];, d9 r8 E0 u8 K" K1 j
- sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id); ; I2 B! C* G4 ~
- while (1)% b5 l* g. x2 a. y. Z/ p7 z
- { 6 Z; k j) m% i# z5 g! o! H1 `% P
- LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^"); 3 D% j+ X L3 E( D& M
- LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
" L$ V6 T- d* |) v+ M1 e. B - LCD_ShowString(30,90,200,16,16,"DARKSTARS");# K3 u* H5 l7 Q& G
- LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID) I7 j7 ]4 O: Z' B) t( M) \0 e5 P
- LCD_ShowString(30,130,200,12,12,"2020/12/4");
7 z8 A N8 m; r7 R - vTaskDelay(1000);
) P3 ~: l W W1 Q - }
8 [2 Y z, q0 d - }
) ~! w/ ~" x" j: @ m; _- f/ I
复制代码
9 _( M" S; {2 n7 ]4 }" C$ j; e
7 `) A! N: o: ~- Y# L T1 k' f |0 s7 f# k, U% F
( [/ i C/ t. v `/ n! Y
4 n1 z e% l3 P, Z" Y' l R6 [2 Z7 D3 s, b+ ?! C5 z- h& w& @, _+ J
. P) N9 W' i7 k5 L$ g3 b
, }/ K# M% b* A" D0 N: ^
+ x7 ?4 u4 i) p+ T6 _$ J+ @
: N5 o- D4 q# z2 I- \( A" o总结2 s2 L4 M$ z3 E6 y, X3 L4 F
通过这次系统的移植,我感受到系统的魅力,有了系统之后,许多程序就能并行运行了,这样我们就能完成更加高效,更加同步的信息处理和信息传输。对于高刷新率的信息处理,移植系统无疑是更好的选择。
2 F* x( e9 o) _$ n- B
5 f- m: r' L; k! X% I5 u, o5 r
+ J7 {: A. t) S- M# q# S+ p* q* m/ `7 d. x! i# j3 h! D5 S
3 F- @& _* Q3 j6 a$ a+ i0 N" u# V |