📄 ggt_kernel.c
字号:
/****************************************************************************************************
** Gogoto OS
** (c) Copyright 2007-2008, luyigui(卢益贵)
** All Rights Reserved
** V1.00.0
**
** 狗狗兔嵌入式多任务系统(基于消息机制)
** 绿城代码、GGT-OS、Gogoto OS、狗狗兔嵌入式、狗狗兔系统
** QQ:48092788
**
**------------------文件信息------------------------------------------------------------------------
** 文件名: GGT_Kernel.c
** 创建人: 卢益贵
** 日 期: 2007年12月8日
** 版 本: V1.00.0
** 描 述: Gogoto OS 与CPU无关的核心代码部分
**
**------------------修改记录------------------------------------------------------------------------
** 修改人: 卢益贵
** 版 本: V1.20.0
** 日 期: 2008年1月30日
** 描 述:
**
****************************************************************************************************/
#include "GGT_OS.h"
#include "GGT_CPU.h"
#include "GGT_Func.h"
#include "GGT_Kernel.h"
_pOSTask
//系统默认任务变量,指向默认任务的数据区,默认任务在系统出世化时,具有最高优先级别,
//初始化完了以后,默认任务进行永久的休眠(挂起),直到用户任务都挂起后,担当工作的角色
pOSTskMain = NULL,
//当前任务变量
pOSTskNow = NULL,
//就绪任务队列变量
pOSTskReady = NULL,
//迟延等待任务队列变量
pOSTskDelay = NULL;
//指向任务数据机构数据的变量
_pOSTask pOSTask;
UINT32 *pOSBoxMsg;
/****************************************************************************************************
** 函数名: OSTaskGetPrioTick
** 描 述: 根据任务权限,计算任务权限节拍
** 输 入: Prio:任务权限
** 输 出: 任务权限节拍
** 创建人: 卢益贵
** 日 期: 2008年1月5日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
UINT32 OSTaskGetPrioTick(UINT32 Prio)
{
if(0 == Prio)
return(255);
else
if(255 < Prio)
return(1);
else
return(256 - Prio);
}
/****************************************************************************************************
** 函数名: OSTaskOrderByPrio
** 描 述: 根据任务权限,告诉ListInsert函数是否在此处插入。
** 输 入: pNode:当前节点
pNodeIns:欲插入的节点
** 输 出: 1:允许在此处插入,其他不定义
** 创建人: 卢益贵
** 日 期: 2008年1月7日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL OSTaskOrderByPrio(void *pNode, void *pNodeIns)
{
if(((_pOSTask)pNodeIns)->PrioTick < ((_pOSTask)pNode)->PrioTick)
return(1);
else
return(0);
}
/****************************************************************************************************
** 函数名: OSTaskDataInit
** 描 述: 执行新建任务的任务数据初始化
** 输 入: pTask:任务数据区指针
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskDataInit(_pOSTask pTask)
{
pTask->pNext = NULL;
pTask->pTskStack = NULL;
pTask->pStack = NULL;
pTask->PrioTick = 0;
pTask->State = OS_STATE_TSK_NULL;
pTask->StateValue = 0;
pTask->pMsg = NULL;
}
/****************************************************************************************************
** 函数名: OSTaskCreate
** 描 述: 任务创建函数
** 输 入: pTaskBody:带UINT32类型参数的任务主函数体
Prio:任务权限,必须在1~255之间,数值越大,权限越大
Mode:任务运行模式,取决于CPU提供的模式
** 输 出: 任务ID号
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
UINT32 OSTaskUserCreate(void *pTaskBody, const UINT32 Prio, const UINT32 Mode, const UINT32 TaskParam)
{
_pOSTask pTask;
//独占CPU
OSIRQLock();
//分配任务空间
pTask = BoxAlloc(OSGetBoxTask());
OSTaskDataInit(pTask);
pTask->PrioTick = OSTaskGetPrioTick(Prio);
//分配堆栈空间
pTask->pStack = OSStackAlloc();
//初始化堆栈空间
pTask->pTskStack = OSStackInit(pTaskBody, pTask->pStack, Mode, TaskParam);
//初始化任务空间
//挂入就绪队列
ListAppend((void *)(&pOSTskReady), (void *)pTask);
//释放独占权
OSIRQUnlock();
return(pTask->ID);
}
/****************************************************************************************************
** 函数名: OSTaskSelf
** 描 述: 获取当前任务的ID
** 输 入: 无
** 输 出: 任务ID号
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
UINT32 OSTaskSelf(void)
{
return(pOSTskNow->ID);
}
/****************************************************************************************************
** 函数名: OSTaskKill
** 描 述: 摧毁指定ID的任务
** 输 入: 任务ID号
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskKill(OS_ID TaskID)
{
_pOSTask pTask;
OSIRQLock();
pTask = &(pOSTask[TaskID - 1]);
//从队列中删除改任务
ListDelete((void *)(&pOSTskReady), (void *)pTask);
ListDelete((void *)(&pOSTskDelay), (void *)pTask);
//释放改任务占有的所有空间
BoxFree(OSGetBoxStack(), pTask->pStack);
BoxFree(OSGetBoxTask(), pTask);
//如果是当前任务
if(pOSTskNow->ID == TaskID)
{
//如果就绪任务空,则运行默认任务
OSTaskIsNULLLoadDef();
//进行任务切换
OSTaskSW();
}
OSIRQUnlock();
}
/****************************************************************************************************
** 函数名: OSTaskSetPrio
** 描 述: 修改指定任务的权限
** 输 入: TaskID:任务ID号
Prio:新权限,必须在1-255之间
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void OSTaskSetPrio(OS_ID TaskID, UINT32 Prio)
{
if(0 == Prio)
Prio = 1;
if(255 < Prio)
Prio = 255;
OSIRQLock();
pOSTask[TaskID -1].PrioTick = 256 - Prio;
OSIRQUnlock();
}
/****************************************************************************************************
** 函数名: Resume
** 描 述: 将挂起的任务继续
** 输 入: TaskID:任务ID号
** 输 出: 布尔型,TRUE表示成功
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
BOOL Resume(OS_ID TaskID)
{
_pOSTask pTask;
BOOL R;
R = FALSE;
OSIRQLock();
pTask = &(pOSTask[TaskID - 1]);
if(OS_STATE_TSK_SUSPEND & pTask->State)
{
pTask->State &= (~OS_STATE_TSK_SUSPEND);
//如果原来是延迟状态,则继续延迟
if(pTask->State & OS_STATE_TSK_DELAY)
ListAppend((void *)(&pOSTskDelay), (void *)pTask);
else
//如果原来是就绪状态,则进入就绪队列
if(pTask->State & OS_STATE_TSK_READY)
ListAppend((void *)(&pOSTskReady), (void *)pTask);
R = TRUE;
}
OSIRQUnlock();
return(R);
}
/****************************************************************************************************
** 函数名: Suspend
** 描 述: 挂起任务
** 输 入: TaskID:任务ID号
** 输 出: 无
** 创建人: 卢益贵
** 日 期: 2007年12月8日
**------------------修改记录------------------------------------------------------------------------
** 修改人:
** 日 期:
** 说 明:
** 原代码:
**--------------------------------------------------------------------------------------------------
****************************************************************************************************/
void Suspend(OS_ID TaskID)
{
_pOSTask pTask;
OSIRQLock();
pTask = &(pOSTask[TaskID - 1]);
pTask->State |= OS_STATE_TSK_SUSPEND;
ListDelete((void *)(&pOSTskReady), (void *)pTask);
ListDelete((void *)(&pOSTskDelay), (void *)pTask);
if(pOSTskNow->ID == TaskID)
{
OSTaskIsNULLLoadDef();
OSTaskSW();
}
OSIRQUnlock();
}
/****************************************************************************************************
** 函数名: OSTaskPushDelay
** 描 述: 将任务放进迟延队列,并设相应标志
** 输 入: pTask:指向任务空间的指针
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -