📄 minix.c
字号:
#include <minix.h>
//*************************************************************
//
// 外部接口函数声明该声明区域是声明汇编接口程序
//
//*************************************************************
extern void OS_GOTO_TASK(void); //跳转到线程
extern void OS_SAVE_THIS_TASK(void); //保存现有线程
extern void OS_SAVE_SYSTEM_R(void); //保存系统R积存器
extern void OS_RESTORE_SYSTEM_R(void); //恢复系统R积存器
//*************************************************************
//
// 内核函数声明声明内核中所用到的函数,也包含用户所需的函数
//
//*************************************************************
void OS_SAVE_SYSTEM(void); //保存系统积存器函数
void OS_RESTORE_SYSTEM(void); //恢复系统积存器函数
unsigned char OS_TASK_SELECT(void); //线程选择器
void OS_TASK_DLY(unsigned char times); //线程延时程序
unsigned char OS_GET_TASK_ID(void (*task)); //获取线程ID
void OS_SET_READY(void (*task),unsigned char key);//设置READY位
unsigned char OS_GET_READY(void (*task)); //获取线程READY状态
extern void OS_START_TICK(void); //开时钟
extern void OS_RESTORE_TICK(void); //恢复时钟
//构造函数声明
void OS_CREATE_TASK(
void *task, //线程入口地址
unsigned char task_ready, //线程状态
unsigned char task_pri, //线程优先级
unsigned char task_sp_bot //线程堆栈底部
);
//*************************************************************
//
// 内核变量声明本声明是内核调度时所需要的临时变量或公共变量
//
//*************************************************************
static unsigned char NOT_CLOCK_ISR=0x00; //是否由非中断过程进入调度器标志位
//线程TCB
typedef struct OS_TASK_TCB
{
unsigned char task_pri; //优先级
unsigned char task_ready; //线程状态
unsigned char task_sp_bot; //线程堆栈底部
unsigned char task_sp_now; //现时线程SP指针
unsigned char task_sp_top; //线程SP指针顶
void *task_address; //线程入口地址
unsigned char task_wait_clock; //线程等待时钟
unsigned char task_on_activation; //线程活动状态
};
struct OS_TASK_TCB OS_TASK_ARRY[TASK_NUMBER]; //建立TCB数组
static unsigned char OS_TASK_INT_USED=0X00; //线程建立数
static unsigned char os_this_task_id=0xff; //当前线程TCB指针
//系统寄存器保存结构
struct OS_SYSTEM_SAVE_TCB
{
unsigned char SYSTEM_SP_NOW; //现时线程SP指针
//void *task_address; //线程入口地址
unsigned char PSW; //PSW
unsigned char ACC; //ACC
unsigned char B; //B
unsigned char DPH; //DPH
unsigned char DPL; //DPL
// unsigned char R7; //R寄存器由于无法访问以汇编代替
// unsigned char R6;
// unsigned char R5;
// unsigned char R4;
// unsigned char R3;
// unsigned char R2;
// unsigned char R1;
// unsigned char R0;
}OS_SYSTEM; //系统机构明 OS_SYSTEM
//*********************************************************
//
// 代码区以下是MINIX内核代码
//
//*********************************************************
//获取线程ID
unsigned char OS_GET_TASK_ID(void (*task))
{
unsigned char loop;
for (loop=0x00;loop<TASK_NUMBER;++loop)
{
if (OS_TASK_ARRY[loop].task_address==task)
{return loop;}
}
}
//设置READY位
void OS_SET_READY(void (*task),unsigned char key)
{
OS_TASK_ARRY[OS_GET_TASK_ID(task)].task_ready=key;
}
//获取线程READY状态
unsigned char OS_GET_READY(void (*task))
{
return OS_TASK_ARRY[OS_GET_TASK_ID(task)].task_ready;
}
//系统调度器
void OS_ATTEMPER(void)
{
unsigned char loop; //循环临时变量
//判断进入线程调度器是否在没有激活线程状态下进行,判断是否第一次进入
if (os_this_task_id!=0xff)
{
OS_TASK_ARRY[os_this_task_id].task_sp_now=SP_POINTER; //保存线程堆栈指针
SP_POINTER=OS_SYSTEM.SYSTEM_SP_NOW; //恢复系统指针
OS_RESTORE_SYSTEM(); //恢复系统寄存器
OS_TASK_ARRY[os_this_task_id].task_on_activation=0; //清除线程活动标志位
}
OS_RESTORE_TICK(); //恢复时钟设置
if (NOT_CLOCK_ISR) //判断是否为中断操作
{NOT_CLOCK_ISR=0; //清除非中断操作标志未
}else
{
//循环对等待线程中的时间减一
for (loop=0x00;loop<TASK_NUMBER;loop++)
{
//为等待线程减1
if (OS_TASK_ARRY[loop].task_wait_clock>0)
{
OS_TASK_ARRY[loop].task_wait_clock=OS_TASK_ARRY[loop].task_wait_clock-1;
}
}
}
os_this_task_id=OS_TASK_SELECT(); //选出下一条被执行的线程
OS_TASK_ARRY[os_this_task_id].task_on_activation=1; //设置活动标志
OS_SAVE_SYSTEM(); //保存系统寄存器
OS_SYSTEM.SYSTEM_SP_NOW=SP_POINTER; //保存系统指针
//恢复线程堆栈指针
SP_POINTER=OS_TASK_ARRY[os_this_task_id].task_sp_now;
OS_GOTO_TASK(); //进入线程
}
//线程选择器
//如果主要线程都处于等待状态,会返回空闲线程ID
unsigned char OS_TASK_SELECT(void)
{
unsigned char loop;
unsigned char min_pri=0xff; //线程优先级临时变量
unsigned char min_pri_number; //被选择出线程临时变量
for (loop=0x00;loop<TASK_NUMBER;loop++)
{
if (OS_TASK_ARRY[loop].task_pri<=min_pri)
{
if (OS_TASK_ARRY[loop].task_ready>0)
{
if (OS_TASK_ARRY[loop].task_wait_clock==0)
{
min_pri=OS_TASK_ARRY[loop].task_pri;
min_pri_number=loop;
}
}
}
}
return min_pri_number; //返回线程编号
}
//线程延时程序
//用于设置线程进入等待状态
void OS_TASK_DLY(unsigned char times)
{
NOT_CLOCK_ISR=1; //设置非中断操作标志位
OS_TASK_ARRY[os_this_task_id].task_wait_clock=times; //送入等待时间
//保存线程堆栈
OS_TASK_ARRY[os_this_task_id].task_sp_now=SP_POINTER+CPU_SAVE_DUP;
OS_SAVE_THIS_TASK(); //保存当前线程
}
//*********************************************
//
// 与CPU有关的函数 移植时可能需要修改
//
//*********************************************
//线程构造器
void OS_CREATE_TASK(
void *task, //线程入口地址
unsigned char task_ready, //线程状态
unsigned char task_pri, //线程优先级
unsigned char task_sp_bot //线程堆栈底部
)
{
unsigned char *sp_temp; //临时线程指针
OS_TASK_ARRY[OS_TASK_INT_USED].task_pri=task_pri; //线程优先级
OS_TASK_ARRY[OS_TASK_INT_USED].task_ready=task_ready; //线程状态
OS_TASK_ARRY[OS_TASK_INT_USED].task_sp_bot=task_sp_bot; //线程堆栈底部
OS_TASK_ARRY[OS_TASK_INT_USED].task_address=task; //线程入口地址
OS_TASK_INT_USED=OS_TASK_INT_USED+1; //修改线程数目
//初始化线程堆栈
sp_temp=(char *)OS_TASK_ARRY[OS_TASK_INT_USED-1].task_sp_bot;
*sp_temp=(char )task&0x00ff; //PCL
sp_temp=sp_temp+1;
*sp_temp=(char)((int)task>>8); //PCH
sp_temp=sp_temp+1;
*sp_temp=0x00; //PSW
sp_temp=sp_temp+1;
*sp_temp=0x00; //ACC
sp_temp=sp_temp+1;
*sp_temp=0x00; //B
sp_temp=sp_temp+1;
*sp_temp=0x00; //DPH
sp_temp=sp_temp+1;
*sp_temp=0x00; //DPL
sp_temp=sp_temp+1;
*sp_temp=0x00; //R0
sp_temp=sp_temp+1;
*sp_temp=0x00; //R1
sp_temp=sp_temp+1;
*sp_temp=0x00; //R2
sp_temp=sp_temp+1;
*sp_temp=0x00; //R3
sp_temp=sp_temp+1;
*sp_temp=0x00; //R4
sp_temp=sp_temp+1;
*sp_temp=0x00; //R5
sp_temp=sp_temp+1;
*sp_temp=0x00; //R6
sp_temp=sp_temp+1;
*sp_temp=0x00; //R7
//设置线程入口SP地址
OS_TASK_ARRY[OS_TASK_INT_USED-1].task_sp_now=(char)sp_temp;
}
/*
//开时钟
void OS_START_TICK(void)
{
IE=IE|0X82;
TH0=0Xf0;
TL0=0X00;
TMOD=TMOD|0X01;
TCON=TCON|0X10;
}
//恢复时钟
void OS_RESTORE_TICK(void)
{
TH0=0Xf0;
TL0=0X00;
}
*/
//保存调度系统的寄存器
void OS_SAVE_SYSTEM(void)
{
OS_SYSTEM.PSW=PSW;
OS_SYSTEM.ACC=ACC;
OS_SYSTEM.B =B;
OS_SYSTEM.DPH=DPH;
OS_SYSTEM.DPL=DPL;
OS_SAVE_SYSTEM_R();//保存R寄存器
}
//恢复调度系统寄存器
void OS_RESTORE_SYSTEM(void)
{
PSW=OS_SYSTEM.PSW;
OS_RESTORE_SYSTEM_R();//恢复R寄存器
ACC=OS_SYSTEM.ACC;
B =OS_SYSTEM.B;
DPH=OS_SYSTEM.DPH;
DPL=OS_SYSTEM.DPL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -