📄 os_task.c.bak
字号:
#ifndef OS_MASTER_FILE
#include "ucos_ii.h"
#endif
/*
*******************************************************************************
* 任务产生函数 *
*******************************************************************************
*/
INT8U OSTaskCreate (void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT8U prio)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_STK *psp;
INT8U err;
#if OS_ARG_CHK_EN > 0 //任务产生优先级检查
if(prio>OS_LOWEST_PRIO)
{
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL(); //中断保护
if(OSTCBPrioTbl[prio]==(OS_TCB *)0) //如果优先级表为空产生任务,否则返回一个错误
{
OSTCBPrioTbl[prio] = (OS_TCB *)1; //首先占据空表
OS_EXIT_CRITICAL(); //退出中断保护
psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0); //初始化任务堆栈
err = OS_TCBInit(prio,psp); //系统TCB初始化
if(err == OS_NO_ERR)
{
OS_ENTER_CRITICAL();
OSTaskCtr++;
OS_EXIT_CRITICAL();
if (OSRunning == TRUE) //如果系统已经运行,产生任务时进行调度
{
OS_Sched();
}
}
else
{
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0; //产生任务不成功,释放优先级表
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
/*
*******************************************************************************
* 优先级改变函数 *
*******************************************************************************
*/
#if OS_TASK_CHANGE_PRIO_EN > 0
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
INT8U y_old;
#if OS_ARG_CHK_EN > 0 //任务改变优先级检查
if(oldprio>=OS_LOWEST_PRIO)
{
if(oldprio != OS_PRIO_SELF)
{
return (OS_PRIO_INVALID);
}
}
if(newprio >= OS_LOWEST_PRIO)
{
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if(OSTCBPrioTbl[newprio] != (OS_TCB *)0) //如果新优先级已经存在,返回错误代码
{
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
if(oldprio == OS_PRIO_SELF)
{
oldprio = OSTCBCur->OSTCBPrio; //得到当前优先级
}
ptcb = OSTCBPrioTbl[oldprio];
if(ptcb == (OS_TCB *)0) //如果老的优先级任务不存在,返回错误代码
{
OS_EXIT_CRITICAL();
return (OS_PRIO_ERR);
}
y = newprio >> 3;
bity = OSMapTbl[y];
x = newprio & 0x07;
bitx = OSMapTbl[x];
OSTCBPrioTbl[oldprio] = (OS_TCB *)0; //释放老的优先级连表
OSTCBPrioTbl[newprio] = ptcb; //设置新的优先级连表
y_old = ptcb->OSTCBY;
if((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0x00) //清除老优先级任务就绪状态
{
OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
if(OSRdyTbl[y_old] == 0x00) //如果老优先级就绪,没有别的任务就绪,清除老优先级就绪组
{
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
OSRdyGrp |= bity; //设置新优先级任务就绪
OSRdyTbl[y] |= bitx;
}
ptcb->OSTCBPrio = newprio; //设置新优先级相关变量
ptcb->OSTCBY = y;
ptcb->OSTCBX = x;
ptcb->OSTCBBitY = bity;
ptcb->OSTCBBitX = bitx;
OS_EXIT_CRITICAL();
OS_Sched();
return (OS_NO_ERR);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -