uint32_t * pulIdleTaskStackSize ){ *ppxIdleTaskTCBBuffer = I

时间:2022-03-30 02:51:57

函数存在于task.c中,主要的函数有:

xTaskCreate():使用动态的要领创建一个任务;

xTaskCreatStatic():使用静态的要领创建一个任务(用的非常少);

xTaskCreateRestricted():创建一个使用MPU进行限制的任务;

vTaskDelete():删除一个任务;

vTaskSuspend():挂起一个任务;

vTaskResume():恢复一个任务的运行;

vTaskResumeFromISR():中断处事函数中恢复一个任务的运行;

portENABLE_INTERRUPTS():打开FreeRTOS中断;

portDISABLE_INTERRUPTS():*freeRTOS中断;

2.动态创建任务

xTaskCreate()函数原型:

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pvCreatedTask );

动态创建任务:使用前先判断 #if( configSUPPORT_STATIC_ALLOCATION == 1 ) 是否创立,如果弗成立需要在FreeRTOSConfig.h 文件中添加;

#include "FreeRTOS.h" #include "task.h" //start_task 任务 void start_task(void *pvParameters); // 任务函数 #define start_task_zise 50 // 任务仓库的巨细 #define start_task_prio 1 // 任务优先级 TaskHandle_t start_task_handler; // 任务句柄 //led1_task 任务 void led1_task(void *pvParameters); // 任务函数 #define led1_task_zise 50 // 任务仓库的巨细 #define led1_task_prio 2 // 任务优先级 TaskHandle_t led1_task_handler; // 任务句柄
int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); delay_init(); LED_Init(); // 创建一个任务 xTaskCreate(任务函数, 任务名, 任务仓库的巨细, 通报给任务函数的参数, 任务优先级, 任务句柄); xTaskCreate( start_task, "start_stask", start_task_zise, NULL, start_task_prio, &start_task_handler); vTaskStartScheduler(); // 开启任务调理 return 0; } void start_task( void * pvParameters ) { taskENTER_CRITICAL(); // 创建临界区 // 创建led1任务 xTaskCreate(led1_task, "led1_task", start_task_zise, NULL, led1_task_prio, &led1_task_handler); vTaskDelete(start_task_handler); //删除开始任务 taskEXIT_CRITICAL(); // 退出临界区 } //LED1任务函数 void led1_task( void * pvParameters ) { for( ;; ) { LED0 = ~LED0; vTaskDelay(1000); } }

3.静态创建任务

xTaskCreatStatic()函数原型:

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer )

静态创建任务:使用前先判断 #if( configSUPPORT_STATIC_ALLOCATION== 1 ) 是否创立,如果弗成立需要在FreeRTOSConfig.h 文件中添加;

在FreeRTOSConfig.h 文件中添加中添加宏后,编译报错:

.\Objects\freeRTOS_sCreate_task.axf: Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory(referred from tasks.o). .\Objects\freeRTOS_sCreate_task.axf: Error: L6218E: Undefined symbol vApplicationGetTimerTaskMemory (referred from timers.o).

由于把静态创建的宏给打开了,所以这两个数需要我们本身去实现

// 空闲任务 static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE]; static StaticTask_t IdleTaskTCB; // 按时器任务 static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH]; static StaticTask_t TimerTaskTCB; // 空闲任务所需内存 void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &IdleTaskTCB; *ppxIdleTaskStackBuffer = IdleTaskStack; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; } // 按时器任务所需内存 void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) { *ppxTimerTaskTCBBuffer = &TimerTaskTCB; *ppxTimerTaskStackBuffer = TimerTaskStack; *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; }

静态创建任务