函数存在于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);
}
}
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; }
静态创建任务