📄 isr.lst
字号:
C51 COMPILER V8.02 ISR 11/05/2004 10:43:35 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN ISR.OBJ
COMPILER INVOKED BY: D:\C51\BIN\C51.EXE ISR.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************
2 嵌入式系统 小型操作系统
3 作者:汪普宏
4 制作日期:2006.9
5 *********************************************/
6
7 #include "os.h"
8 #include "OS_Mail.h"
9 #include "OS_Memory.h"
10 /****************************************
11 模块功能:系统时钟中断函数,中断级任务调度
12 模块接口:当前任务优先级,任务就绪表
13 调用者:无
14 返回值: 无
15 *****************************************/
16
17 void tiem1(void)interrupt 3
18 {
19 1 uchar i;
20 1 ISR_num++;
21 1 TH1 = (-SYSCLK*SYTIMEISR/12000) >> 8; // set Timer0 to overflow in 1ms
22 1 TL1 = -SYSCLK*SYTIMEISR/12000;
23 1 TR1=1;
24 1 OS_CLOSEISR;
25 1 for(i=0;i<N;i++) //任务延迟时间计数
26 1 {
27 2 if(OSPCB[i].timedal)
28 2 {
29 3 OSPCB[i].timedal--;
30 3 if(!OSPCB[i].timedal)
31 3 {
32 4 OS_RdyTask(i);
33 4 }
34 3 }
35 2 else if(OSPCB[i].flg!=WAIT_MSG)
36 2 {
37 3 OS_RdyTask(i); //使一个任务就绪
38 3 }
39 2 }
40 1 if(ISR_num==1)
41 1 {
42 2 OSISR_Task_Sched(); //切换任务调用,关中断
43 2 }
44 1 OS_OPENISR;
45 1 ISR_num--;
46 1 }
47
48 /****************************************
49 函数功能:任务调度
50 模块接口:当前任务优先级,任务就绪表
51 调用者:中断函数或任务级调度函数
52 返回值: 无
53 *****************************************/
54 extern uchar xdata Task_Free_Stack[FREE_SP];
55 void OSISR_Task_Sched(void)
C51 COMPILER V8.02 ISR 11/05/2004 10:43:35 PAGE 2
56 {
57 1 uchar i,newprio,x,y,len;
58 1 uchar data *p;
59 1 uchar xdata *tp;
60 1 uchar addr_h,addr_l;
61 1 uchar data *sp_top=SP-1;
62 1 y=OSUnMapTab[OSRdyGrp];
63 1 x=OSUnMapTab[OSRdyTab[y]]; //判断任务优先级
64 1 newprio=(y<<3)+x;
65 1 if(newprio!=Prio)
66 1 { addr_l=*sp_top;
67 2 addr_h=*(sp_top+1);
68 2 SP=p=spend;
69 2 OSPCB[Prio].sp_size=len=sp_top-spend;
70 2 tp=OSPCB[Prio].sp_start;
71 2 for(i=0;i<len;i++)
72 2 {
73 3 *(tp+i)=*p++; //保存当前任务堆栈
74 3 }
75 2 Prio=newprio;
76 2 SP=p=spend;
77 2 SP+=len=OSPCB[newprio].sp_size;
78 2 tp=OSPCB[newprio].sp_start;
79 2 for(i=0;i<len;i++)
80 2 {
81 3 *p++=*(tp+i); //恢复新任务堆栈
82 3 }
83 2 sp_top=SP++;
84 2 *sp_top++=addr_l;
85 2 *sp_top=addr_h;
86 2 }
87 1
88 1 }
89 /****************************************
90 函数功能:任务就绪表查询
91 模块接口:需要就绪的任务优先级
92 调用者: 任务调度函数
93 返回值: 无
94 *****************************************/
95 void OS_RdyTask(uchar prio) //使一个任务就绪
96 {
97 1 OS_CLOSEISR;
98 1 OSRdyGrp|=OSMapTab[prio>>3];
99 1 OSRdyTab[prio>>3]|=OSMapTab[prio&0x07];
100 1 OSPCB[prio].flg=READY;
101 1 OS_OPENISR;
102 1 }
103 uchar code OSMapTab[]=
104 {
105 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
106 };
107 uchar code OSUnMapTab[]=
108 { 0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
109
110 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
111 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
112 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
113 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
114 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
115 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
116 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
117 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
C51 COMPILER V8.02 ISR 11/05/2004 10:43:35 PAGE 3
118 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
119 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
120 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
121 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
122 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
123 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
124 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
125 };
126
127
128
129
130
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 435 ----
CONSTANT SIZE = 264 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -