📄 sch51.lst
字号:
183 const unsigned int PERIOD) // 连续的运行之间的间隔(时标)
184 {
185 1 unsigned char Index = 0;
186 1 // 首先在队列中找到一个空隙(如果有的话)
187 1 while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
188 1 {
189 2 Index++; // 如果没有,就在队列中一下位置检索
190 2 }
191 1
192 1 // 是否已经到达队列的结尾?
193 1 if (Index == SCH_MAX_TASKS)
194 1 {
195 2 // 任务队列已满
196 2 // 设置全局错误变量
197 2 Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
198 2 // 同时返回错误代码
199 2 return SCH_MAX_TASKS;
200 2 }
201 1
202 1 // 如果能运行到这里,则说明任务队列中有空间
203 1 SCH_tasks_G[Index].pTask = pFunction;
204 1 SCH_tasks_G[Index].Delay = DELAY;
205 1 SCH_tasks_G[Index].Period = PERIOD;
206 1 SCH_tasks_G[Index].RunMe = 0;
207 1 // 返回任务的位置(以便以后删除)
208 1 return Index;
209 1 }
210
211
212 /*---------------------------------------------------------*-
213 * 函数名称: SCH_Delete_Task()
214 * 入 口: TASK_INDEX -任务索引.由SCH_Add_task()提供
215 *
216 * 出 口: 返回值: RETURN_ERROR(或)RETURN_NORMAL
217 *
218 * 函数功能: 从调度器删除任务.
219 *
220 * 说 明: 请注意:并不是从存储器中删除相关的函数,仅仅是不再
221 * 由调度器调用这个任务.
222 *
223 * 当前版本: 1.1 * 取代版本:
224 * 作 者: wsl * 原作者 : Michael J.Pont
225 * 完成日期: 2006-09-14 * 完成日期:
226 -*---------------------------------------------------------*/
227 bit SCH_Delete_Task(const unsigned char TASK_INDEX)
228 {
229 1 bit Return_code;
230 1
231 1 if (SCH_tasks_G[TASK_INDEX].pTask == 0)
232 1 {
233 2 // 这里没有任务
234 2 // 设置全局错误变量
235 2 Error_code_G = ERROR_SCH_CANNOT_DELETE_TASK;
236 2 // 同时返回错误代码
237 2 Return_code = RETURN_ERROR;
238 2 }
239 1 else
240 1 {
241 2 Return_code = RETURN_NORMAL;
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 5
242 2 }
243 1
244 1 // 删除任务
245 1 SCH_tasks_G[TASK_INDEX].pTask = 0x00;
246 1 SCH_tasks_G[TASK_INDEX].Delay = 0;
247 1 SCH_tasks_G[TASK_INDEX].Period = 0;
248 1 SCH_tasks_G[TASK_INDEX].RunMe = 0;
249 1
250 1 // 返回状态
251 1 return Return_code;
252 1 }
253
254 /*---------------------------------------------------------*-
255 * 函数名称: SCH_Update()
256 * 入 口:
257 * 出 口:
258 * 函数功能: 在调度器的中断服务程序中运行
259 *
260 * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的
261 * RunMe标志加1,然后该任务将由调度程序执行.
262 *
263 * 当前版本: 1.1 * 取代版本:
264 * 作 者: wsl * 原作者 : Michael J.Pont
265 * 完成日期: 2006-09-14 * 完成日期:
266 -*---------------------------------------------------------*/
267 void SCH_Updata(void)
268 {
269 1 unsigned char Index;
270 1 // 注意: 计算单位为"时标" (不是毫秒)
271 1 for (Index=0; Index < SCH_MAX_TASKS; Index++)
272 1 {
273 2 // 检测这里是否有任务?
274 2 if (SCH_tasks_G[Index].pTask != 0)
275 2 {
276 3 if (SCH_tasks_G[Index].Delay == 0)
277 3 {
278 4 // 任务需要运行
279 4 SCH_tasks_G[Index].RunMe += 1; // RunMer标志加1
280 4 if (SCH_tasks_G[Index].Period != 0)
281 4 {
282 5 // 调度定期的任务再次运行
283 5 SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
284 5 }
285 4 }
286 3 else
287 3 {
288 4 // 还没有准备好运行,延迟减1
289 4 SCH_tasks_G[Index].Delay -= 1;
290 4 }
291 3 }
292 2 }
293 1 }
294 /*---------------------------------------------------------*-
295 * 函数名称: SCH_Init_Timer2()
296 * 入 口:
297 * 出 口:
298 * 函数功能: 准备调度器数据结构并且设置定时器以所需的频率中断
299 *
300 * 说 明: 调度器初始化化函数,必须在使用调度器之前调用它
301 *
302 * 当前版本: 1.1 * 取代版本:
303 * 作 者: wsl * 原作者 : Michael J.Pont
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 6
304 * 完成日期: 2006-09-14 * 完成日期:
305 -*---------------------------------------------------------*/
306 void SCH_Init_Timer2(void)
307 {
308 1 unsigned char i;
309 1
310 1 for (i=0; i<SCH_MAX_TASKS; i++)
311 1 {
312 2 SCH_Delete_Task(i);
313 2 }
314 1
315 1 // 复位全局错误变量
316 1 // - SCH_Delete_Task()将产生一个错误代码
317 1 // (因为任务队列是空的)
318 1 // Error_code_G = 0;
319 1
320 1 // 设置定时器2
321 1 // 16位定时自动重装
322 1 T2CON = 0x04;
323 1
324 1 TH2 = PRELOAD_05mS_H;
325 1 RCAP2H = PRELOAD_05mS_H;
326 1 TL2 = PRELOAD_05mS_L;
327 1 RCAP2L = PRELOAD_05mS_L;
328 1
329 1 ET2 = 1; // 使能定时器2中断
330 1 TR2 = 1; // 启动定时器2
331 1 }
332
333
334 /*---------------------------------------------------------*-
335 * 函数名称: SCH_Start()
336 * 入 口:
337 * 出 口:
338 * 函数功能: 通过允许中断来启动调度器
339 *
340 * 说 明: 在添加了所有定期的任务之后调用,从而使任务保持同步.
341 * 注意:应该只使能调度器中断
342 *
343 * 当前版本: 1.1 * 取代版本:
344 * 作 者: wsl * 原作者 : Michael J.Pont
345 * 完成日期: 2006-09-14 * 完成日期:
346 -*---------------------------------------------------------*/
347 void SCH_Start(void)
348 {
349 1 EA = 1;
350 1 }
351
352
353
354
355
356 //**************END OF FILE*********************************
357
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 504 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 59 3
C51 COMPILER V8.08 SCH51 10/02/2007 07:17:23 PAGE 7
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -