📄 minix.lst
字号:
C51 COMPILER V7.07 MINIX 11/06/2003 20:00:10 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE MINIX
OBJECT MODULE PLACED IN MINIX.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE MINIX.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <minix.h>
2
3 //*************************************************************
4 //
5 // 外部接口函数声明该声明区域是声明汇编接口程序
6 //
7 //*************************************************************
8 extern void OS_GOTO_TASK(void); //跳转到线程
9 extern void OS_SAVE_THIS_TASK(void); //保存现有线程
10 extern void OS_SAVE_SYSTEM_R(void); //保存系统R积存器
11 extern void OS_RESTORE_SYSTEM_R(void); //恢复系统R积存器
12
13
14 //*************************************************************
15 //
16 // 内核函数声明声明内核中所用到的函数,也包含用户所需的函数
17 //
18 //*************************************************************
19 void OS_SAVE_SYSTEM(void); //保存系统积存器函数
20 void OS_RESTORE_SYSTEM(void); //恢复系统积存器函数
21
22 unsigned char OS_TASK_SELECT(void); //线程选择器
23 void OS_TASK_DLY(unsigned char times); //线程延时程序
24
25 unsigned char OS_GET_TASK_ID(void (*task)); //获取线程ID
26 void OS_SET_READY(void (*task),unsigned char key);//设置READY位
27 unsigned char OS_GET_READY(void (*task)); //获取线程READY状态
28
29 extern void OS_START_TICK(void); //开时钟
30 extern void OS_RESTORE_TICK(void); //恢复时钟
31
32 //构造函数声明
33 void OS_CREATE_TASK(
34 void *task, //线程入口地址
35 unsigned char task_ready, //线程状态
36 unsigned char task_pri, //线程优先级
37 unsigned char task_sp_bot //线程堆栈底部
38 );
39
40
41 //*************************************************************
42 //
43 // 内核变量声明本声明是内核调度时所需要的临时变量或公共变量
44 //
45 //*************************************************************
46 static unsigned char NOT_CLOCK_ISR=0x00; //是否由非中断过程进入调度器标志位
47
48 //线程TCB
49 typedef struct OS_TASK_TCB
50 {
51 unsigned char task_pri; //优先级
52 unsigned char task_ready; //线程状态
53 unsigned char task_sp_bot; //线程堆栈底部
54 unsigned char task_sp_now; //现时线程SP指针
55 unsigned char task_sp_top; //线程SP指针顶
C51 COMPILER V7.07 MINIX 11/06/2003 20:00:10 PAGE 2
56 void *task_address; //线程入口地址
57 unsigned char task_wait_clock; //线程等待时钟
58 unsigned char task_on_activation; //线程活动状态
59 };
60
61 struct OS_TASK_TCB OS_TASK_ARRY[TASK_NUMBER]; //建立TCB数组
62 static unsigned char OS_TASK_INT_USED=0X00; //线程建立数
63 static unsigned char os_this_task_id=0xff; //当前线程TCB指针
64
65
66 //系统寄存器保存结构
67 struct OS_SYSTEM_SAVE_TCB
68 {
69 unsigned char SYSTEM_SP_NOW; //现时线程SP指针
70 //void *task_address; //线程入口地址
71 unsigned char PSW; //PSW
72 unsigned char ACC; //ACC
73 unsigned char B; //B
74 unsigned char DPH; //DPH
75 unsigned char DPL; //DPL
76 // unsigned char R7; //R寄存器由于无法访问以汇编代替
77 // unsigned char R6;
78 // unsigned char R5;
79 // unsigned char R4;
80 // unsigned char R3;
81 // unsigned char R2;
82 // unsigned char R1;
83 // unsigned char R0;
84 }OS_SYSTEM; //系统机构明 OS_SYSTEM
85
86
87 //*********************************************************
88 //
89 // 代码区以下是MINIX内核代码
90 //
91 //*********************************************************
92
93 //获取线程ID
94 unsigned char OS_GET_TASK_ID(void (*task))
95 {
96 1 unsigned char loop;
97 1 for (loop=0x00;loop<TASK_NUMBER;++loop)
98 1 {
99 2 if (OS_TASK_ARRY[loop].task_address==task)
100 2 {return loop;}
101 2 }
102 1 }
103
104 //设置READY位
105 void OS_SET_READY(void (*task),unsigned char key)
106 {
107 1 OS_TASK_ARRY[OS_GET_TASK_ID(task)].task_ready=key;
108 1 }
109
110 //获取线程READY状态
111 unsigned char OS_GET_READY(void (*task))
112 {
113 1 return OS_TASK_ARRY[OS_GET_TASK_ID(task)].task_ready;
114 1 }
115
116 //系统调度器
117 void OS_ATTEMPER(void)
C51 COMPILER V7.07 MINIX 11/06/2003 20:00:10 PAGE 3
118 {
119 1 unsigned char loop; //循环临时变量
120 1
121 1 //判断进入线程调度器是否在没有激活线程状态下进行,判断是否第一次进入
122 1 if (os_this_task_id!=0xff)
123 1 {
124 2 OS_TASK_ARRY[os_this_task_id].task_sp_now=SP_POINTER; //保存线程堆栈指针
125 2 SP_POINTER=OS_SYSTEM.SYSTEM_SP_NOW; //恢复系统指针
126 2 OS_RESTORE_SYSTEM(); //恢复系统寄存器
127 2 OS_TASK_ARRY[os_this_task_id].task_on_activation=0; //清除线程活动标志位
128 2 }
129 1
130 1 OS_RESTORE_TICK(); //恢复时钟设置
131 1
132 1 if (NOT_CLOCK_ISR) //判断是否为中断操作
133 1 {NOT_CLOCK_ISR=0; //清除非中断操作标志未
134 2 }else
135 1 {
136 2 //循环对等待线程中的时间减一
137 2 for (loop=0x00;loop<TASK_NUMBER;loop++)
138 2 {
139 3 //为等待线程减1
140 3 if (OS_TASK_ARRY[loop].task_wait_clock>0)
141 3 {
142 4 OS_TASK_ARRY[loop].task_wait_clock=OS_TASK_ARRY[loop].task_wait_clock-1;
143 4 }
144 3 }
145 2 }
146 1
147 1 os_this_task_id=OS_TASK_SELECT(); //选出下一条被执行的线程
148 1
149 1 OS_TASK_ARRY[os_this_task_id].task_on_activation=1; //设置活动标志
150 1
151 1 OS_SAVE_SYSTEM(); //保存系统寄存器
152 1 OS_SYSTEM.SYSTEM_SP_NOW=SP_POINTER; //保存系统指针
153 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -