?? conf_tny.lst
字號:
196 PUBLIC ?RTX_TASKENTRY
197
198 ?RTX?TASKENT?S SEGMENT CODE
---- 199 RSEG ?RTX?TASKENT?S
0000 200 ?RTX_TASKENTRY: DS 2
201
202 ;------------------------------------------------
203 ; Table of Stack Pointers for each task
204 ;------------------------------------------------
205 PUBLIC ?RTX_TASKSP
206
207 ?RTX?TASKSP?S SEGMENT IDATA
---- 208 RSEG ?RTX?TASKSP?S
0000 209 ?RTX_TASKSP: DS 1
210
211 ;------------------------------------------------
212 ; Table of Task Timer/State Pointers
213 ;------------------------------------------------
214 PUBLIC ?RTX_TASKSTATUS
215
216 ?RTX?TASKSTATE?S SEGMENT IDATA
---- 217 RSEG ?RTX?TASKSTATE?S
0000 218 ?RTX_TASKSTATUS:
0000 219 TimerVal: DS 1 ; Task Timer (Software Timer for each task)
0001 220 TaskState: DS 1 ; Task Status (state of each Task)
221
222 ; Definitions for Bits in Task State
223 ; TaskState.0 = Wait for Signal
224 ; TaskState.1 = Wait for TimeOut
225 ; TaskState.2 = Signal Flag
226 ; TaskState.3 = TimeOut Flag
227 ; TaskState.4 = Task Ready (Wait for Running)
228 ; TaskState.5 = Task Active (enabled with os_create)
229 ; TaskState.6 = Round Robin Time Out
230 ; TaskState.7 = Run Flag
231
232 ; byte mask definitions
0001 233 K_SIG EQU 1
0002 234 K_TMO EQU 2
0004 235 SIG_EVENT EQU 4
0008 236 TMO_EVENT EQU 8
0010 237 K_READY EQU 16
0020 238 K_ACTIVE EQU 32
0040 239 K_ROBIN EQU 64
0080 240 K_IVL EQU 128 ; not a task state bit; only used in os_wait
0080 241 RDY_EVENT EQU 128 ; READY status flag
0080 242 K_RDY EQU 128
243
244 ; bit position definitions
0000 245 B_WAITSIG EQU 0
0001 246 B_WAITTIM EQU 1
0002 247 B_SIGNAL EQU 2
0003 248 B_TIMEOUT EQU 3
0004 249 B_READY EQU 4
0005 250 B_ACTIVE EQU 5
0006 251 B_ROBIN EQU 6
0007 252 B_IVL EQU 7 ; not a task state bit; only used in os_wait
0007 253 B_RDY EQU 7
254
255
A51 MACRO ASSEMBLER CONF_TNY 05/18/2006 20:46:25 PAGE 5
256 IF (TIMESHARING OR CPU_IDLE_CODE)
257 ?RTX?BITS SEGMENT BIT
---- 258 RSEG ?RTX?BITS
259 ENDIF
260
261 IF (TIMESHARING)
?RTX_TS_DELAY: DBIT 1 ; Status bit set when task switch in progress
ENDIF
264
265 IF (CPU_IDLE_CODE)
0000 266 ?RTX_ISR_SIG: DBIT 1 ; Status bit set when interrupt or os_set_signal
267 ENDIF
268
269
---- 270 CSEG AT 0BH
000B 020000 F 271 JMP TIMERINT
272
273 ?RTX?CODE SEGMENT CODE
---- 274 RSEG ?RTX?CODE
275 USING 0 ; Registerbank 0 for following code
276
277 IF (FREE_STACK <> 0)
0000 278 ?RTX_STACKERROR:
279 STACK_ERROR ; User defined Stack Error Code
282 ENDIF
283
0004 284 HW_TIMER: HW_TIMER_CODE
287
0005 288 TIMERINT:
289
290 IF (LONG_USR_INTR)
0005 C0E0 291 PUSH ACC
0007 E5D0 292 MOV A,PSW
0009 5418 293 ANL A,#018H
000B 6408 294 XRL A,#?RTX_REGISTERBANK
000D 7003 295 JNZ CONT_TIMINT
296 ; avoid recursive timer interrupt
000F D0E0 297 POP ACC
0011 32 298 RETI ; Return from Recursive Timer Interrupt
0012 D0E0 299 CONT_TIMINT: POP ACC
300
301 ENDIF
302
0014 120000 F 303 CALL HW_TIMER ; Enable Interrupts again.
304
0017 85D00B 305 MOV ?RTX_SAVEPSW,PSW
001A 75D008 306 MOV PSW,#?RTX_REGISTERBANK
001D FA 307 MOV saveacc,A ; ACC required by some Cygnal devices
308 ; Update 8051 Interrupt Timer
001E C28C 309 CLR TR0
0020 E58A 310 MOV A,TL0
0022 24F7 311 ADD A,#LOW (?RTX_CLOCK + 7)
0024 F58A 312 MOV TL0,A
0026 E58C 313 MOV A,TH0
0028 34D8 314 ADDC A,#HIGH (?RTX_CLOCK + 7)
002A F58C 315 MOV TH0,A
002C D28C 316 SETB TR0
317
318 IF (FREE_STACK <> 0)
319 ; Check if enough free stack is available
002E EC 320 MOV A,currenttask
002F 2400 F 321 ADD A,#?RTX?TASKSP?S+1
0031 F8 322 MOV R0,A
0032 E6 323 MOV A,@R0
0033 BC0002 F 324 CJNE currenttask,#?RTX_MAXTASKN,checkstack
0036 74FF 325 MOV A,#RAMTOP
A51 MACRO ASSEMBLER CONF_TNY 05/18/2006 20:46:25 PAGE 6
0038 C3 326 checkstack: CLR C
0039 9581 327 SUBB A,SP
003B B41400 328 CJNE A,#FREE_STACK,$+3
003E 40C0 329 JC ?RTX_STACKERROR
330 ENDIF
331
332 ; Update & Check Task Timers
0040 7900 F 333 MOV R1,#?RTX_MAXTASKN+1
0042 7800 F 334 MOV R0,#?RTX?TASKSTATE?S
0044 16 335 TIMERLOOP: DEC @R0 ; Decrement timer
0045 E6 336 MOV A,@R0
0046 08 337 INC R0 ; advance to TaskState
0047 700B 338 JNZ NoTimeout
0049 C2AF 339 CLR EA
004B E6 340 MOV A,@R0
004C 30E103 341 JNB ACC.B_WAITTIM,NoWaitTimeout
004F 4418 342 ORL A,#(K_READY+TMO_EVENT)
0051 F6 343 MOV @R0,A
0052 D2AF 344 NoWaitTimeout: SETB EA
0054 08 345 NoTimeout: INC R0 ; advance to TaskTimer
0055 D9ED 346 DJNZ R1,TIMERLOOP
347
0057 EA 348 MOV A,saveacc
0058 8BD0 349 MOV PSW,savepsw
350 USING 0 ; Registerbank 0 for following code
351
352 IF (TIMESHARING == 0)
353 ; Round Robin Task Switching not required. System Interrupt ends here
005A 354 ?RTX?SET_ISR:
355 IF (CPU_IDLE_CODE)
005A D200 F 356 SETB ?RTX_ISR_SIG
357 ENDIF
005C 22 358 RET
359 ENDIF
360
361 IF (TIMESHARING)
; Round Robin Task Switching required. Check if task generates timeout
; Check for Round Robin Timeout on the current task
JNB ?RTX_TS_DELAY,CheckRobinTime
NoRobinTimeout:
?RTX?SET_ISR:
IF (CPU_IDLE_CODE)
SETB ?RTX_ISR_SIG
ENDIF
RET
CheckRobinTime: DJNZ ?RTX_ROBINTIME,NoRobinTimeout
?RTX_TASKSWITCHING:
PUSH ACC
PUSH PSW
PUSH B
PUSH DPH
PUSH DPL
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
IF (CODE_BANKING <> 0)
PUSH ?B_CURRENTBANK
ENDIF
MOV A,?RTX_CURRENTTASK
A51 MACRO ASSEMBLER CONF_TNY 05/18/2006 20:46:25 PAGE 7
RL A
ADD A,#?RTX?TASKSTATE?S+1
MOV R0,A
MOV A,#K_ROBIN
CLR EA
ORL A,@R0
MOV @R0,A
SETB EA
IF (CODE_BANKING <> 0)
SJMP os_switch_task1
ENDIF
ENDIF
404
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -