📄 ggt_kernel.c
字号:
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskPushDelay(_pOSTask pTask)
{
pTask->State = OS_STATE_TSK_DELAY;
pTask->StateValue = pTask->PrioTick;
ListAppend((void *)(&pOSTskDelay), (void *)pTask);
}
/****************************************************************************************************
** 函数名: OSTaskPushReady
** 描 述: 将任务放进就绪队列,并设相应标志
** 输 入: pTask:指向任务空间的指针
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskPushReady(_pOSTask pTask)
{
pTask->State = OS_STATE_TSK_READY;
ListAppend((void *)(&pOSTskReady), (void *)pTask);
}
/****************************************************************************************************
** 函数名: OSTaskDelay
** 描 述: 将任务迟延指定的时间
** 输 入: Time:迟延时长,单位:毫秒
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskDelay(UINT32 Time)
{
OSIRQLock();
OSTaskPushDelay(pOSTskNow);
pOSTskNow->StateValue = (Time * OSGetTick()) / 1000;
OSTaskIsNULLLoadDef();
OSTaskSW();
OSIRQUnlock();
}
/****************************************************************************************************
** 函数名: OSTaskDispatch
** 描 述: 进行任务调度,函数始终保持就绪队列有任务
** 输 入: 无
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskDispatch(void)
{
_pOSTask pTask, p;
pTask = pOSTskDelay;
while(pTask)
{
pTask->StateValue--;
if(pTask->StateValue <= 0)
{
p = pTask;
pTask = pTask->pNext;
ListDelete((void *)(&pOSTskDelay), (void *)p);
OSTaskPushReady(p);
}else
pTask = pTask->pNext;
}
//如果有新任务,则让贤,否则还是我当王
if(pOSTskReady)
OSTaskPushDelay(pOSTskNow);
else
OSTaskPushReady(pOSTskNow);
}
/****************************************************************************************************
** 函数名: OSTaskIsNULLLoadDef
** 描 述: 当要立即进行任务切换时,判断就绪队列是否为空,是则加载默认任务
** 输 入: 无
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskIsNULLLoadDef(void)
{
if(!pOSTskReady)
{
ListDelete((void *)(&pOSTskDelay), (void *)pOSTskMain);
OSTaskPushReady(pOSTskMain);
}
}
/****************************************************************************************************
** 函数名: OSTaskInit
** 描 述: 在进入用户初始化之前,必须调用本函数初始化任务空间
** 输 入: 无
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskInit(void)
{
INT32 i;
pOSBoxMsg = (UINT32 *)OSGetBoxMsg();
BoxInit(pOSBoxMsg, sizeof(_BoxHead) + OSGetSumMsg() * sizeof(_OSMsg), sizeof(_OSMsg));
pOSTask = &(((_pOSBoxTask)OSGetBoxTask())->Task[0]);
for(i = 0; i < OSGetSumTask(); i++)
pOSTask[i].ID = i + 1;
BoxInit(OSGetBoxTask(), sizeof(_BoxHead) + OSGetSumTask() * sizeof(_OSTask), sizeof(_OSTask));
BoxInit(OSGetBoxStack(), sizeof(_BoxHead) + OSGetSumTask() * OSGetSizeStack(), OSGetSizeStack());
pOSTskMain = &(pOSTask[OSGetSumTask()]);
OSTaskDataInit(pOSTskMain);
pOSTskMain->PrioTick = OSTaskGetPrioTick(255);
pOSTskMain->pStack = OSStackAlloc();
pOSTskMain->pTskStack = pOSTskMain->pStack;
//设置当前任务为默认任务
pOSTskNow = pOSTskMain;
}
/****************************************************************************************************
** 函数名: OSInit
** 描 述: 系统初始化函数
** 输 入: 无
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2008年1月12日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSInit(void)
{
OSTaskInit();
OSTimerInit();
}
/****************************************************************************************************
** 函数名: OSTaskMsgPost
** 描 述: 消息发送函数,不等待目标处理,不管收到与否
** 输 入: TaskID:目标任务的ID,
Msg:消息内容,
wParam:消息参数
lParam:消息参数
** 输 出: 返回0表示失败,1:表示成功,2:表示对方进入处理队列
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人: 卢益贵
** 日 期: 2008年1月8日
** 说 明:
** 原代码:
BOOL OSTaskMsgPost(const OS_ID TaskID, const UINT32 Msg, const UINT32 wParam, const UINT32 lParam)
{
BOOL R;
_pOSMsg pMsg;
_pOSTask pTask;
OSIRQLock();
pMsg = (_pOSMsg)BoxAlloc(pOSBoxMsg);
R = pMsg != NULL;
if(R)
{
pMsg->Sender = pOSTskNow->ID;
pMsg->Msg = Msg;
pMsg->wParam = wParam;
pMsg->lParam = lParam;
pTask = &pOSTask[TaskID - 1];
ListAppend((void *)(&(pTask->pMsg)), pMsg);
//如果对方正在等待,则加载他
if(OS_STATE_TSK_WAIT_MSG == pTask->State)
OSTaskPushReady(pTask);
}
OSIRQUnlock();
return(R);
}
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
INT32 OSTaskMsgPost(const OS_ID TaskID, const UINT32 Msg, const UINT32 wParam, const UINT32 lParam)
{
INT32 R;
_pOSMsg pMsg;
_pOSTask pTask;
OSIRQLock();
pMsg = (_pOSMsg)BoxAlloc(pOSBoxMsg);
if(pMsg != NULL)
{
pMsg->Msg = Msg;
pMsg->wParam = wParam;
pMsg->lParam = lParam;
pTask = &pOSTask[TaskID - 1];
ListAppend((void *)(&(pTask->pMsg)), pMsg);
//如果对方正在等待,则加载他
if(OS_STATE_TSK_WAIT_MSG == pTask->State)
{
pTask->State = OS_STATE_TSK_READY;
//优先加入队列头
ListFirst((void *)(&pOSTskReady), (void *)pTask);
R = 2;
}else
R = 1;
}else
R = 0;
OSIRQUnlock();
return(R);
}
/****************************************************************************************************
** 函数名: OSTaskMsgPeek
** 描 述: 消息窥探
** 输 入: pMsg:指向消息结构的指针
** 输 出: 返回TRUE表示有消息
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSTaskMsgPeek(_pMsg pMsg)
{
BOOL R;
_pOSMsg pOSMsg;
OSIRQLock();
pOSMsg = pOSTskNow->pMsg;
R = (NULL != pOSMsg);
if(R)
{
*pMsg = *((_pMsg)(&(pOSMsg->Msg)));
pOSTskNow->pMsg = (pOSTskNow->pMsg)->pNext;
BoxFree(pOSBoxMsg, pOSMsg);
}
OSIRQUnlock();
return(R);
}
/****************************************************************************************************
** 函数名: OSTaskMsgWait
** 描 述: 消息等待函数,没有消息不返回,一直挂起等待
** 输 入: pMsg:指向消息结构的指针
** 输 出: 返回TRUE表示有消息
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSTaskMsgWait(_pMsg pMsg)
{
DoWait:
if(OSTaskMsgPeek(pMsg))
{
return(TRUE);
}else
{
pOSTskNow->State = OS_STATE_TSK_WAIT_MSG;
OSTaskIsNULLLoadDef();
OSTaskSW();
goto DoWait;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -