先来看一个FreeRTOS 函数把,这个函数是 xTaskCreate()。函数原型:
1 2 3 4 5 6 7 8
| BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const configSTACK_DEPTH_TYPE usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask );
|
创建任务的目的是让 FreeRTOS 帮我们管理创建的各个任务,这些任务会伴随着多种状态和动作。如:任务的创建、删除、挂起、恢复和调度。
任务的创建分为静态创建和动态创建,分别使用函数 xTaskCreateStatic() 和 xTaskCreate() 来创建任务。
一个LED例子
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
| #include "gd32f1x0.h" #include "systick.h" #include "main.h" #include "gd32f1x0_libopt.h" #include "gd32f1x0r_eval.h" #include "gd32f1x0_it.h" #include "delay.h" #include "timer.h" #include "FreeRTOS.h" #include "task.h" #include <stdio.h>
#define LED1_TASK_PRIO 3 #define LED1_STK_SIZE 50 TaskHandle_t LED1Task_Handler; void led1_task(void *pvParameters);
#define LED2_TASK_PRIO 3 #define LED2_STK_SIZE 50 TaskHandle_t LED2Task_Handler; void led2_task(void *pvParameters);
int main(void) { gd_eval_led_init(LED1); gd_eval_led_init(LED2);
xTaskCreate((TaskFunction_t)led1_task, \ (const char*)"led1_task", \ (uint16_t)LED1_STK_SIZE, \ (void*)NULL, \ (UBaseType_t)LED1_TASK_PRIO, \ (TaskHandle_t*)&LED1Task_Handler); 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); vTaskStartScheduler();
while (1) { } }
void led1_task(void *pvParameters) { while (1) { gd_eval_led_off(LED1); vTaskDelay(100); gd_eval_led_on(LED1); vTaskDelay(100); } }
void led2_task(void *pvParameters) { while (1) { gd_eval_led_on(LED2); vTaskDelay(100); gd_eval_led_off(LED2); vTaskDelay(100); } }
|