⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ggt_kernel.c

📁 ARM下的多任务操作系统源码:GogotoOS
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************************
**                                        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 + -