📄 os_core.lst
字号:
C51 COMPILER V7.06 OS_CORE 02/25/2006 14:24:57 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE OS_CORE
OBJECT MODULE PLACED IN OS_core.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE OS_core.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*******************************************************
2 *************基于51内核的圈圈操作系统*****************
3 本程序只供学习使用,未经作者许可,不得用于其它任何用途
4
5 OS_core.c file
6
7 Created by Computer-lov
8 Date: 2005.10.27
9
10 Edit date:2006.2.24
11
12 Version V1.0
13 Copyright(C) Computer-lov 2005-2015
14 All rigths reserved
15
16 ******************************************************/
17
18 #include "at89x52.h"
19
20 #include "OS_core.h"
21 #include "task_switch.h"
22 #include "MAIN.H"
23
24 #include "UART.H"
25
26
27 //OS运行标志
28 volatile unsigned char OS_Running;
29
30 //运行时间
31 volatile unsigned int OS_Run_Time;
32
33 //程序控制块
34 idata volatile PCB OS_pcb[MAX_TASK];
35
36 //当前运行任务的ID号
37 volatile unsigned char OS_Current_ID;
38
39 //用来统计使用了多少次OS_Enter_Critical
40 //以判断使用OS_Exit_Critical退出临界段时是否需要真的退出
41 //如果没有这样的判断,当OS_Enter_Critical被嵌套使用时,
42 //会因为中间的OS_Exit_Critical退出临界段,而导致后半部分得不到保护
43 volatile unsigned char OS_En_Cr_Count;
44
45
46 //一字节,用位来表志是否存在一个任务
47 // 例如,0000 0101 表示0号跟2号任务存在
48 volatile unsigned char OS_Task_List;
49
50
51 //堆栈申请。堆栈被分成5个块。每个块大小为0x1B(即27字节)
52 //在os_core.h中修改S_DEPTH宏可修改堆栈的大小
53 //在os_core.h中修改MAX_TASK可改变最大任务数,注意:现在最多可支持8个任务
54 unsigned char idata OS_Stack[MAX_TASK][S_DEPTH];
55
C51 COMPILER V7.06 OS_CORE 02/25/2006 14:24:57 PAGE 2
56
57 ///////////////////////////////////挂起任务 ////////////////////////////////////////////////
58 void OS_Suspend(void)
59 {
60 1 OS_Enter_Critical(); //进入临界段
61 1 if(OS_Current_ID==0) //任务0不能挂起!!!
62 1 {
63 2 OS_Exit_Critical();
64 2 return;
65 2 }
66 1 OS_pcb[OS_Current_ID].Suspend=1; //任务挂起
67 1 OS_Exit_Critical(); //退出临界段
68 1 OS_Task_Switch(); //任务切换
69 1 }
70 ////////////////////////////////////////////////////////////////////////////////////////////
71
72 /////////////////////////////////////调用该函数使任务延时t个时钟节拍////////////////////////
73 ///////////////////////////////////// 输入参数:0<t<256 //////////////////////////////
74 ///////////////////////////////////// 一个时钟节拍为10mS ///////////////////////////////
75 void OS_Delay(unsigned char t)
76 {
77 1 if(t==0)return; //如果t=0,则不延迟
78 1 OS_Enter_Critical(); //进入临界段
79 1 if(OS_Current_ID==0) //任务0不能延时!!!
80 1 {
81 2 OS_Exit_Critical();
82 2 return;
83 2 }
84 1 OS_pcb[OS_Current_ID].Suspend=1; //任务挂起
85 1 OS_pcb[OS_Current_ID].Delay=t; //设置延迟节拍数
86 1 OS_Exit_Critical(); //退出临界段
87 1 OS_Task_Switch(); //任务切换
88 1 }
89 ////////////////////////////////////////////////////////////////////////////////////////////
90
91
92 //////////////////////////////// 等待消息 /////////////////////////////////////////////////
93 ////////////////////////////////入口参数:等待超时时间 0-255 //////////////////////////////
94 ///////////////////////////////返回:0-超时 1-不超时 //////////////////////////////////////
95 unsigned char OS_Wait_Msg(unsigned char time_out)
96 {
97 1 if(time_out==0) //如果超时时间设置为0
98 1 {
99 2 OS_Suspend(); //则无限等待
100 2 return 1; //返回
101 2 }
102 1 OS_Delay(time_out); //等待直到超时或者被其它任务唤醒
103 1 OS_Enter_Critical(); //进入临界段
104 1 if(OS_pcb[OS_Current_ID].Delay==0) //如果是因为由于时间到了而被唤醒,则超时
105 1 {
106 2 OS_Exit_Critical(); //退出临界段
107 2 return 0; //返回0,表示等待超时
108 2 }
109 1 else //如果等待时间未到而被唤醒,则没有超时
110 1 {
111 2 OS_pcb[OS_Current_ID].Delay=0; //将多余的时间清0
112 2 OS_Exit_Critical(); //退出临界段
113 2 return 1; //返回1,表示等待消息成功,不超时
114 2 }
115 1 }
116 ////////////////////////////////////////////////////////////////////////////////////////////
117
C51 COMPILER V7.06 OS_CORE 02/25/2006 14:24:57 PAGE 3
118
119 /////////////////////////////////////// OS初始化 /////////////////////////////////////////
120 void OS_Init(void)
121 {
122 1 OS_Running=0; //任务未开始运行
123 1 OS_Run_Time=0; //运行时间为0
124 1 OS_Task_List=0; //任务列表为0
125 1 OS_En_Cr_Count=0; //进入临界段0次
126 1 }
127 ///////////////////////////////////////////////////////////////////////////////////////////
128
129
130 /////////////////////////////////////////创建一个任务////////////////////////////////////////////
131 ////////////////////////////// Task_Priority 任务优先级 /////////////////////////
132 /////////////////////////////// Task_p 任务入口地址 //////////////////////////
133 /////////////////////////////// Msg_p 消息起始地址 ///////////////////////////
134 unsigned int OS_Task_Create(unsigned char Task_Priority,unsigned int Task_p,unsigned char Msg_p)
135 {
136 1 static unsigned char i;
137 1 static unsigned char OK_flag;
138 1 static unsigned char Task_ID;
139 1 static unsigned char Stack_p;
140 1
141 1 OS_Enter_Critical(); //由于需要在运行过程中动态增加任务,所以需要临界段保护
142 1
143 1 OK_flag=0; //创建成功标志初始化为0,表示失败
144 1 for(i=0;i<MAX_TASK;i++) //查找资源
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -