?? os_core.lst
字號(hào):
1: // os_core.c
2: // 名稱:mpOS ; 版本:ver 1.1
3: // 功能: 微動(dòng)力公司開發(fā)的操作系統(tǒng),面向PIC18F系列單片機(jī)
4: // 其它: 通過低級(jí)中斷服務(wù)程序進(jìn)行任務(wù)調(diào)度
5: // 這個(gè)版本是協(xié)作型的調(diào)度方式,帶有延時(shí)功能
6: // 每個(gè)用戶任務(wù)占用7個(gè)字節(jié)內(nèi)存
7:
8: #include "os_core.h"
9:
10: void interrupt HI_ISR(void)
11: {
12: unsigned char ibyte,itemp;
13:
14: if (RCIE&&RCIF) // 異步通信接收,數(shù)據(jù)放入二級(jí)緩沖
15: {
16: ibyte=RCREG;
17: if (FERR||OERR)
18: {
19:
20: }
21: else
22: {
23: itemp=osCommBuff.SavePosit;
24: osCommBuff. buff[itemp]=ibyte;
25: if (++itemp >=osCommBuffSize)
26: {
27: itemp=0; // 二級(jí)緩沖是FIFO的存儲(chǔ)方式
28: }
29: if (itemp==osCommBuff.GetPosit)
30: {
31: bCommBuffFull=1; // 緩沖區(qū)滿
32: }
33: osCommBuff.SavePosit=itemp;
34: if (ibyte==0x7e) // 如果接收同步碼,激活協(xié)議解釋任務(wù)
35: {
36: ;
37: }
38: }
39: }
40: }
41:
42: void interrupt low_priority LOW_ISR(void)
43: {
44: static unsigned char state,id;
45:
46: if(!bOSSCH&&TMR1H==0)
47: {
48: if (TMR1IE&&TMR1IF) // 操作系統(tǒng)時(shí)鐘基 10ms
49: {
50: for (id=0;id<OS_TASKS;id++)
51: {
52: if (TCB[id].osWaitTick)
53: {
54: TCB[id].osWaitTick --;
55: if (TCB[id].osWaitTick==0)
56: {
57: TCB[id].osTaskState=osTaskSta_Ready ;
58: }
59: }
60: }
61: }
62: }
63:
64: // 任務(wù)調(diào)度
65: TMR1IF=0;
66: bOSSCH=0;
67: //保存當(dāng)前正在運(yùn)行的任務(wù)指針
68: TCB[osRunningTask].osTaskStackTop=(unsigned int)(TOSH<<8)+TOSL;
69: osRunningTask=OS_TASKS;
70: for (id=0;id<OS_TASKS;id++)
71: {
72: state=TCB[id].osTaskState;
73: if (state==osTaskSta_Ready) //就緒的任務(wù),優(yōu)先級(jí)高的先運(yùn)行
74: {
75: // 要運(yùn)行的任務(wù)指針入棧頂
76: osRunningTask=id;
77: break;
78: }
79: }
80: osEnterOsFunction();
81: TOSH=TCB[osRunningTask].osTaskStackTop>>8;
82: TOSL=TCB[osRunningTask].osTaskStackTop;
83: osExitOsFunction();
84: }
85:
86: void osDelay(unsigned int ticks)
87: {
88: TCB[osRunningTask].osWaitTick=ticks;
89: TCB[osRunningTask].osTaskState =osTaskSta_Delay;
90: }
91:
92: void osExitTask(void)
93: {
94: TCB[osRunningTask].osWaitTick=0;
95: TCB[osRunningTask].osTaskState =osTaskSta_Stop;
96: TCB[osRunningTask].osTaskStackTop=TCB[osRunningTask].osTaskPtr;
97: }
98:
99: void osInit(void)
100: {
101: IPEN=1;
102: TMR1IP=0;
103:
104: TMR1ON=1;
105: TMR1IE=1;
106:
107: GIEL=1;
108: GIEH=1;
109: osRunningTask=OS_TASKS;
110: }
111:
112: void osCreateTask(void *taskPtr, unsigned char TaskID)
113: {
114: TCB[TaskID].osTaskPtr=(unsigned int)taskPtr;
115: TCB[TaskID].osTaskStackTop=TCB[TaskID].osTaskPtr;
116: TCB[TaskID].osTaskID=TaskID;
117: }
118:
119: void osTaskIdle(void)
120: {
121: while (1)
122: {
123: GIEL=1;
124: GIE=1;
125: GIEH=1;
126: clrwdt();
127: osSch();
128: }
129: }
130: unsigned char OpenComm(unsigned char RxTx )
131: {
132:
133: if (RxTx==0x01) // 只發(fā)送
134: {
135: return 1;
136: }
137: else if (RxTx==0x10) //只接收
138: {
139: return 1;
140: }
141: else if (RxTx==0x11) // 發(fā)送和接收
142: {
143: return 1;
144: }
145: else // 參數(shù)錯(cuò)誤
146: {
147: return 0;
148: }
149: }
150:
151: void CloseComm(void)
152: {
153:
154: }
155:
156: unsigned char
157: osGetCommBuff(unsigned char bytes,unsigned char *ptr)
158: {
159: unsigned char i,j;
160: if (bytes==0) return 0;
161: if (osCommBuff.SavePosit==osCommBuff.GetPosit) return 0;
162: if (osCommBuff.SavePosit>osCommBuff.GetPosit)
163: {
164: bytes= osCommBuff.SavePosit-osCommBuff.GetPosit;
165: }
166: else
167: {
168: bytes= osCommBuffSize-osCommBuff.GetPosit+osCommBuff.SavePosit;
169: }
170: i=bytes;
171: do{
172: j=osCommBuff.GetPosit;
173: *ptr=osCommBuff.buff[j];
174: osCommBuff.GetPosit ++;
175: if (osCommBuff.GetPosit>=osCommBuffSize) osCommBuff.GetPosit=0;
176: }while(--i);
177: return bytes;
178: }
179:
180: unsigned char osChkCommBuff(void)
181: {
182: unsigned char bytes;
183: if (osCommBuff.SavePosit>=osCommBuff.GetPosit)
184: {
185: bytes= osCommBuff.SavePosit>=osCommBuff.GetPosit;
186: }
187: else
188: {
189: bytes= osCommBuffSize-osCommBuff.GetPosit+osCommBuff.SavePosit;
190: }
191: return bytes;
192: }
193:
194: unsigned char
195: Wr45DB041(unsigned char *addr,unsigned char *buff,unsigned char cnt)
196: {
197:
198:
199: return 1;
200: }
201:
202: unsigned char
203: Rd45DB041(unsigned char *addr,unsigned char *buff,unsigned char cnt)
204: {
205:
206:
207: return 1;
208: }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -