os_task_set_priority
所属模块:任务管理 | 类型:任务优先级控制函数
函数简介
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);
}
注意事项
该函数涉及任务上下文搬运与调度切换,属于高风险内核接口。
不当使用可能导致任务状态不一致或调度异常。