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

📄 minix.c

📁 minix rtos 测试代码
💻 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 + -