ESP32 - FreeRTOS

本文档详细介绍了ESP32上运行的FreeRTOS任务创建和管理的相关函数,包括`xTaskCreatePinnedToCore`、`xTaskCreate`、`xTaskCreateStatic`以及任务删除、延时、挂起等操作。重点讲解了如何指定CPU运行任务,以及如何通过任务句柄进行任务管理。此外,还提到了任务的优先级设置和内存管理,为ESP32的实时操作系统应用提供了基础指导。
摘要由CSDN通过智能技术生成

本文为阅读esp32官方文档所做的一些笔记,原文如下。
供学习使用,因为本人能力有限,可能有不符合事实的内容,
敬请指正!
原文地址

概述

主要介绍esp32上运行的freertos的类型、函数、宏定义等等。
esp32上的freertos是基于FreeRTOS v10.2.0
详细信息见
ESP-IDF FreeRTOS SMP Changes
ESP-IDF FreeRTOS Additions

TASK API

头文件

freertos/include/freertos/task.h

类型定义

函数

注意:函数的相同内容的描述详细程度是递减的,相同的描述后面的内容可能不会重复提起,请顺序阅读。

任务创建

//创建任务 与xTaskCreate类似 但是多cpu情况下 他可以指定CPU运行
//返回值:pdPASS 标志创建成功
BaseType_t xTaskCreatePinnedToCore(
//任务入口函数指针 void (*func)(void*)
TaskFunction_t pvTaskCode, 
//任务的表述名称 名称长度由MAX_TASK_NAME_LEN宏定义指定 默认为16
const char *constpcName, 
//任务栈深度 与vanilla FreeRTOS不同 太小会溢出
const uint32_t usStackDepth,
//任务函数的参数指针
 void *const pvParameters, 
 //优先级 要设置优先级为2 应该设置为(2 | portPRIVILEGE_BIT) 
 //其中portPRIVILEGE_BIT为一个宏定义常量
 UBaseType_t uxPriority, 
//传入一个TaskHandle_t的变量 函数将为其赋值 用来执行挂起 删除等操作
 TaskHandle_t *const pvCreatedTask, 
 //指定cpu运行 如果设置为tskNO_AFFINITY 则表示不指定cpu
 const BaseType_t xCoreID
 )


//创建一个任务 并加到就绪列表中
/*
在freertos的内部实现中,每个任务有两块内存空间,其中第一块作为任务的
数据存储块,另一块作为任务的栈。如果用xTaskCreate来创建任务的话这两块
内存空间就会自动动态地分配。如果用xTaskCreateStatic函数来创建任务,那么
用户需要自行为任务分配内存,因此xTaskCreateStatic可以让一个任务在创建时
不需要动态分配内存。
*/
static BaseType_t xTaskCreate(
//任务函数指针
TaskFunction_t pvTaskCode, 
//任务名称
const char *const pcName, 
//栈深度 不要太小 会溢出
const uint32_t usStackDepth, 
//任务函数参数指针
void *const pvParameters, 
//优先级 要设置优先级为2 应该设置为(2 | portPRIVILEGE_BIT) 
UBaseType_t uxPriority, 
//传入一个TaskHandle_t的变量 函数将为其赋值 用来执行挂起 删除等操作
TaskHandle_t *const pvCreatedTask
)

//示例:
//任务函数
// Task to be created.
void vTaskCode( void * pvParameters )
{
 for( ;; )
 {
     // Task code goes here.
 }
}

// Function that creates a task.
void vOtherFunction( void )
{
static uint8_t ucParameterToPass;
TaskHandle_t xHandle = NULL;

 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
 // the new task attempts to access it.
 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
    configASSERT( xHandle );

 // Use the handle to delete the task.
    if( xHandle != NULL )
    {
     vTaskDelete( xHandle );
    }
}


//创建任务函数 
//他的栈空间和Task Buffer是由用户自己申请并作为参数传入的
//同样也可以选择CPU运行 
//当pxStackBuffer和pxTaskBuffer都不为NULL时返回pdPASS表示成功
//否则创建失败 返回errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
//注:官方文档此函数返回类型是TaskHandle_t 
//    此时创建成功是应该返回的是指向任务的指针
TaskHandle_t xTaskCreateStaticPinnedToCore(
TaskFunction_t pvTaskCode, 
const char *const pcName,
const uint32_t ulStackDepth, 
void *const pvParameters, 
UBaseType_t uxPriority, 
//用户自己申请的空间
StackType_t *const pxStackBuffer, 
StaticTask_t *const pxTaskBuffer, 
//tskNO_AFFINITY表示所有cpu皆可运行此任务
const BaseType_t xCoreID
)


//创建一个任务并加到就绪列表中
//与xTaskCreate的区别就是要自己分配内存
static TaskHandle_t xTaskCreateStatic(
TaskFunction_t pvTaskCode, 
const char *constpcName, 
const uint32_t ulStackDepth, 
void *const pvParameters, 
UBaseType_t uxPriority, 
//用户分配堆栈内存
StackType_t *const pxStackBuffer, 
StaticTask_t *const pxTaskBuffer
)

任务管理



//将任务删除并释放其占用的内存资源等等
//被删除的任务将会在就绪、阻塞、挂起和事件队列中被删除
//参数xTaskToDelete就是在创建任务是返回的TaskHandle_t类型的指针
void vTaskDelete(TaskHandle_t xTaskToDelete)




//将任务延时若干个时钟,让出cpu待延时结束后重新执行
//注意单位是时钟 不是us也不是ms 需要换算
//延时 100ms 则xTicksToDelay应该设为 100/portTICK_PERIOD_MS
/*
xTaskDelay是相对性的延时,对于需要定时执行的任务,其效果并不好
可以使用vTaskDelayUntil来替代
*/
void vTaskDelay(const TickType_t xTicksToDelay)

//示例
void vTaskFunction( void * pvParameters )
{
	// Block for 500ms.
	const TickType_t xDelay = 500 / portTICK_PERIOD_MS;

    for( ;; )
    {
        // Simply toggle the LED every 500ms, blocking between each 	toggle.
        vToggleLED();
        vTaskDelay( xDelay );
    }
}



/*
将任务延时到一个指定的时间 适合定期的任务
参数:
pxPreviousWakeTime:用来存储上次的时间 第一次初始化时需要调用xTaskGetTickCount () 来获取当前时间
xTimeIncrement:时间增量,也就是设置任务执行的周期
*/
void vTaskDelayUntil(TickType_t *const pxPreviousWakeTime, const TickType_t xTimeIncrement)
//示例:
// Perform an action every 10 ticks.
void vTaskFunction( void * pvParameters )
{
	TickType_t xLastWakeTime;
	const TickType_t xFrequency = 10;
    // Initialise the xLastWakeTime variable with the current time.
    xLastWakeTime = xTaskGetTickCount ();
    for( ;; )
    {
        // Wait for the next cycle.
        vTaskDelayUntil( &xLastWakeTime, xFrequency );
        // Perform action here.
    }
}




//将正在延时挂起的函数重新加入就绪队列
BaseType_t xTaskAbortDelay(TaskHandle_tx Task)


//获取任务的优先级
UBaseType_t uxTaskPriorityGet(const TaskHandle_t xTask)


//获取任务的状态
/*
返回值可以为以下之一
eRunning
eReady
eBlocked
eSuspended
eDeleted
eInvalid
*/
eTaskState eTaskGetState(TaskHandle_t xTask)




/*
获取任务的详细信息
*/
void vTaskGetInfo(
TaskHandle_t xTask, 
TaskStatus_t *pxTaskStatus, 
BaseType_t xGetFreeStackSpace, 
eTaskState eState
)


//设置任务的优先级
void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority)
//示例  当xTask为NULL时则修改自己的优先级
void vAFunction( void )
{
TaskHandle_t xHandle;
 // Create a task, storing the handle.
 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
 // ...
 // Use the handle to raise the priority of the created task.
 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
 // ...
 // Use a NULL handle to raise our priority to the same value.
 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
}


//挂起一个任务 当xTaskToSuspend为NULL时表示挂起自己
void vTaskSuspend(TaskHandle_t xTaskToSuspend)

//重新运行挂起的任务
void vTaskResume(TaskHandle_t xTaskToResume)

//从中断中重新运行
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)

//挂起所有的任务 实际上是将调度器挂起
//注意:若调度器已经处于挂起状态不能再挂起调度器
void vTaskSuspendAll(void)

//让调度器重新运行
BaseType_t xTaskResumeAll(void)

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值