📄 全部os内核文件.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 + -