MCU任务调度

本文介绍了在多任务开发中如何有效地管理任务调度,包括长任务拆分、时间片分配、优先级调整、中断方式以及优化算法。重点讲解了FreeRTOS中的相关API函数,如任务优先级获取和设置、任务状态获取等,以提升系统的效率和响应速度。
摘要由CSDN通过智能技术生成

多任务开发时,怎么管理任务的调度
时间片,抢占方式,但是有些任务会长耗时;
1,首先长耗时的任务,可能需要分割成多个短一些的任务
2,耗时长一点的任务,可以增加以下时间片时间;
3,对于低优先级,运动次数不多的任务,可以增加他的休眠时间,给出更多的更多的时间片出来
4,对于响应比较频繁而且快小的任务,可以尝试使用中断方式
5,对于长耗时的任务,优化算法和数据结构,减少对内存的使用和计算量,可以提高系统效率
6,实时监控任务的运行状态和响应时间,根据实际情况动态的调整任务的优先级和时间片 任务查看FreeRTOS+Trace:实时任务跟踪 ++ xTaskGetInfo等
1.API相关函数介绍
1)UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )
功能:获得任务优先级 使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1
形参:任务句柄,NULL代表任务自身
返回值:任务优先级数值

2)void vTaskPrioritySet( TaskHandle_t xTask , UBaseType_t uxNewPriority )
功能:改变某个任务的任务优先级,使用该函数需将宏 INCLUDE_vTaskPrioritySet 为 1
形参:
参数1:任务句柄,NULL代表任务自身
参数2:需要设置的任务优先级

3)UBaseType_t uxTaskGetNumberOfTasks( void )
功能:此函数用于获取系统中任务的任务数量
返回值:系统中任务的数量

4)UBaseType_t uxTaskGetSystemState(
TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime
)
功能: 此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
形参:
形参1:指向TaskStatus_t 结构体数组首地址
形参2:接收信息的数组大小
形参3:系统总运行时间,为NULL 则省略总运行时间值
返回值:获取信息的任务数量
typedef struct xTASK_STATUS
{
TaskHandle_t xHandle; /* 任务句柄 /
const char * pcTaskName; / 任务名 /
UBaseType_t xTaskNumber; / 任务编号 /
eTaskState e CurrentState; / 任务状态 /
UBaseType_t uxCurrentPriority; / 任务优先级 /
UBaseType_t uxBasePriority; / 任务原始优先级*/
configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* 任务运行时间*/
StackType_t * pxStackBase; /* 任务栈基地址 /
configSTACK_DEPTH_TYPE usStackHighWaterMark; / 任务栈历史剩余最小值 */
} TaskStatus_t;

5)void vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t * pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState )
功能:此函数用于获取指定的单个任务的状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1
形参:
形参1:指定获取信息的任务的句柄
形参2:接收任务信息的变量
形参3:任务栈历史剩余最小值,
当为“pdFALSE” 则跳过这个步骤,
当为“pdTRUE”则检查历史剩余最小堆栈
形参4:任务状态,可直接赋值,如想获取代入“eInvalid”
typedef enum
{
eRunning = 0, /* 运行态 /
eReady / 就绪态 /
eBlocked, / 阻塞态 /
eSuspended, / 挂起态 /
eDeleted, / 任务被删除 /
eInvalid / 无效 */
} eTaskState;

6)TaskHandle_t xTaskGetCurrentTaskHandle( void )
功能:此函数用于获取当前任务的任务句柄, 使用该函数需将宏 INCLUDE_xTaskGetCurrentTaskHandle 置 1
形参:当前任务的任务句柄

7)TaskHandle_t xTaskGetHandle(const char * pcNameToQuery)
功能:此函数用于通过任务名获取任务句柄 , 使用该函数需将宏 INCLUDE_xTaskGetHandle 置 1
形参:任务名
返回值:任务句柄

8)UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )
功能:此函数用于获取指定任务的任务栈历史最小剩余堆栈;使用该函数需将宏 INCLUDE_uxTaskGetStackHighWaterMark 置 1
形参:任务名
返回值:任务栈的历史剩余最小值

9)eTaskState eTaskGetState(TaskHandle_t xTask)
功能:此函数用于查询某个任务的运行状态,使用此函数需将宏 INCLUDE_eTaskGetState 置1
形参:待获取状态任务的任务句柄
返回值: 任务状态

void vTaskList(char * pcWriteBuffer)
功能:此函数用于以“表格”的形式获取系统中任务的信息 ;
使用此函数需将宏 configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1
Name : 创建任务的时候给任务分配的名字。
State : 任务的壮态信息, B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态
Priority :任务优先级。
Stack : 任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。
Num : 任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区

               原文链接:https://blog.csdn.net/m0_73502349/article/details/135227734
在ESP32上使用FreeRTOS进行任务调度非常简单。首先,你需要创建任务并设置其参数,例如任务函数、任务优先级等。然后,你可以使用调试工具来监视和分析任务的执行情况。 在创建任务之前,你需要准备好硬件和软件。硬件方面,你需要一个NodeMCU ESP32-S V3.0开发板和一条数据线。软件方面,你需要安装vscode和ESP-IDF的vscode扩展。 在代码,你可以使用FreeRTOS的API函数来创建和管理任务。任务的创建需要指定任务函数,该函数将在任务被调度时执行。你还可以设置任务的优先级以及其他参数。 在任务调度期间,FreeRTOS会根据任务的优先级来决定执行哪个任务。较高优先级的任务将优先执行,而较低优先级的任务将在较高优先级任务执行完毕后才执行。这样可以确保任务按照一定的顺序和优先级进行调度,以满足系统的需求。 总结来说,使用ESP32上的FreeRTOS进行任务调度需要先创建任务并设置参数,然后使用调试工具进行监视和分析。硬件和软件准备也是必要的。最后,在任务调度期间,任务的执行顺序将根据其优先级确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ESP32 FreeRTOS-任务的创建与删除 (1)](https://blog.csdn.net/believe666/article/details/127175049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [ESP32-IDF开发实例-FreeRTOS任务优先级](https://blog.csdn.net/wujuxKkoolerter/article/details/117655266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值