MCU任务调度

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多任务开发时,怎么管理任务的调度
时间片,抢占方式,但是有些任务会长耗时;
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.youkuaiyun.com/m0_73502349/article/details/135227734
### MCU优先级调度机制与实现方法 #### 1. 中断优先级与任务优先级的关系 在MCU中,中断优先级和任务优先级是两个独立的概念。中断优先级决定了当外部事件触发时,哪个中断服务程序(ISR)会被优先执行[^1]。而任务优先级则由实时操作系统(RTOS),如FreeRTOS,用于决定哪些任务会在多任务环境中被优先调度并分配CPU资源[^2]。 #### 2. 嵌入式系统的调度核心 嵌入式实时操作系统的调度器负责管理和协调不同任务之间的运行次序。其核心在于调度算法的选择以及如何高效地完成任务切换。对于抢占式调度器而言,高优先级的任务一旦变为可运行状态,就会立即取代当前正在运行的较低优先级任务[^3]。 #### 3. 长耗时任务的管理策略 针对某些可能占用大量处理器时间的任务,可以通过以下几种方式进行优化: - 将长时间运行的任务拆分为若干较短的小任务来分批处理; - 对于确实无法缩短但仍需较长执行周期的任务,则适当延长为其分配的时间片长度; - 减少低频度且不紧急任务的工作频率或者让它们进入更深层次睡眠模式以释放更多可用计算能力给其他重要进程; - 利用硬件中断特性快速响应那些对外界变化敏感的小型作业单元而非依赖软件层面轮询检测机制; - 改善算法设计降低整体复杂度从而提升整个平台性能表现水平; - 定期监测各线程实际消耗情况以便灵活调整各自权重参数设置达到最佳平衡效果[^4]。 #### 4. FreeRTOS中的API支持 为了便于开发者获取关于特定线程的信息,在FreeRTOS里提供了诸如`uxTaskPriorityGet()`这样的接口函数允许查询指定目标对象当前所处级别大小值。这有助于应用程序更好地理解内部运作细节进而做出相应改进措施。 ```python import freertos task_handle = None # Assume this is a valid task handle or use NULL for the calling task. priority = freertos.uxTaskPriorityGet(task_handle) print(f"The priority of the specified task is {priority}.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值