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

📄 ggt_kernel.c

📁 ARM下的多任务操作系统源码:GogotoOS
💻 C
📖 第 1 页 / 共 2 页
字号:
**  输 出: 无
**  创建人: 卢益贵
**  日 期: 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 + -