📄 conf_tny.lst
字号:
197 ; Table of Task Entry Pointers
198 ;------------------------------------------------
199 PUBLIC ?RTX_TASKENTRY
200
201 ?RTX?TASKENT?S SEGMENT CODE
---- 202 RSEG ?RTX?TASKENT?S
0000 203 ?RTX_TASKENTRY: DS 2
204
205 ;------------------------------------------------
206 ; Table of Stack Pointers for each task
207 ;------------------------------------------------
208 PUBLIC ?RTX_TASKSP
209
210 ?RTX?TASKSP?S SEGMENT IDATA
---- 211 RSEG ?RTX?TASKSP?S
0000 212 ?RTX_TASKSP: DS 1
213
214 ;------------------------------------------------
215 ; Table of Task Timer/State Pointers
216 ;------------------------------------------------
217 PUBLIC ?RTX_TASKSTATUS
218
219 ?RTX?TASKSTATE?S SEGMENT IDATA
---- 220 RSEG ?RTX?TASKSTATE?S
0000 221 ?RTX_TASKSTATUS:
0000 222 TimerVal: DS 1 ; Task Timer (Software Timer for each task)
0001 223 TaskState: DS 1 ; Task Status (state of each Task)
224
225 ; Definitions for Bits in Task State
226 ; TaskState.0 = Wait for Signal
227 ; TaskState.1 = Wait for TimeOut
228 ; TaskState.2 = Signal Flag
229 ; TaskState.3 = TimeOut Flag
230 ; TaskState.4 = Task Ready (Wait for Running)
231 ; TaskState.5 = Task Active (enabled with os_create)
232 ; TaskState.6 = Round Robin Time Out
233 ; TaskState.7 = Run Flag
234
235 ; byte mask definitions
0001 236 K_SIG EQU 1
0002 237 K_TMO EQU 2
0004 238 SIG_EVENT EQU 4
0008 239 TMO_EVENT EQU 8
0010 240 K_READY EQU 16
0020 241 K_ACTIVE EQU 32
0040 242 K_ROBIN EQU 64
0080 243 K_IVL EQU 128 ; not a task state bit; only used in os_wait
0080 244 RDY_EVENT EQU 128 ; READY status flag
0080 245 K_RDY EQU 128 ; READY status flag
246
247 ; bit position definitions
0000 248 B_WAITSIG EQU 0
0001 249 B_WAITTIM EQU 1
0002 250 B_SIGNAL EQU 2
0003 251 B_TIMEOUT EQU 3
0004 252 B_READY EQU 4
0005 253 B_ACTIVE EQU 5
0006 254 B_ROBIN EQU 6
0007 255 B_IVL EQU 7 ; not a task state bit; only used in os_wait
0007 256 B_RDY EQU 7
A51 MACRO ASSEMBLER CONF_TNY 12/09/2008 16:32:51 PAGE 5
257
258
259 IF (TIMESHARING OR CPU_IDLE_CODE)
?RTX?BITS SEGMENT BIT
RSEG ?RTX?BITS
ENDIF
263
264 IF (TIMESHARING)
?RTX_TS_DELAY: DBIT 1 ; Status bit set when task switch in progress
ENDIF
267
268 IF (CPU_IDLE_CODE)
?RTX_ISR_SIG: DBIT 1 ; Status bit set when interrupt or os_set_signal
ENDIF
271
272
---- 273 CSEG AT 0BH
000B 020000 F 274 JMP TIMERINT
275
276 ?RTX?CODE SEGMENT CODE
---- 277 RSEG ?RTX?CODE
278 USING 0 ; Registerbank 0 for following code
279
280 IF (FREE_STACK <> 0)
0000 281 ?RTX_STACKERROR:
282 STACK_ERROR ; User defined Stack Error Code
285 ENDIF
286
0004 287 HW_TIMER: HW_TIMER_CODE
290
0005 291 TIMERINT:
292
293 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
305
0005 120000 F 306 CALL HW_TIMER ; Enable Interrupts again.
307
0008 85D00B 308 MOV ?RTX_SAVEPSW,PSW
000B 75D008 309 MOV PSW,#?RTX_REGISTERBANK
000E FA 310 MOV saveacc,A
311 ; Update 8051 Interrupt Timer
000F C28C 312 CLR TR0
0011 E58A 313 MOV A,TL0
0013 24FC 314 ADD A,#LOW (?RTX_CLOCK + 7)
0015 F58A 315 MOV TL0,A
0017 E58C 316 MOV A,TH0
0019 34E5 317 ADDC A,#HIGH (?RTX_CLOCK + 7)
001B F58C 318 MOV TH0,A
001D D28C 319 SETB TR0
320
321 IF (FREE_STACK <> 0)
322 ; Check if enough free stack is available
001F EC 323 MOV A,currenttask
0020 2400 F 324 ADD A,#?RTX?TASKSP?S+1
0022 F8 325 MOV R0,A
0023 E6 326 MOV A,@R0
A51 MACRO ASSEMBLER CONF_TNY 12/09/2008 16:32:51 PAGE 6
0024 BC0002 F 327 CJNE currenttask,#?RTX_MAXTASKN,checkstack
0027 74FF 328 MOV A,#RAMTOP
0029 C3 329 checkstack: CLR C
002A 9581 330 SUBB A,SP
002C B41400 331 CJNE A,#FREE_STACK,$+3
002F 40CF 332 JC ?RTX_STACKERROR
333 ENDIF
334
335 ; Update & Check Task Timers
0031 7900 F 336 MOV R1,#?RTX_MAXTASKN+1
0033 7800 F 337 MOV R0,#?RTX?TASKSTATE?S
0035 16 338 TIMERLOOP: DEC @R0 ; Decrement timer
0036 E6 339 MOV A,@R0
0037 08 340 INC R0 ; advance to TaskState
0038 700B 341 JNZ NoTimeout
003A C2AF 342 CLR EA
003C E6 343 MOV A,@R0
003D 30E103 344 JNB ACC.B_WAITTIM,NoWaitTimeout
0040 4418 345 ORL A,#(K_READY+TMO_EVENT)
0042 F6 346 MOV @R0,A
0043 D2AF 347 NoWaitTimeout: SETB EA
0045 08 348 NoTimeout: INC R0 ; advance to TaskTimer
0046 D9ED 349 DJNZ R1,TIMERLOOP
350
0048 EA 351 MOV A,saveacc
0049 8BD0 352 MOV PSW,savepsw
353 USING 0 ; Registerbank 0 for following code
354
355 IF (TIMESHARING == 0)
356 ; Round Robin Task Switching not required. System Interrupt ends here
004B 357 ?RTX?SET_ISR:
358 IF (CPU_IDLE_CODE)
SETB ?RTX_ISR_SIG
ENDIF
004B 22 361 RET
362 ENDIF
363
364 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
A51 MACRO ASSEMBLER CONF_TNY 12/09/2008 16:32:51 PAGE 7
MOV A,?RTX_CURRENTTASK
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -