os_task_set_priority

所属模块:任务管理 | 类型:任务优先级控制函数

API Metadata

函数ID:os_task_set_priority
模块:task
类型:priority migration / task transform
嵌套深度:1

函数简介

os_task_set_priority 用于动态修改任务优先级。

支持普通任务优先级调整,以及普通任务与高速任务之间的转换。

在优先级变化过程中,系统会自动搬运任务上下文并触发调度切换,确保调度一致性。

函数原型

char os_task_set_priority(unsigned char id, unsigned char pr);

参数说明

参数 说明
id 任务ID(普通任务或高速任务)
pr 目标优先级(0-7 普通优先级,8 高优先级)

返回值

0:成功
-1:失败
>0:新任务ID(发生任务形态转换时)

源码实现

char os_task_set_priority(unsigned char id, unsigned char pr) { char i,j,K,x; K = IE; EA = 0; if((id > OS_PROCESS_MAX + 1) || (pr >= OS_SCHED_LEVEL_MAX - 1)) { IE = K; return -1; } if(OS_TASK_EVENT[id] & OS_EVENT_DELETE_REQ) { IE = K; return -1; } if(id < OS_PROCESS_MAX) { if(OS_PROCESS_OK[id] == 0) { IE = K; return -1; } if((OS_TASK[id].state != READY) && (OS_TASK[id].state != DEAD)) { IE = K; return -1; } if(id == 0) { IE = K; return -1; } } /* ===== 普通任务 ===== */ if(id < OS_PROCESS_MAX && pr < (OS_SCHED_LEVEL_MAX - 2)) { OS_PROCESS_OK[id] &= 0xF1; pr <<= 1; OS_PROCESS_OK[id] |= pr; OS_SCHED_REASON = 1; IE = K; TF0 = 1; return 0; } /* ===== 普通 → 高速任务 ===== */ else if(id < OS_PROCESS_MAX && pr == (OS_SCHED_LEVEL_MAX - 2)) { i = 0; if(OS_KUAI_SP[0] == 0) i = 1; else if(OS_KUAI_SP[1] == 0) i = 2; if(i != 0) { i--; if(OS_CURRENT_TASK == id) { OS_CURRENT_TASK = OS_PROCESS_MAX + i; } OS_HRTOS = OS_JINCHENG_SP[id]; OS_KUAI_SP[i] = OS_HRTOS; OS_HRTOS = OS_JINCHENG_JILU_SP[id]; OS_SP_KUAI_BEI[i] = OS_HRTOS; OS_HRTOS = (OS_PROCESS_OK[id] >> 4) & 7; OS_SP_KUAI_BEI2[i] = OS_HRTOS; for(j = 0; j < OS_KUAI_SHENDU; j++) { OS_FAST_CONTEXT[i][j] = OS_TASK_CONTEXT[id][j]; } OS_SCHED_REASON = 1; IE = K; TF0 = 1; return i + OS_PROCESS_MAX; } IE = K; return -1; } /* ===== 高速 → 普通任务 ===== */ else if(id >= OS_PROCESS_MAX && pr < (OS_SCHED_LEVEL_MAX - 2)) { for(i = 0; i < OS_PROCESS_MAX; i++) { if(OS_PROCESS_OK[i] == 0) { break; } } if(i < OS_PROCESS_MAX) { if(OS_CURRENT_TASK == id) { OS_CURRENT_TASK = i; } id -= OS_PROCESS_MAX; OS_PROCESS_OK[i] = (pr << 1); OS_SCHED_REASON = 1; IE = K; TF0 = 1; return i; } IE = K; return -1; } /* ===== 高速 → 高速 ===== */ if((id >= OS_PROCESS_MAX) && (pr == (OS_SCHED_LEVEL_MAX - 2))) { IE = K; return 0; } IE = K; return -1; }

使用示例

void demo_prio() { os_task_set_priority(2, 5); }

注意事项

该函数涉及任务上下文搬运与调度切换,属于高风险内核接口。 不当使用可能导致任务状态不一致或调度异常。

相关推荐