F1 freeRTOS API

官方API

1.动态创建任务

#include "FreeRTOS.h"
#include "task.h"

/*
功能:动态创建一个任务,所需的RAM会自动从FreeRTOS堆中分配
参数:
参数1:任务实现函数指针(函数名)
参数2:任务名称(字符串)
参数3:任务堆栈大小,单位为字
参数4:任务传入参数
参数5:任务优先级
参数6:任务句柄
返回值:pdPASS:创建成功	errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:创建失败,堆空间不足

注意:configSUPPORT_DYNAMIC_ALLOCATION必须在FreeRTOSConfig.h中设置为1,或者未定义(在这种情况下,
它将默认为1),这个RTOS API函数才会可用
*/
BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            configSTACK_DEPTH_TYPE usStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                          );

2.静态创建任务

#include "FreeRTOS.h"
#include "task.h"

/*
功能:静态创建一个任务,所需的RAM会自动从FreeRTOS堆中分配
参数:
参数1:任务实现函数指针(函数名)
参数2:任务名称(字符串)
参数3:任务堆栈大小,单位为字
参数4:任务传入参数
参数5:任务优先级
参数6:任务堆栈指针
参数7:任务控制块指针
返回值:NULL:创建失败	!=NULL:任务句柄

注意:在FreeRTOSConfig.h中必须将configSUPPORT_STATIC_ALLOCATION设置为1,这个RTOS API函数才会可用。
*/
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 );

3.挂起任务

#include "FreeRTOS.h"
#include "task.h"

/*
功能:挂起任务
参数:任务句柄,当传入NULL的时候,则挂起任务自己
返回值:无

注意:INCLUDE_vTaskSuspend必须定义为1才能使用该功能
*/
void vTaskSuspend( TaskHandle_t xTaskToSuspend );

4.恢复任务

#include "FreeRTOS.h"
#include "task.h"

/*
功能:恢复任务
参数:任务句柄
返回值:无

注意:INCLUDE_vTaskSuspend必须定义为1才能使用该功能
*/
void vTaskResume( TaskHandle_t xTaskToResume );

5.在中断中恢复任务

#include "FreeRTOS.h"
#include "task.h"

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );

6.获取任务优先级

UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );

7.设置任务优先级

void vTaskPrioritySet( TaskHandle_t xTask,
                       UBaseType_t uxNewPriority );

8.系统延时

#include "FreeRTOS.h"
#include "task.h"

/*
功能:使任务进入阻塞态,根据传入的参数延时多少个tick(系统节拍)
参数:延时周期;
	系统节拍周期为1000Hz,延时周期时基就是1ms
	系统节拍周期为100Hz,延时周期时基就是10ms
	宏pdMS_TO_TICKS()可以把ms转换为tick
返回值:无

注意:INCLUDE_vTaskDelay必须置1
*/
void vTaskDelay( const TickType_t xTicksToDelay );

9.绝对延时

#include "FreeRTOS.h"
#include "task.h"

/*
功能:使任务进入阻塞态,直到一个绝对延时时间到达
参数:
参数1:记录上一次任务唤醒系统节拍值,通过xTaskGetTickCount函数获取
参数2:系统延时周期(tick)
返回值:无

注意:INCLUDE_vTaskDelayUnyil必须置1,CubeMX默认为0
*/
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,
                      const TickType_t xTimeIncrement );
  • 注意

相对延时:即当在系统功能复杂的情况下我们想要延时10ms的时候,有可能实际延时大于10ms,因为可能在延时之前发生了中断,而中断的执行需要时间

绝对延时:即使发生中断,延时仍然为10ms

  • 相对延时图解

  • 绝对延时图解

  • 示例
//此处延时7s
for(;;)
{
    HAL_Delay(2000);
    printf("Task is Runing!\r\n");
    osDelay(5000);
}

//次数延时5s
TickType_t WakeTime = xTaskGetTickCount();
for(;;)
{
    HAL_Delay(2000);
    printf("Task is Runing!\r\n");
    vTaskDelayUntil(&WakeTime, 5000);
}

10.获取系统节拍值

#include "FreeRTOS.h"
#include "task.h"

/*
功能:获取系统节拍值,从调度器开启时候就开始计数
参数:无
返回值:当前系统节拍值
*/
volatile TickType_t xTaskGetTickCount( void );

11.挂起调度器

  • 系统维护一个计数uxSchedulerSuspended,每挂起一次该值+1,系统初始化的时候为0
  • 当它大于0时候表示禁止调度,等于0则打开调度(允许调度)
/*
功能:挂起调度锁,即挂起所有任务
*/
void vTaskSuspendAll( void );

12.恢复调度器

/*
功能:恢复调度锁,即恢复所有任务

注意:xTaskResumeAll()只恢复调度程序。它不会取消之前通过调用vTaskSuspend()暂停的任务
*/

BaseType_t xTaskResumeAll( void );

13.创建消息队列

#include "FreeRTOS.h"
#include "queue.h"

/*
功能:创建一个消息队列并返回消息队列句柄
参数:
参数1:队列一次可容纳消息的最大长度
参数2:队列中每个消息体大小(由此可分析该数组为多为数组或者结构体数组)
返回值:NUll:创建失败 Any other value:创建成功,返回消息句柄

注意:队列可用于任务与任务之间的通信,也可用于中断与任务之间的通信,可在调度器开启之前创建消息队列
*/
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,
                             UBaseType_t uxItemSize );

14.发送消息

#include "FreeRTOS.h"
#include "queue.h"

/*
功能:在任务中往消息队列里面传入消息(其中xQueueSend等价于xQueueSendToBack入到队尾,xQueueSendToFront入到队头),
	之所以可从队头插入是以为要处理某些紧急消息,满足实时性
参数:
参数1:消息队列句柄
参数2:要发送的消息的地址
参数3:阻塞等待时间
返回值:pdPASS:发送成功 errQUEUE_FULL:队列满,发送失败
*/
BaseType_t xQueueSend(
                            QueueHandle_t xQueue,
                            const void * pvItemToQueue,
                            TickType_t xTicksToWait
                         );

15.从中断中发送消息

#include "FreeRTOS.h"
#include "queue.h"

/*
功能:在中断中发送消息至消息队列(其中xQueueSendFromISR等价于xQueueSendToBackFromISR入到队尾,xQueueSendToFrontFromISR入到队头),之所以可从队头插入是以为要处理某些紧急消息,满足实时性
参数:
参数1:消息队列句柄
参数2:要发送的消息的地址
参数3:NULL
返回值:pdPASS:发送成功 errQUEUE_FULL:队列满,发送失败

注意:调用此函数会触发上下文切换(当前被中断的任务优先级低于解除阻塞的任务);在开启调度器之前不能调度此函数;在中断中发送消息不能被阻塞,因为中断不是任务
*/
BaseType_t xQueueSendFromISR
           (
               QueueHandle_t xQueue,
               const void *pvItemToQueue,
               BaseType_t *pxHigherPriorityTaskWoken
           );

16.接收消息

#include "FreeRTOS.h"
#include "queue.h"

/*
功能:在任务中读取消息队列
参数:
参数1:消息队列句柄
参数2:接收消息的缓冲区
参数3:阻塞等待时间
返回值:pdTRUE:接收成功  pdFALSE:接收失败,消息队列为NULL
*/
BaseType_t xQueueReceive(
                               QueueHandle_t xQueue,
                               void *pvBuffer,
                               TickType_t xTicksToWait
                            );

17.创建软件定时器

#include "FreeRTOS.h"
#include "timers.h"

/*
功能:创建一个软件定时器,并返回一个软件定时器的句柄,此处只是创建了软件定时器,并没有启动软件定时器
参数:
参数1:定时器名称(调试使用)
参数2:定时周期值(单位为tick)
参数3:自动装载标志位(pdTURE/pdFALSE)
参数4:软件定时器标识符(多态特性,即多个定时器调用同一个回调函数,根据这个标识符区分不同的软件定时器)
参数5:软件定时器回调函数(void vCallbackFunction( TimerHandle_t xTimer );)
返回值:NULL:创建失败,否则创建成功,返回事件标志组句柄
*/
TimerHandle_t xTimerCreate
                 ( const char * const pcTimerName,
                   const TickType_t xTimerPeriod,
                   const UBaseType_t uxAutoReload,
                   void * const pvTimerID,
                   TimerCallbackFunction_t pxCallbackFunction );

18.开启软件定时器

#include "FreeRTOS.h"
#include "timers.h"

/*
功能:启动软件定时器
参数:
参数1:软件定时器句柄
参数2:发送软件定时器命令,阻塞等待时间,其内部调用的消息队列
返回值:pdPASS:消息队列已发送	pdFALL:消息队列已满

注意:configUSE_TIMERS必须置1
*/
BaseType_t xTimerStart( TimerHandle_t xTimer,
                            TickType_t xBlockTime );

19.重启软件定时器

#include "FreeRTOS.h"
#include "timers.h"

/*
功能:重启软件定时器.如果软件定时器已经启动,则重新计算超时时间;如果没启动,则重启软件定时器
参数:
参数1:软件定时器句柄
参数2:发送软件定时器命令,阻塞等待时间,其内部调用的消息队列
返回值:pdPASS:消息队列已发送	pdFALL:消息队列已满

注意:configUSE_TIMERS必须置1
*/
BaseType_t xTimerReset( TimerHandle_t xTimer,
                            TickType_t xBlockTime );

20.获取软件定时器标识符

#include "FreeRTOS.h"
#include "timers.h"

/*
功能:获取软件定时器标识符值
参数:软件定时器句柄
返回值:软件定时器标识符
*/
void *pvTimerGetTimerID( TimerHandle_t xTimer );

21.改变软件定时器周期

#include "FreeRTOS.h"
#include "timers.h"

/*
功能:改变软件定时器周期,如果软件定时器未启动,会启动软件定时器
参数:
参数1:软件定时器句柄
参数2:新的定时周期
参数3:阻塞等待时间
返回值:pdPASS:消息队列已发送	pdFALL:消息队列已满
*/
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer,
                                   TickType_t xNewPeriod,
                                   TickType_t xBlockTime );
posted @ 2021-08-05 23:10  MHDSG  阅读(92)  评论(0)    收藏  举报