本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑 0 C$ E* o9 v% h: F" o( F
9 f: a. n8 W% K( h0 x
上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置主要使用的 FreeRTOS配置文件的相关配置如下图: X6 [# U4 o( H! H1 m
8 |9 q: A9 ?" _ a
# s Z U% k0 x: u9 \0 C在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:- I( B' j2 w+ l3 G0 S, m! ~+ |# v
1 _' Y+ E- w5 C
^- e& h- y. l$ M
5 Y) f9 L; R k
4 `# H) Y! x8 W( c7 S
i) c6 n; D2 s# h+ z. w利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出, 按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图: ) Z0 Q& X' G: o/ _- ~
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下: - xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数
* n2 {9 A3 v6 f& E7 J( B* \ - "LED2", //任务名称8 ? m1 k! B% }' I
- configMINIMAL_STACK_SIZE, //任务栈大小
6 D# X- y6 m9 U - NULL, //任务函数参数6 U# {! F1 c: z& H; [) C2 N9 {6 j
- Start_TASK_PRIORITY, //任务执行等级
6 L& E* V* |6 k# ]' \ - (TaskHandle_t *) NULL); //任务句柄
7 n# e0 H% `) ^0 P" F8 l - 4 D0 ~( g2 E; J1 X. D) I: ]
- xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数* y/ `/ {! R7 g$ H" ?& o
- "LPUart1", //任务名称' o H) T+ g" Z# T
- 200, //任务栈大小
7 ?) I3 t, s2 f2 L$ Y6 Y6 K - NULL, //任务函数参数
! |7 v- E3 v, x Q- W9 m2 z - Uart_TASK_PRIORITY, //任务执行等级
! j( }, N) ~9 |# U' J - (TaskHandle_t *) NULL); //任务句柄$ X$ V1 J0 e$ n/ y
- , c1 Y& `/ X! t7 K# R
复制代码 ; S9 Y6 c# B9 d$ u
vStartLed2Task任务的主体内容: - void vStartLed2Task(void const * argument) {# j$ U. d" p: D+ a; \2 [% {, v9 E* e
- uint8_t sta = ON;
) T% E% N4 ]# w8 Z/ g" s3 v - uint16_t delay = 500;, `6 T1 D& r4 ]" j+ n/ H: V
- /* USER CODE BEGIN 5 */
/ o1 O R: r/ H - /* Infinite loop */
% C& h* |, A1 Q$ q) a - for (;;) {+ c* y# {% H6 r6 c" z
- LED2(sta);0 G' Y& M9 o: n3 D
- sta = !sta;
5 x. L( H/ r$ a4 h* p - vTaskDelay(delay / portTICK_PERIOD_MS);2 m; g5 l4 B$ @1 M1 b
- }
6 i5 i! S! q& L6 o, H4 f2 H9 k - /* USER CODE END 5 */
( Y3 I- `, M; _8 P. u- z/ j - }
复制代码
5 t! b- H! w* _. {2 v" l; ]2 _/ Y2 `6 k: I
vStartLPUart1Task 任务的主体内容:9 x4 D( W, k/ Y/ Z2 l
- void vStartLPUart1Task(void const * argument) {& o9 ^4 m0 L3 l. ~
- uint16_t delay = 1000;3 v1 T; |" U( ]' ] T0 M4 D
- for (;;) {$ H% P" h" B; [% F
- printf("Hello World FreeRTOS!!!\n");7 i# N8 B6 I* x4 U. R' \( K1 U$ O
- vTaskDelay(delay / portTICK_PERIOD_MS);
5 V9 q$ U: }! A6 ?4 j( [ - }) W Q) b* B2 ?. ]5 h4 L
- }
复制代码
. [4 i5 n7 e- l4 k: G0 T, a y o% W( f( q+ c5 v& P! O W6 l& n
这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio 环境 Eclipse + GNU CC的编译环境下:
9 c1 Y# a% k# W; q3 G x要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造:
$ Y @: F- a! @# \ h' A5 X' W把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。4 y* S0 Q3 f( @# K/ b& f5 T; V
- ...................
' [" |, ~2 R* e$ h3 y - extern int __io_putchar(int ch) __attribute__((weak));! h. \! g$ f. O6 U( g
- @8 @* @. Z9 e4 r. Y- * J4 q* X$ E+ V* D# k
- ......................../ g: M( x6 n4 ?5 x7 A5 \
- int _write(int32_t file, uint8_t *ptr, int32_t len) { s T! J7 m2 c9 T6 ^
- /* Implement your write code here, this is used by puts and printf for example */& }+ v3 D, F2 s& \: I
- int32_t DataIdx;
1 {9 D `( q) i% v$ a! j" m
( y& r: z* l. Y4 w w" Y- for (DataIdx = 0; DataIdx < len; DataIdx++) {' F' _- `, S6 E) B
- __io_putchar(*ptr++);
. x/ _9 u! {* a& B0 t; ?1 P - }% x7 T' a6 d6 I# U
- return len;3 I+ y* t# t+ F6 |* b2 a4 Y
- }
. z! }4 ^& D. I
复制代码
! m3 z5 w) f* o# |3 q* |# `) z8 i3 `8 q4 f* z* {( h
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:
" I6 ] p, I/ g+ e" Z
+ m' N# c5 B/ k; {$ R: Y相关文档:
/ f9 d; J8 @8 R) l( `" x; w3 a《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
) X: t( v# j0 h- |+ k' ^! X9 U《低功耗MCU运行FreeRTOS》培课程回顾(二)( Q! c2 m, w5 B: @0 ?
《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验
7 L! b& P3 |; y2 T- P- |: Q. P5 B+ H) t0 k/ ^: C, i" _. a* K
《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互* h# h2 L) T4 ]1 y( @) e1 A
《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用; ?: D( W& W6 s, ]5 t/ _% S! y
' q2 K& N3 t/ r0 t0 T
|