📄 sch51.lst
字号:
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE SCH51
OBJECT MODULE PLACED IN SCH51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SCH51.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*--------------------------------------------------------------------*-
2
3 SCH51.C (V1.00)
4
5 这里是调度器的内核函数,这个函数可以用于所有的8051芯片.
6
7 --- SCH_MAX_TASKS必须由用户设置 ----
8
9 -*---------------------------------------------------------------------*/
10
11 /*
12 * Copyright (c) 2006
13 * All rights reserved
14 *
15 * 文件名称: SCH51.C
16 * 文件标识:
17 * 摘 要: 内核函数
18 *
19 * 当前版本: 1.1 * 取代版本:
20 * 作 者: wsl * 原作者 : Michael J.Pont
21 * 完成日期: 2006-09-14 * 完成日期:
22 ************************************************************************/
23
24 #include"main.H"
25 #include"Port.H"
26 #include"SCH51.H"
27 #include "MMI.h"
28 #include"Uart.h"
29 #include"LedDisp.h"
30 #include"key.h"
31
32
33 /*私有函数*/
34 static void SCH_Updata(void);
35 static void SCH_Report_Status(void);
36 //---------------公用常数-------------------------------
37 // 在任一时刻要求的任务最大数目
38 // 每个新建项目都必须调整
39 #define SCH_MAX_TASKS (8)
40 //-------公用变量定义-----------------------------------------------------
41 // 任务队列
42 sTask SCH_tasks_G[SCH_MAX_TASKS];
43
44
45
46 #define RETURN_NORMAL (bit)0
47 #define RETURN_ERROR (bit)1
48 // 错误代码
49 #define ERROR_SCH_TOO_MANY_TASKS (1)
50 #define ERROR_SCH_CANNOT_DELETE_TASK (2)
51 // 用来显示错误代码
52 static unsigned char Error_code_G = 0;
53 static unsigned char RTCCounter = 0;
54
55
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 2
56 /*---------------------------------------------------------*-
57 * 函数名称: SCH_Update_Server()
58 * 入 口:
59 * 出 口:
60 * 函数功能: 调度器的中断服务程序
61 *
62 * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的
63 * RunMe标志加1,然后该任务将由调度程序执行.
64 *
65 * 当前版本: 1.1 * 取代版本:
66 * 作 者: wsl * 原作者 : Michael J.Pont
67 * 完成日期: 2006-09-14 * 完成日期:
68 -*---------------------------------------------------------*/
69 void SCH_Update_Server(void)interrupt 5
70 {
71 1 static unsigned char KeytimeRunCnt;
72 1 TF2 = 0; // 必须手工清除
73 1
74 1 if( (++RTCCounter == 200) )
75 1 {
76 2 RTCCounter = 0;
77 2 RTC_Soft_clock(); /*定时器例行程序*/
78 2 /*每秒钟查询一次是否有闹铃时间到*/
79 2 if (RingIDRegister > 0)
80 2 { /*响铃*/
81 3 Ring_server();
82 3 }
83 2 }
84 1
85 1 if (++KeytimeRunCnt == 2)
86 1 {
87 2 KeytimeRunCnt = 0;
88 2 KeyPad(); /*每10毫秒扫描一次键盘*/
89 2 }
90 1 FlashFreq();
91 1 SCH_Updata();
92 1 }
93
94
95 /*---------------------------------------------------------*-
96 * 函数名称: SCH_Dispatch_Tasks()
97 * 入 口:
98 * 出 口:
99 * 函数功能: 调度函数,当一个任务()需要运行时,此函数将运行它,
100 *
101 * 说 明: 这个函数必须被主循环(重复)调用
102 *
103 * 当前版本: 1.1 * 取代版本:
104 * 作 者: wsl * 原作者 : Michael J.Pont
105 * 完成日期: 2006-09-14 * 完成日期:
106 -*---------------------------------------------------------*/
107 void SCH_Dispatch_Tasks(void)
108 {
109 1 unsigned char Index;
110 1
111 1 // 调度(运行)下一个任务(如果有任务就绪)
112 1 for (Index=0; Index<SCH_MAX_TASKS; Index++)
113 1 {
114 2 if (SCH_tasks_G[Index].RunMe > 0)
115 2 {
116 3 // 运行任务
117 3 (*SCH_tasks_G[Index].pTask)();
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 3
118 3 // 复位 / 降低RunMe标志
119 3 SCH_tasks_G[Index].RunMe -= 1;
120 3
121 3 // 周期性的任务将自动地再次运行
122 3 // 如果这个是'单次'任务,将它从队列中删除
123 3 if (SCH_tasks_G[Index].Period == 0)
124 3 {
125 4 SCH_Delete_Task(Index);
126 4 }
127 3 }
128 2 }
129 1
130 1 // 报告系统状况
131 1 SCH_Report_Status();
132 1 }
133
134 /*---------------------------------------------------------*-
135 * 函数名称: SCH_Report_Status()
136 * 入 口:
137 * 出 口:
138 * 函数功能: 用来显示错误代码
139 *
140 * 说 明: 错误只在有限的时间内显示,此后错误代码被复位为0.
141 *
142 * 当前版本: 1.1 * 取代版本:
143 * 作 者: wsl * 原作者 : Michael J.Pont
144 * 完成日期: 2006-09-14 * 完成日期:
145 -*---------------------------------------------------------*/
146 void SCH_Report_Status(void)
147 {
148 1 // 只在需要报告错误时适用
149 1 // 检查新的错误代码
150 1 if (Error_code_G != 0)
151 1 {
152 2 switch (Error_code_G)
153 2 {
154 3 case 1: uart_send_string("Tasks Full\n", 0); break; // 任务队列已满
155 3 case 2: uart_send_string("No Tasks\n", 0); break; // 这里没有任务
156 3 default: break;
157 3 }
158 2 }
159 1
160 1 Error_code_G = 0; // 复位错误代码
161 1 }
162
163
164 /*---------------------------------------------------------*-
165 * 函数名称: SCH_Add_Task()
166 * 入 口: (*pFunction)任务指针,(DELAY)到第一次运行间隔时标,
167 * (PERIOD)每次运行的间隔时标
168 *
169 * 出 口: 返回SCH_MAX_TASKS表示任务队列已满
170 * 返回(Index)=任务位置
171 *
172 * 函数功能: 用来添加任务到任务队列上,以保证它们在需要的时
173 * 候被调用
174 *
175 * 说 明: 使任务函数每隔一定间隔或在用户的延迟之后执行.
176 *
177 * 当前版本: 1.1 * 取代版本:
178 * 作 者: wsl * 原作者 : Michael J.Pont
179 * 完成日期: 2006-09-14 * 完成日期:
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 4
180 -*---------------------------------------------------------*/
181 unsigned char SCH_Add_Task(void (code *pFunction)(), // 任务指针
182 const unsigned int DELAY, // 延迟Delay个时标后函数将第一次运行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -