📄 conf_tny.lst
字号:
ENDIF
205
206
207 ;------------------------------------------------
208 ; Table of Task Entry Pointers
209 ;------------------------------------------------
210 PUBLIC ?RTX_TASKENTRY
211
212 ?RTX?TASKENT?S SEGMENT CODE
---- 213 RSEG ?RTX?TASKENT?S
0000 214 ?RTX_TASKENTRY: DS 2
215
216 ;------------------------------------------------
217 ; Table of Stack Pointers for each task
218 ;------------------------------------------------
219 PUBLIC ?RTX_TASKSP
220
221 ?RTX?TASKSP?S SEGMENT IDATA
---- 222 RSEG ?RTX?TASKSP?S
0000 223 ?RTX_TASKSP: DS 1
224
225 ;------------------------------------------------
226 ; Table of Task Timer/State Pointers
227 ;------------------------------------------------
228 PUBLIC ?RTX_TASKSTATUS
229
230 ?RTX?TASKSTATE?S SEGMENT IDATA
---- 231 RSEG ?RTX?TASKSTATE?S
0000 232 ?RTX_TASKSTATUS:
0000 233 TimerVal: DS 1 ; Task Timer (Software Timer for each task)
0001 234 TaskState: DS 1 ; Task Status (state of each Task)
235
236 ; Definitions for Bits in Task State
237 ; TaskState.0 = Wait for Signal
238 ; TaskState.1 = Wait for TimeOut
239 ; TaskState.2 = Signal Flag
240 ; TaskState.3 = TimeOut Flag
241 ; TaskState.4 = Task Ready (Wait for Running)
242 ; TaskState.5 = Task Active (enabled with os_create)
243 ; TaskState.6 = Round Robin Time Out
244 ; TaskState.7 = Run Flag
245
246 ; byte mask definitions
0001 247 K_SIG EQU 1
0002 248 K_TMO EQU 2
0004 249 SIG_EVENT EQU 4
0008 250 TMO_EVENT EQU 8
0010 251 K_READY EQU 16
0020 252 K_ACTIVE EQU 32
0040 253 K_ROBIN EQU 64
0080 254 K_IVL EQU 128 ; not a task state bit; only used in os_wait
0080 255 RDY_EVENT EQU 128 ; READY status flag
0080 256 K_RDY EQU 128 ; READY status flag
A51 MACRO ASSEMBLER CONF_TNY 12/27/2008 15:34:43 PAGE 5
257
258 ; bit position definitions
0000 259 B_WAITSIG EQU 0
0001 260 B_WAITTIM EQU 1
0002 261 B_SIGNAL EQU 2
0003 262 B_TIMEOUT EQU 3
0004 263 B_READY EQU 4
0005 264 B_ACTIVE EQU 5
0006 265 B_ROBIN EQU 6
0007 266 B_IVL EQU 7 ; not a task state bit; only used in os_wait
0007 267 B_RDY EQU 7
268
269
270 IF (TIMESHARING OR CPU_IDLE_CODE)
271 ?RTX?BITS SEGMENT BIT
---- 272 RSEG ?RTX?BITS
273 ENDIF
274
275 IF (TIMESHARING)
0000 276 ?RTX_TS_DELAY: DBIT 1 ; Status bit set when task switch in progress
277 ENDIF
278
279 IF (CPU_IDLE_CODE)
0001 280 ?RTX_ISR_SIG: DBIT 1 ; Status bit set when interrupt or os_set_signal
281 ENDIF
282
283
---- 284 CSEG AT 0BH
000B 020000 F 285 JMP TIMERINT
286
287 ?RTX?CODE SEGMENT CODE
---- 288 RSEG ?RTX?CODE
289 USING 0 ; Registerbank 0 for following code
290
291 IF (FREE_STACK <> 0)
0000 292 ?RTX_STACKERROR:
293 STACK_ERROR ; User defined Stack Error Code
296 ENDIF
297
0004 298 HW_TIMER: HW_TIMER_CODE
301
0005 302 TIMERINT:
303
304 IF (LONG_USR_INTR)
PUSH ACC
MOV A,PSW
ANL A,#018H
XRL A,#?RTX_REGISTERBANK
JNZ CONT_TIMINT
; avoid recursive timer interrupt
POP ACC
RETI ; Return from Recursive Timer Interrupt
CONT_TIMINT: POP ACC
ENDIF
316
0005 120000 F 317 CALL HW_TIMER ; Enable Interrupts again.
318
0008 85D00B 319 MOV ?RTX_SAVEPSW,PSW
000B 75D008 320 MOV PSW,#?RTX_REGISTERBANK
000E FA 321 MOV saveacc,A
322 ; Update 8051 Interrupt Timer
000F C28C 323 CLR TR0
0011 E58A 324 MOV A,TL0
0013 240D 325 ADD A,#LOW (?RTX_CLOCK + 7)
0015 F58A 326 MOV TL0,A
A51 MACRO ASSEMBLER CONF_TNY 12/27/2008 15:34:43 PAGE 6
0017 E58C 327 MOV A,TH0
0019 34F4 328 ADDC A,#HIGH (?RTX_CLOCK + 7)
001B F58C 329 MOV TH0,A
001D D28C 330 SETB TR0
331
332 IF (FREE_STACK <> 0)
333 ; Check if enough free stack is available
001F EC 334 MOV A,currenttask
0020 2400 F 335 ADD A,#?RTX?TASKSP?S+1
0022 F8 336 MOV R0,A
0023 E6 337 MOV A,@R0
0024 BC0002 F 338 CJNE currenttask,#?RTX_MAXTASKN,checkstack
0027 74FF 339 MOV A,#RAMTOP
0029 C3 340 checkstack: CLR C
002A 9581 341 SUBB A,SP
002C B41400 342 CJNE A,#FREE_STACK,$+3
002F 40CF 343 JC ?RTX_STACKERROR
344 ENDIF
345
346 ; Update & Check Task Timers
0031 7900 F 347 MOV R1,#?RTX_MAXTASKN+1
0033 7800 F 348 MOV R0,#?RTX?TASKSTATE?S
0035 16 349 TIMERLOOP: DEC @R0 ; Decrement timer
0036 E6 350 MOV A,@R0
0037 08 351 INC R0 ; advance to TaskState
0038 700B 352 JNZ NoTimeout
003A C2AF 353 CLR EA
003C E6 354 MOV A,@R0
003D 30E103 355 JNB ACC.B_WAITTIM,NoWaitTimeout
0040 4418 356 ORL A,#(K_READY+TMO_EVENT)
0042 F6 357 MOV @R0,A
0043 D2AF 358 NoWaitTimeout: SETB EA
0045 08 359 NoTimeout: INC R0 ; advance to TaskTimer
0046 D9ED 360 DJNZ R1,TIMERLOOP
361
0048 EA 362 MOV A,saveacc
0049 8BD0 363 MOV PSW,savepsw
364 USING 0 ; Registerbank 0 for following code
365
366 IF (TIMESHARING == 0)
; Round Robin Task Switching not required. System Interrupt ends here
?RTX?SET_ISR:
IF (CPU_IDLE_CODE)
SETB ?RTX_ISR_SIG
ENDIF
RET
ENDIF
374
375 IF (TIMESHARING)
376 ; Round Robin Task Switching required. Check if task generates timeout
377 ; Check for Round Robin Timeout on the current task
004B 300003 F 378 JNB ?RTX_TS_DELAY,CheckRobinTime
004E 379 NoRobinTimeout:
004E 380 ?RTX?SET_ISR:
381 IF (CPU_IDLE_CODE)
004E D200 F 382 SETB ?RTX_ISR_SIG
383 ENDIF
0050 22 384 RET
0051 D50DFA 385 CheckRobinTime: DJNZ ?RTX_ROBINTIME,NoRobinTimeout
386
0054 387 ?RTX_TASKSWITCHING:
0054 C0E0 388 PUSH ACC
0056 C0D0 389 PUSH PSW
0058 C0F0 390 PUSH B
005A C083 391 PUSH DPH
005C C082 392 PUSH DPL
A51 MACRO ASSEMBLER CONF_TNY 12/27/2008 15:34:43 PAGE 7
005E C000 393 PUSH AR0
0060 C001 394 PUSH AR1
0062 C002 395 PUSH AR2
0064 C003 396 PUSH AR3
0066 C004 397 PUSH AR4
0068 C005 398 PUSH AR5
006A C006 399 PUSH AR6
006C C007 400 PUSH AR7
401 IF (CODE_BANKING <> 0)
PUSH ?B_CURRENTBANK
ENDIF
404
006E E50C 405 MOV A,?RTX_CURRENTTASK
0070 23 406 RL A
0071 2400 F 407 ADD A,#?RTX?TASKSTATE?S+1
0073 F8 408 MOV R0,A
0074 7440 409 MOV A,#K_ROBIN
0076 C2AF 410 CLR EA
0078 46 411 ORL A,@R0
0079 F6 412 MOV @R0,A
007A D2AF 413 SETB EA
414 IF (CODE_BANKING <> 0)
SJMP os_switch_task1
ENDIF
417 ENDIF
418
419 ;------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -