📄 os_core.lst
字号:
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE OS_CORE
OBJECT MODULE PLACED IN OS_CORE.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE OS_CORE.C DEBUG OBJECTEXTEND CODE SYMBOLS
stmt level source
1 #include "include.h"
2
3 #define DEBUG
4 #define OS_TASK_SWITCH
5
6 extern uint8 idata STACK[1];
7 //堆栈首地址
8 uint8 data gStack;
9
10 //当前任务号
11 uint8 data OSCurrentTaskID;
12
13 //下一个任务号
14 //uint8 data OSNextTaskID;
15
16
17 uint8 const OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00};
18
19 //uint8 data OS_IRQ_Sum;//中断计数器
20
21 uint8 xdata taskMAX_stack[24];
22
23 uint8 code OSUnMapTbl[] = {
24 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F */
25 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F */
26 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F */
27 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F */
28 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F */
29 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F */
30 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F */
31 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F */
32 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F */
33 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F */
34 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF */
35 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF */
36 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF */
37 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF */
38 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF */
39 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0xF0 to 0xFF */
40 };
41 // 上面256的表可以简化为16*2的表,查表麻烦点,不过说不定最后占用代码空间更大
42 // 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, //0Xx0 0Xx1 0Xx2 0Xx3....0XxE 0XxF
43 // 0, 4, 5, 4, 6, 4, 5, 4, 7, 4, 5, 4, 6, 4, 5, 4, //0X00 0X10 0X20 0X30....0XE0 0XF0
44
45 uint8 data OSRdyGrp; // Ready list group
46 uint8 data OSRdyTbl[OS_RDY_TBL_SIZE]; // Table of tasks which are ready to run
47
48 OS_TCB data Tasks_TCB[OS_MAX_TASKS];
49
50 extern void Push_Reg (void);
51 extern void Pop_Reg (void);
52
53
54
55 //功能描述: 系统开始运行时初始化
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 2
56 void OSInit(void) SMALL
57 {uint8 i;
58 1
59 1 gStack=STACK-2; //堆栈的首地址
60 1 //OS_IRQ_Sum = 0;
61 1
62 1 OSRdyGrp=0;//就绪组标志
63 1 memset(OSRdyTbl, 0, OS_RDY_TBL_SIZE);///就绪组内标志
64 1
65 1 OSCurrentTaskID = OS_MAX_TASKS-1;//当前任务为系统任务
66 1
67 1 //OSCPUInit();//初始化任务表
68 1 for (i = 0; i < OS_MAX_TASKS; i++)
69 1 {
70 2 Tasks_TCB[i].pTask = 0; // Load Stack pointer in TCB
71 2 //Tasks_TCB[i].OSTCBPrio = i; // Load task priority into TCB
72 2 Tasks_TCB[i].OSTCBStat = INACTIVE; //OS_STAT_RDY; // Task is ready to run
73 2 Tasks_TCB[i].OSTCBDly = 0; //Task is not delayed
74 2 //Tasks_TCB[i].stk = stk;
75 2 Tasks_TCB[i].size = 0;
76 2 Tasks_TCB[i].stk_used = 0;
77 2 }
78 1
79 1 }
80
81 /*
82 该函数将创建一个系统任务
83
84 */
85 //#pragma disable //禁止所有中断
86 void os_sys_init(pFUN task)//( void (*task)(void) )
87 {char xdata *pstack;
88 1 //char idata *stack_bottom;
89 1 //uint8 IEtemp;
90 1 uint16 addr;
91 1
92 1
93 1 OS_AllIRQ_Unable(); //总中断禁止
94 1 //IEtemp=Read_data(SP--);//将堆栈中的中断标志读出来 #pragma disable //禁止所有中断
95 1
96 1 OSInit();
97 1
98 1
99 1 //系统任务地址
100 1 addr=Read_data(SP--); //读出刚才压入堆栈的函数地址.高地址
101 1 addr <<= 8;
102 1 addr += Read_data(SP) ;//Read_data(SP-1); //读出刚才压入堆栈的函数地址.低地址.有错
103 1 SP++;
104 1
105 1
106 1 //保存系统任务
107 1 Tasks_TCB[OS_MAX_TASKS-1].pTask = (void code *)addr; // Load Stack pointer in TCB
108 1 //Tasks_TCB[OS_MAX_TASKS-1].OSTCBPrio = (INT8U)priority; // Load task priority into TCB
109 1 Tasks_TCB[OS_MAX_TASKS-1].OSTCBStat = READY; //OS_STAT_RDY; // Task is ready to run
110 1 Tasks_TCB[OS_MAX_TASKS-1].OSTCBDly = 0; //Task is not delayed
111 1 Tasks_TCB[OS_MAX_TASKS-1].stk = taskMAX_stack;
112 1 Tasks_TCB[OS_MAX_TASKS-1].size = sizeof(taskMAX_stack);
113 1 Tasks_TCB[OS_MAX_TASKS-1].stk_used = (2+13);
114 1
115 1 pstack=Tasks_TCB[OS_MAX_TASKS-1].stk;
116 1
117 1 //系统任务就绪
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 3
118 1 //OSTaskResume(OS_MAX_TASKS-1);
119 1 OSRdyGrp |= OSMapTbl[(OS_MAX_TASKS-1)>>3]; //prio>>3-->prio/8
120 1 OSRdyTbl[(OS_MAX_TASKS-1)>>3] |= OSMapTbl[(OS_MAX_TASKS-1)&0x07]; //prio&0x07-->prio%8
121 1
122 1
123 1 //将task函数地址替换为进入该函数后地址,该函数退出后将执行task函数
124 1 task();//该函数里面会打开中断
125 1 //addr = (uint16)task;
126 1 //Write_data( ++SP, addr );
127 1 //Write_data( ++SP, addr>>8 );
128 1 //Write_data( ++SP, IEtemp );
129 1
130 1 }
131
132 /*------------------------------------------------------------------*-
133 创建任务
134
135 * pFunction--任务地址
136 * prio--优先级
137
138 task, Task to create
139 prio, Task priority (1-254)
140 stk, Pointer to the task's stack
141 size, Number of bytes in the stack
142
143 任务创建后进入就绪状态
144 -*------------------------------------------------------------------*/
145 #pragma disable //禁止所有中断
146
147 OS_TID os_tsk_create_user( pFUN task, U8 prio, void* stk, STK_SIZE_BIT size ) SMALL
148 {//OS_TCB *ptcb;
149 1 char xdata *pstack;
150 1 uint16 i;
151 1
152 1 //OS_ENTER_CRITICAL();
153 1 // IrqAll_Unable(); //总中断禁止 IrqT0_Unable(); //定时器0中断禁止
154 1
155 1 //ptcb=&Tasks_TCB[prio];
156 1 if (Tasks_TCB[prio].pTask == NULL)
157 1 {
158 2 Tasks_TCB[prio].pTask = task; // Load Stack pointer in TCB
159 2 //Tasks_TCB[prio].OSTCBPrio = (INT8U)priority; // Load task priority into TCB
160 2 Tasks_TCB[prio].OSTCBStat = READY; //OS_STAT_RDY; // Task is ready to run
161 2 Tasks_TCB[prio].OSTCBDly = 0; //Task is not delayed
162 2 Tasks_TCB[prio].stk = stk;
163 2 Tasks_TCB[prio].size = size;//size必须比2+13大
164 2 Tasks_TCB[prio].stk_used = 2+13;//2个任务地址+13个特殊功能寄存器
165 2
166 2 //设置任务就绪表,让任务就绪
167 2 OSRdyGrp |= OSMapTbl[prio>>3]; //prio>>3-->prio/8
168 2 OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; //prio&0x07-->prio%8
169 2
170 2 //堆栈初始化
171 2 //OSTaskStkInit(task, prio);
172 2 pstack=Tasks_TCB[prio].stk;
173 2
174 2 *pstack++ = (uint8)task; //任务低地址进栈
175 2 *pstack++ = (uint16)task>>8; //任务高地址进栈
176 2 for(i=0; i<Tasks_TCB[prio].size; i++)//初始化清空堆栈
177 2 {
178 3 *pstack++ = 0;
179 3 }
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 4
180 2 return (prio);
181 2 }
182 1 //OS_EXIT_CRITICAL();
183 1 // IrqAll_Enable(); //总中断允许 IrqT0_Enable(); //打开T0中断允许
184 1 return (0);
185 1 }
186
187 #ifndef OS_TASK_SWITCH
//功能描述: 系统时钟中断服务函数
//#pragma disable //禁止所有中断
void OSTickISR(void) interrupt 1 //OS_TIME_ISR
{uint8 data IEtemp;
//TH0=T0H_COUNTER;
//TL0=T0L_COUNTER;
IEtemp=IE;//保存中断
OS_AllIRQ_Unable(); //总中断禁止
//IE &= B0000_0000; //IE &= B0000_0001; //保留外部中断原来状态,屏蔽掉其他中断
//#if EN_TIMER_SHARING > 0
if(TH0==0)//==0说明是定时器溢出中断,!=0表示是软件设置的定时器中断
{
TH0=T0H_COUNTER;
TL0=T0L_COUNTER;
OSTimeTick(); //调用系统时钟处理函数
}//
//#else
// OSIntSendSignal(TIME_ISR_TASK_ID); // 唤醒ID为TIME_ISR_TASK_ID的任务
//#endif
OSIntExit(); //在完全退出中断时,才进行任务切换
//OS_AllIRQ_Enable(); //总中断允许
IE=IEtemp; //恢复所有中断状态
}
#else
221
222 #endif
223
224 /*
225 堆栈保存内容:
226 数据堆栈+函数地址+特殊功能积存器
227
228 //功能描述: 中断退出处理函数,在此进行中断后的任务切换
229 //IRQ_Stack_Bottom任务中断后的堆栈栈顶
230 //在退出中断时,不让进栈的数据出栈。在完全退出中断时,才进行任务切换,
231 1.1 保存当前任务堆栈
232 1.2 保存任务特殊功能寄存器
233 1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
234 1.4 切换任务
235 2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
236 2.2 恢复任务特殊功能寄存器
237 2.3 将新任务原来断点地址压入堆栈
238 */
239 void OSIntExit(void) SMALL
240 {char idata * stack_bottom;
241 1 char xdata * stack_bottom_bak;
C51 COMPILER V7.07 OS_CORE 06/09/2008 17:22:34 PAGE 5
242 1 //uint16 addr;
243 1 uint16 old_addr;
244 1 uint8 old_taskid;//
245 1
246 1 old_taskid=OSCurrentTaskID;
247 1 OSFindNextRunningTask(); //查找下一个就绪的任务
248 1 if(old_taskid==OSCurrentTaskID) //任务不切换
249 1 return;
250 1
251 1 Tasks_TCB[OSCurrentTaskID].OSTCBStat = RUNNING; //任务运行中
252 1 //系统不备份调用本函数压入的堆栈
253 1 old_addr=Read_data(SP--); //读出刚才压入堆栈的函数地址.高地址
254 1 old_addr <<= 8;
255 1 old_addr += Read_data(SP--); //读出刚才压入堆栈的函数地址.低地址
256 1
257 1 stack_bottom=gStack+1;//当前任务堆栈底地址
258 1 stack_bottom_bak=Tasks_TCB[old_taskid].stk;//当前任务堆栈底备份地址
259 1
260 1 //1.3 保存任务堆栈+任务特殊功能寄存器->堆栈备份空间
261 1 Tasks_TCB[old_taskid].stk_used=SP-gStack;//任务堆栈已经使用数量
262 1 memcpy(stack_bottom_bak, stack_bottom, SP-gStack);
263 1
264 1 //1.4 切换任务.前面已经执行过
265 1 //OSFindNextRunningTask(); //查找下一个就绪的任务
266 1
267 1 //2.1 从堆栈备份空间->恢复新的就绪的任务的堆栈
268 1 stack_bottom=gStack+1;//当前任务堆栈底地址
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -