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

📄 全部os内核文件.txt

📁 非剥夺型占先式minOS_iccavr avr单片机 icc编译环境
💻 TXT
字号:
我的这个小小OS起名为minOS,再起个中文名称叫"小小哪吒OS",就让大小虾米们图个乐吧,哈哈。

全部minOS内核源文件如下:

//内核的功能函数在OS_Core.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;
	for (i=0;i<OS_MAX_TASKS;i++) 
	{
		OSTCB[i].OSStkTop=(INT8U)NULL;
		OSTCB[i].OSTaskStatus=OS_TASK_Suspend;
		OSTCB[i].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;
	for (i=0;i<OS_MAX_TASKS;i++) 
	{
		if ((OSTCB[i].OSStkTop!=(INT8U)NULL) & (OSTCB[i].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;
	for (i=0;i<OS_MAX_TASKS;i++) 
	{
		if (OSTCB[i].OSTimeDly>OS_TASK_TimeOut) 
		{
			if (--OSTCB[i].OSTimeDly==0) {OSTCB[i].OSTaskStatus=OS_TASK_Rdy;}
		}
	}
	OS_TASK_HighPri=OSPrioHighRdy();
}

#if OS_TIME_DLY_EN
//OS Time Delay --- 使任务延时Tdly个时间节拍
void OSTimeDly(INT16U Tdly)
{
	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();
}

//CPU相关的函数在该OS_CPU.C文件里。
/*
*********************************************************************************************************
*                                      minOS 0.01v
*                                The Real-Time OS Kernel
*                                  All Rights Reserved
* File : OS_CPU.C
* 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
*
*********************************************************************************************************
*/

#define OS_CPU_GLOBALS
#include "OS_Includes.h"


//汇编宏_POPA_,_PUSHA_ 用于任务切换时保存和恢复现场。
#pragma ASM
		_POPA_	MACRO
			IRP	REG,	<7, 6, 5, 4, 3, 2, 1, 0, PSW, DPL, DPH, B, ACC>
			POP	REG
			ENDM
		ENDM

		_PUSHA_	MACRO
			IRP	REG,	<ACC, B, DPH, DPL, PSW, 0, 1, 2, 3, 4, 5, 6, 7>
			PUSH	REG
			ENDM
		ENDM
#pragma ENDASM

//;CPU specific definitions 
#define C51_CRYSTAL_FREQ   11059200ul
//;Determine the reload values for timer 0 this is automated by the next macro
#define T0_RELOAD  C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 12
#define T0_RELOADH (65536 - (T0_RELOAD & 65535)) / 256
#define T0_RELOADL (65536 - (T0_RELOAD & 65535)) & 255
//Initial OS Timer for time ticks --- 初始化时间节拍定时器。
void InitOSTimer(void)
{
    TMOD=(TMOD & 0XF0) | 0X01;	/* Timer 0 working in MODE 1 */
    TH0=T0_RELOADH;     //设置Tick次/秒,

⌨️ 快捷键说明

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