记录一段FreeRTOS程序,该程序演示了任务状态怎么判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/**
* @file main.c
* @author 信念D力量
* @brief
* @version 0.1
* @date 2022-03-08
*
* @copyright Copyright (c) 2022
*
*/
#include "main.h"
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
#include "debug_printf.h"

#include "gd32f1x0.h"
#include "gd32f1x0r_eval.h"
#include <stdio.h>
#include "key.h"

/* LED1 Task */
#define LED1_TASK_PRIO 0 // 任务优先级
#define LED1_STK_SIZE 50 // 任务堆栈大小
TaskHandle_t LED1Task_Handler; // 定义任务句柄,一个任务一个任务句柄
void led1_task(void *pvParameters); // 任务函数

/* LED2 Task */
#define LED2_TASK_PRIO 0
#define LED2_STK_SIZE 50
TaskHandle_t LED2Task_Handler;
void led2_task(void *pvParameters);

/* 全局变量定义 */
uint32_t ui32Count = 0;
uint32_t u32_nums[5] = {1, 2, 3, 4, 5};

static const char *pv_string = "void *pvParameters";

static char pcWriteBuffer[256] = {0};

// 主函数
int main(void) {
// ------ 函数初始化代码区 ------
key_init();
debug_printf_init(EVAL_COM0); // 使用 EVAL 库初始化 USART1
gd_eval_led_init(LED1); // 使用 EVAL 库初始化 LED1
gd_eval_led_init(LED2); // 使用 EVAL 库初始化 LED2
gd_eval_led_init(LED3); // 使用 EVAL 库初始化 LED3

// 创建任务 led1_task
xTaskCreate((TaskFunction_t)led1_task, \
(const char*)"led1_task", \
(uint16_t)LED1_STK_SIZE, \
(void*)pv_string, \
(UBaseType_t)LED1_TASK_PRIO, \
(TaskHandle_t*)&LED1Task_Handler);

// 创建任务 led2_task
xTaskCreate((TaskFunction_t)led2_task, \
(const char*)"led2_task", \
(uint16_t)LED2_STK_SIZE, \
(void*)NULL, \
(UBaseType_t)LED2_TASK_PRIO, \
(TaskHandle_t*)&LED2Task_Handler);
// app_main()
app_main();

// 启动任务调度器
vTaskStartScheduler();




while (1) {

}
}


/*******************************************************************************
function_name: led1_task
description: FreeRTOS 任务函数
calls:
called by:
input: void*
output:
return: void
others:
*******************************************************************************/
void led1_task(void *pvParameters)
{
static uint32_t count = 0;
while(1) {
UBaseType_t current_p = uxTaskPriorityGet(LED2Task_Handler); // 获取优先级
printf("任务2的优先级为:%ld\n", current_p);

/* 设置任务状态 */
if (current_p == 0) vTaskPrioritySet(LED2Task_Handler, 1);

gd_eval_led_toggle(LED1);
vTaskDelay(1000);
count++;
if(count >= 10) {
count = 0;
vTaskResume(LED2Task_Handler);
}
/* 如果 LED2Task_Handler 的状态不为挂起状态则挂起该任务 */
if (eTaskGetState(LED2Task_Handler) != eSuspended) vTaskSuspend(LED2Task_Handler);
}
}

/*******************************************************************************
function_name: led1_task
description: FreeRTOS 任务函数
calls:
called by:
input: void*
output:
return: void
others:
*******************************************************************************/
void led2_task(void *pvParameters)
{
while(1) {
printf("led2_task...\n");
gd_eval_led_toggle(LED2);
vTaskDelay(500);
}
}

void app_main(void)
{
vTaskList(pcWriteBuffer);

printf("--------------------------------------------------\n");
printf("Name|State|riority|Stack|Num\n");
printf("%s\n", pcWriteBuffer);
}