本帖最后由 wolfgang2015 于 2018-5-17 22:51 编辑 : {9 L* i0 A( J, m2 G/ z
; W" U" }2 c( n# Y. ~2 p& Z/ {# F
上一篇文章介绍了 使用TrueStudio 搭建FreeRTOS环境、编译代码实现了FreeRTOS的启动,这里回顾一下FreeRTOS启动时的相关配置主要使用的 FreeRTOS配置文件的相关配置如下图: * m5 ], m, e2 i8 W; s' t
5 L* ^' S2 i! P* V% \1 ]+ Z5 O; }) f8 U7 p6 o
在CubeMX工具中也能实现对 FreeRTOS.h/FreeRTOSConfig.h 文件的配置主要在以下几个配置页面:& |7 N/ q6 {6 h: G
) f4 T. Q7 h8 R( V" Y/ s1 U
! |+ L& v( m, D
3 o3 T6 K" z. k& X; }) l) q8 _0 ]* n2 b8 u1 Y- A/ V/ ^4 n/ g
& G1 ?8 ? X' P4 U+ O利用Nucleo板载资源创建LED、UART,让板载资源在FreeRTOS任务的控制下启动并输出, 按实验要求,需要创建两个任务,一个LED任务作为PIN脚的输出,一个UART任务作为串口输出,示意如下图: ! _. d- K! e) `4 M
根据上一章节的经验,使用 xTaskCreate函数创建两个任务,分别如下: - xTaskCreate((TaskFunction_t) vStartLed2Task, //任务函数% O- b9 _ |# A8 B0 l* n
- "LED2", //任务名称8 F6 e* J" [8 h
- configMINIMAL_STACK_SIZE, //任务栈大小
, r" V2 M' Y4 k+ K# S/ { - NULL, //任务函数参数 E2 m4 G0 z0 A, B
- Start_TASK_PRIORITY, //任务执行等级7 f; }( O5 y- d2 M$ L' t* q- X R N
- (TaskHandle_t *) NULL); //任务句柄7 X2 h4 v: y% }7 ~8 i9 L
- 0 f' o1 b0 w e: D
- xTaskCreate((TaskFunction_t) vStartLPUart1Task, //任务函数7 G! w6 D3 j1 r7 p+ s& u, U% r
- "LPUart1", //任务名称
1 a; x2 h- f( Z& R - 200, //任务栈大小+ x2 P A9 Z5 Y4 |
- NULL, //任务函数参数. ?# _. ]. s' m& H; r
- Uart_TASK_PRIORITY, //任务执行等级 @% d9 m: _9 i$ C) h
- (TaskHandle_t *) NULL); //任务句柄
1 Q0 ^7 i( e. f# M0 i
3 Z0 @$ T; R2 n% V+ v
复制代码 D1 ? P" q5 Z4 x- {0 j4 D4 \
vStartLed2Task任务的主体内容: - void vStartLed2Task(void const * argument) {
( W. ^, d h3 y/ J. g2 t - uint8_t sta = ON;) ^9 M" r- n* L
- uint16_t delay = 500;
X! Q7 g) {: J5 Z- z- c/ c - /* USER CODE BEGIN 5 */
* q. B9 F1 g8 p. L - /* Infinite loop */0 K+ ]& G0 ^( a* M5 S6 a1 V: J
- for (;;) {
9 N( e& @ _, y& c/ Y# b - LED2(sta);
/ U2 Z7 M5 k: h& x# E - sta = !sta;
4 i% R# W$ ?( K$ K9 k$ _ N - vTaskDelay(delay / portTICK_PERIOD_MS);
6 v3 q; g8 q7 h J. Q7 s - }
. S- i4 ^# C5 q - /* USER CODE END 5 */$ K" e- F# Z7 b* P
- }
复制代码 % ~+ a1 B7 n, d* h' j
. x) `4 X! z+ ^. ?3 Y; _; c+ F
vStartLPUart1Task 任务的主体内容:
8 Q2 v8 ?, Y* W$ F4 P+ f5 `0 d- void vStartLPUart1Task(void const * argument) {% ]6 y5 ^0 g. X) ~+ r
- uint16_t delay = 1000;
# f8 |. D' R m0 W8 \0 k - for (;;) {
R: ]. p5 d8 j- v* f) f+ S - printf("Hello World FreeRTOS!!!\n");
) P5 l3 ]. X: U$ o - vTaskDelay(delay / portTICK_PERIOD_MS);
6 Q/ A* R/ g- q$ i% O' R9 h - }0 a" W) S9 k3 \* @
- }
复制代码
( Y) q$ U0 k: ]4 S' V! M
7 j5 A( o% I! G3 R9 `6 M$ }: v这里没啥说的,就是对上一章FreeRTOS的简单扩展,只是在 TrueStudio 环境 Eclipse + GNU CC的编译环境下:
% r' M3 A, G7 T5 d) d1 d* K6 [1 d2 ?要自己实现 Printf 的输出 还得对 工具创建的syscalls.c 代码进行简单改造: . t" f# l$ d* w
把其中的int _write(int32_t file, uint8_t *ptr, int32_t len) 函数改造如下,这样才能使用到Usart驱动中的输出内容。
8 D$ Z# Y9 s8 f% |0 ?4 m& R- ...................
4 Q8 k6 F6 J% M- l) } - extern int __io_putchar(int ch) __attribute__((weak));
& @% T! K1 R, @8 w" \/ y) o9 }
x; t0 R% J5 x- * \7 A1 l+ E" W9 z
- ........................: d- ]3 W( V, q' |: {# e' E) b
- int _write(int32_t file, uint8_t *ptr, int32_t len) {
) I" k3 U9 B- ?: J, b* V; o - /* Implement your write code here, this is used by puts and printf for example */
/ o; \( z; P: j - int32_t DataIdx;2 _, m2 e0 `. ?) d& `% A6 @
/ ?: g0 F5 H1 t- for (DataIdx = 0; DataIdx < len; DataIdx++) {5 O d& w3 c( Y. t/ S5 R) m/ T
- __io_putchar(*ptr++); t+ V( @5 b0 n# K' W
- }
% d6 g, t2 z( G5 n - return len;
N/ z+ s/ d$ X! A, r! S0 {) S0 F - }+ _6 T2 u. F& N8 e
复制代码 5 @/ K8 f1 Y0 Z9 Y
( p! T) Z8 Z3 H7 T# w- Y- L
一个LED、一个串口任务搭建好后,在这个任务的基础上略加改造就可实现后边 “信号量应用”、“队列应用”的实验内容,敬请期待:
s; R5 N: l) Y+ W
$ `; w0 }$ _, L6 Q: ^5 x% ]相关文档:" Q( Y1 Z- b3 u: a" O. Y
《低功耗MCU运行FreeRTOS》培课程的准备内容(一)
8 g4 @3 e& y6 E( Q《低功耗MCU运行FreeRTOS》培课程回顾(二)4 H$ Q: ?( u) p* L! g
《低功耗MCU运行FreeRTOS》培训课程(三) Atollic环境实验: ^8 H& L; U9 Q( w( J
8 p6 f0 }, \+ R. d }% d《低功耗MCU运行FreeRTOS》培训课程(五)信号量实现人机交互
, A3 D& ~4 Q1 I* Y. y9 f- Z8 m% \. s+ O《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用
" m( C" o* `2 x/ C" `- d- t/ ^4 ^0 n# B
|