FreeRTOS(3)常用API

==FreeRTOS中任务优先级数值越大,优先级越高,和HAL库相反==

1.创建任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,    //任务函数
const char * const pcName, //任务名字
const uint16_t usStackDepth, //任务堆栈大小
void * const pvParameters, //传递给任务函数的参数
UBaseType_t uxPriority, //任务优先级
TaskHandle_t * const pxCreatedTask ) //任务句柄
//pxTaskCode : 任务函数
//PCName : 任务名字,一般用于追踪和调试,名字长度不超过configMAX_TASK_LEN
//usStackDepth : 任务堆栈的大小,实际申请的大小是usStackDepth的4倍,空闲任务的任务堆栈大小是configMINIMAL_STACK_SIZE
//pvParameters : 传递给任务函数的参数,无参数填NULL
//uxPriority : 任务优先级,0~configMAX_PRIORITIES-1 ,数字越小,优先级越低
//pxCreatedTask : 任务句柄,任务创建成功后会返回此任务的任务句柄,
// 该句柄其实就是任务的堆栈,此参数用于保存这个任务句柄,其他的API函数会用到该句柄
//return : pdPASS:任务创建成功;errCOULD_NOT_ALLOCTE_REQUIRED_MEMORY:创建失败

2.删除任务

删除一个用动态或者静态创建的的任务,被删除的任务不再存在,任务调度器无法再调度该任务。当一个任务被删除后,其所对应的句柄就不能再使用了。删除一个使用动态创建的(XTaskCreate( ))任务,其所申请的堆栈和控制块内存将会被释放掉。有静态方法创建的任务,所使用的堆栈就需要用户自己去释放掉所对应的内存,否则会导致内存泄漏。此函数的原型如下:

1
2
void vTaskDelete( TaskHandle_t xTaskToDelete)
//参数:xTaskToDelete,需要删除的任务的任务句柄

3.阻塞式延时函数

延时时间函数,相当于告诉操作系统,该任务延时一段时间后再执行,这段时间内去执行其他任务,并在某个时间点将该任务重新唤醒。这个时间点就是函数的入参,一般都是以**系统节拍为单位(FreeRTOS的系统节拍为1ms)**。可以用于高优先级任务死循环执行时,设置任务睡眠,以执行低优先级的任务。

1
2
void vTaskDelay( const TickType_t xTicksToDelay )
//参数:延时时间,单位tick,时间片

4.空闲任务函数

当没有任务处于就绪态以及运行态时,系统将进行空闲任务(一般是回收资源),除了本身自带的空闲任务,用户可以通过写回调函数自定义空闲态的任务

步骤:

1.在config.h中

1
#define configUSE_IDLE_HOOK                        1                       //1,使用空闲钩子;0,不使用

2.自己重写回调函数

1
2
3
4
5
6
void vApplicationIdleHook( void )
{
Num0=uxTaskGetNumberOfTasks();
Num1=uxTaskGetStackHighWaterMark(StartTask_Handler);
Num2=uxTaskGetStackHighWaterMark(LEDTask_Handler);
}

5.临界区

当代码进入临界区时,会失能所有中断,一般在Star_task时进入,在其他任务创建完成后退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Start_task(void *pvParameters)
{
taskENTER_CRITICAL();//代码进入临界区

xTaskCreate( (TaskFunction_t)LED_task, //任务的主函数
(const char* )"LED_task", //任务名
(uint16_t )LED_STK_SIZE, //任务堆栈大小
(void* )NULL, //传给任务函数的参数
(UBaseType_t )LED_TASK_PRIO, //任务优先级
(TaskHandle_t* )&LEDTask_Handler); //任务的句柄

vTaskDelete(StartTask_Handler);//删除这个任务

taskEXIT_CRITICAL();//代码退出临界区
}

6.其他辅助API

img

7.FreeRTOS与中断

image-20220416202151199

通过该宏定义可以设置系统可管理的中断范围(在这些中断里能用FreeRTOS的API)

配置configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY为5,表示用户可以在抢占式优先级为5-15的中断里面调用FreeRTOS的API函数,抢占式优先级为0-4的中断里面是不允许调用的

参考

https://blog.csdn.net/weixin_42895086/article/details/120154812?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&utm_relevant_index=2

https://blog.csdn.net/weixin_44289254/article/details/118547203?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165008375116780265433273%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165008375116780265433273&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-118547203.142^v9^pc_search_result_control_group,157^v4^control&utm_term=freertos+api&spm=1018.2226.3001.4187