FreeRTOS知识及常用API函数

目录

1、简介

2、特点

3、三种任务调度方式

3.1 抢占式调度:

3.2 时间片调度:

3.3 协程式调度:

4、任务状态

5、常用API接口函数

1. 创建一个任务xTaskCreate()

2. 删除一个任务vTaskDelete()

3. 挂起任务vTaskSuspend()

4. 恢复被挂起任务vTaskResume()

5. 中断中恢复被挂起任务vTaskResumeFromISR()

6. 获取任务的状态eTaskGetState()

7. 任务中进入退出临界区

8. 中断中进入退出临界区

9. 关闭中断portDISABLE_INTERRUPTS()

10. 打开中断portENABLE_INTERRUPTS()


1、简介

        RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性,例如打游戏和回复信息,不需要等某一件事做完,可每间隔1ms(一个时间片时钟节拍),然后交替做这两件 事,因为速度很快,从宏观的意义上来看,类似同步执行!

2、特点

        其有以下特点:①实现功能划分为多个任务;②延时函数不会空等待,会让出CPU的使用权给其他任务,即任务调度;③高优先级任务抢占低优先级任务;④每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息。

FreeRTOS知识及常用API函数_第1张图片

3、三种任务调度方式

   3.1 抢占式调度:

        针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。

FreeRTOS知识及常用API函数_第2张图片

   3.2 时间片调度:

        针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。

FreeRTOS知识及常用API函数_第3张图片

   3.3 协程式调度:

        当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务(不建议使用,因为官方已停止更新)。

4、任务状态

FreeRTOS中任务共存在4种状态:①运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态;②就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态;③阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态;④挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume() 才可以进入就绪态。

        仅就绪态可转变成运行态,其他状态的任务想运行,必须先转变成就绪态。

FreeRTOS知识及常用API函数_第4张图片

5、常用API接口函数

        注意:以下表格中的函数和参数信息是基于 FreeRTOS 版本 10.x 的情况,具体的版本可能会有差异。在使用这些函数时,请根据你所使用的 FreeRTOS 版本和相关文档进行确认。

    1. 创建一个任务xTaskCreate()

osThreadStaticDef(myTask02, StartTask02, osPriorityNormal, 0, 128, myTask02Buffer, &myTask02ControlBlock);
myTask02Handle = xTaskCreate(osThread(myTask02), NULL);

    2. 删除一个任务vTaskDelete()

//删除另外的任务
if(myTask02Handle != NULL){
    vTaskDelete(myTask02Handle);    //要删除的任务句柄
    myTask02Handle=NULL;            //清空
}


//删除本身任务
vTaskDelete(NULL);
myTask03Handle=NULL;

    3. 挂起任务vTaskSuspend()

//挂起另外的任务
vTaskSuspend(myTask02Handle);

//挂起当前任务
vTaskSuspend(NULL);    

    4. 恢复被挂起任务vTaskResume()

vTaskResume(myTask02Handle);

    5. 中断中恢复被挂起任务vTaskResumeFromISR()

//注意:必须是单片机的中断回调函数中运行该API函数
//注意:该EXTI中断优先级不能大于某一个设置的阈值优先级

//例如EXTI端口触发中断回调函数
void HAL_EXTI_Callback(uint16_t GPIO_Pin){

    if(GPIO_Pin==GPIO_PIN_9) {//判断哪个引脚触发外部中断

        BaseType_t xYieldRequired;
        xYieldRequired = vTaskResumeFromISR(myTask02Handle);//中断中恢复挂起任务

        if(xYieldRequired == pdTRUE){//判断任务恢复后,是否需要进行任务切换
            portYIELD_FROM_ISR(xYieldRequired );//任务切换
        }

    }
}

    6. 获取任务的状态eTaskGetState()

/* 
    *eRunning: 运行态
    *eReady  : 就绪态
    *eBlocked: 阻塞态
    *eSuspended: 挂起态
    *eDeleted: 已被删除
    *eInvalid: 无效态
*/

//判断是否挂起态,挂起则恢复任务
if(eTaskGetState(myTask02Handle) == eSuspended){
    vTaskResume(myTask02Handle);
}

    7. 任务中进入退出临界区

vtaskENTER_CRITICAL();    //进入临界区后,不会被别的高优先级任务而打断该任务

......
......    //可以做别的操作,而不被高优先级任务打断
......

vtaskEXIT_CRITICAL();    //退出临界区,别的高优先级任务就会打断这个任务

    8. 中断中进入退出临界区

//注意:必须是单片机的中断回调函数中运行该API函数
//注意:该EXTI中断优先级不能大于某一个设置的阈值优先级


uint32_t save_status;


//例如EXTI端口触发中断回调函数
void HAL_EXTI_Callback(uint16_t GPIO_Pin){

    if(GPIO_Pin==GPIO_PIN_9) {//判断哪个引脚触发外部中断

       save_status = vtaskENTER_CRITICAL_FROM_ISR();    //中断级"进入"临界区

    }
}


//另外的函数中
vtaskEXIT_CRITICAL_FROM_ISR(save_status);    //中断级"退出"临界区

    9. 关闭中断portDISABLE_INTERRUPTS()

portDISABLE_INTERRUPTS();    //屏蔽优先级低于某一个阈值的中断

    10. 打开中断portENABLE_INTERRUPTS()

portENABLE_INTERRUPTS();    //打开优先级低于某一个阈值的中断
vTaskDelay 延时任务执行 vTaskDelay(xTicksToDelay)

延时的时钟节拍数

xSemaphoreCreateBinary

创建二值信号量 xSemaphoreCreateBinary(xQueue) 信号量句柄
xQueueCreate 创建一个队列 xQueueCreate(uxQueueLength, uxItemSize) 队列长度、队列项大小
xQueueSend 发送数据到队列 xQueueSend(xQueue, pvItemToQueue, xTicksToWait) 队列句柄、要发送的数据指针、等待时间
xQueueReceive 从队列接收数据 xQueueReceive(xQueue, pvBuffer, xTicksToWait) 队列句柄、接收缓冲区指针、等待时间
xEventGroupCreate 创建事件组 xEventGroupCreate()
xEventGroupSetBits 设置事件组中的位 xEventGroupSetBits(xEventGroup, uxBitsToSet) 事件组句柄、要设置的位
xEventGroupWaitBits 等待事件组中的位 xEventGroupWaitBits(xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait) 事件组句柄、等待的位、退出时是否清除、是否等待所有位、等待时间
xTimerCreate 创建一个定时器 xTimerCreate(pcTimerName, xTimerPeriod, uxAutoReload, pvTimerID, pxCallbackFunction) 定时器名称、定时周期、是否自动重载、定时器ID、回调函数指针
xTimerStart 启动定时器 xTimerStart(xTimer, xTicksToWait) 定时器句柄、等待时间

你可能感兴趣的:(STM32与GD32,单片机,嵌入式硬件,FreeRTOS,stm32)