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

📄 os_core.c

📁 非剥夺型占先式minOS_iccavr avr单片机 icc编译环境
💻 C
字号:
/*
*********************************************************************************************************
*                                      minOS 0.01v
*                                The Real-Time OS Kernel
*                                  All Rights Reserved
* File : OS_Core.C
* 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
*
*********************************************************************************************************
*/


#define  OS_GLOBALS                           /* Declare GLOBAL variables   */
#include "OS_Includes.h"

// initialization OSTCB --- 初始化任务控制块.
void OSInit(void) 
{	INT8U i;
    OS_TCB *pOS_TCB;
	pOS_TCB=OSTCB;
	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	{
		pOS_TCB->OSStkTop=(INT16U)NULL;
		pOS_TCB->OSTaskStatus=OS_TASK_Suspend;
		pOS_TCB->OSTimeDly=0;
	}
}

//Start OS --- 启动OS
void OSStart(void) 
{
	Init_OS_Timer();
	OS_TASK_CrtPrio=Task_main_Prio;
	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_Run;
	OS_INT_ENABLE();
	OS_TASK_INT();
}

//返回优先级最高的处于就绪态任务的优先级,否则返回no_TASK_Rdy。
static INT8U OSPrioHighRdy(void) 
{ INT8U i;
    OS_TCB *pOS_TCB;
	pOS_TCB=OSTCB;
	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	{
		if ((pOS_TCB->OSStkTop!=(INT8U)NULL) & (pOS_TCB->OSTaskStatus==OS_TASK_Rdy)) {return i;}
	}
	return no_TASK_Rdy;
}

//Task OSTimeDly Decrease 1 per Time Tick --- 每个时钟节拍,任务等待延时的时间OSTimeDly减1.
//如果任务的OSTimeDly减到0,把任务设置为准备就绪OS_TASK_Rdy。
void OSTimeTick(void) 
{ INT8U i;
    OS_TCB *pOS_TCB;
	pOS_TCB=OSTCB;
	for (i=0;i<OS_MAX_TASKS;i++,pOS_TCB++) 
	{
		if (pOS_TCB->OSTimeDly>OS_TASK_TimeOut) 
		{
			if (--pOS_TCB->OSTimeDly==0) {pOS_TCB->OSTaskStatus=OS_TASK_Rdy;}
		}
	}
	OS_TASK_HighPri=OSPrioHighRdy();
}

#if OS_TIME_DLY_EN
//OS Time Delay --- 使任务延时Tdly个时间节拍
void OSTimeDly(INT16U Tdly)               /* Delay Tdly clock tick */
{
	OSTCB[OS_TASK_CrtPrio].OSTimeDly=Tdly+OS_TASK_TimeOut;
	OSTCB[OS_TASK_CrtPrio].OSTaskStatus=OS_TASK_WaitTicks;
	OSSched();
}
#endif

#if OS_TASK_SUSPEND_EN>0
//把正在运行的任务挂起(Suspend a task)。
void OSTaskSuspend(INT8U TaskPrio) 
{
	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Suspend;
	OSSched();
}
#endif

#if OS_TASK_Resume_EN>0
// 恢复被挂起的任务(resume a task)。
void OSTaskResume(INT8U TaskPrio) 
{
	OSTCB[TaskPrio].OSTaskStatus=OS_TASK_Rdy;
}
#endif

//任务调度,把CPU控制权转到优先级最高的处于就绪态的任务。如果没有处于就绪态的任务,就地等待,
void OSSched(void) 
{
	do
	{
		OS_TASK_HighPri=OSPrioHighRdy();
	} while (OS_TASK_HighPri==no_TASK_Rdy);
	OSTCB[OS_TASK_HighPri].OSTaskStatus=OS_TASK_Run;
	OS_TASK_INT();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -