📄 conf_tny.lst
字号:
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
256 IF (TIMESHARING OR CPU_IDLE_CODE)
A51 MACRO ASSEMBLER CONF_TNY 02/14/2009 15:37:26 PAGE 5
257 ?RTX?BITS SEGMENT BIT
---- 258 RSEG ?RTX?BITS
259 ENDIF
260
261 IF (TIMESHARING)
0000 262 ?RTX_TS_DELAY: DBIT 1 ; Status bit set when task switch in progress
263 ENDIF
264
265 IF (CPU_IDLE_CODE)
?RTX_ISR_SIG: DBIT 1 ; Status bit set when interrupt or os_set_signal
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)
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
302
0005 120000 F 303 CALL HW_TIMER ; Enable Interrupts again.
304
0008 85D00B 305 MOV ?RTX_SAVEPSW,PSW
000B 75D008 306 MOV PSW,#?RTX_REGISTERBANK
000E AAE0 307 MOV saveacc,ACC ; ACC required by some Cygnal devices
308 ; Update 8051 Interrupt Timer
0010 C28C 309 CLR TR0
0012 E58A 310 MOV A,TL0
0014 245F 311 ADD A,#LOW (?RTX_CLOCK + 7)
0016 F58A 312 MOV TL0,A
0018 E58C 313 MOV A,TH0
001A 349E 314 ADDC A,#HIGH (?RTX_CLOCK + 7)
001C F58C 315 MOV TH0,A
001E D28C 316 SETB TR0
317
318 IF (FREE_STACK <> 0)
319 ; Check if enough free stack is available
0020 EC 320 MOV A,currenttask
0021 2400 F 321 ADD A,#?RTX?TASKSP?S+1
0023 F8 322 MOV R0,A
0024 E6 323 MOV A,@R0
0025 BC0002 F 324 CJNE currenttask,#?RTX_MAXTASKN,checkstack
0028 747F 325 MOV A,#RAMTOP
002A C3 326 checkstack: CLR C
A51 MACRO ASSEMBLER CONF_TNY 02/14/2009 15:37:26 PAGE 6
002B 9581 327 SUBB A,SP
002D B41400 328 CJNE A,#FREE_STACK,$+3
0030 40CE 329 JC ?RTX_STACKERROR
330 ENDIF
331
332 ; Update & Check Task Timers
0032 7900 F 333 MOV R1,#?RTX_MAXTASKN+1
0034 7800 F 334 MOV R0,#?RTX?TASKSTATE?S
0036 16 335 TIMERLOOP: DEC @R0 ; Decrement timer
0037 E6 336 MOV A,@R0
0038 08 337 INC R0 ; advance to TaskState
0039 700B 338 JNZ NoTimeout
003B C2AF 339 CLR EA
003D E6 340 MOV A,@R0
003E 30E103 341 JNB ACC.B_WAITTIM,NoWaitTimeout
0041 4418 342 ORL A,#(K_READY+TMO_EVENT)
0043 F6 343 MOV @R0,A
0044 D2AF 344 NoWaitTimeout: SETB EA
0046 08 345 NoTimeout: INC R0 ; advance to TaskTimer
0047 D9ED 346 DJNZ R1,TIMERLOOP
347
0049 EA 348 MOV A,saveacc
004A 8BD0 349 MOV PSW,savepsw
350 USING 0 ; Registerbank 0 for following code
351
352 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
360
361 IF (TIMESHARING)
362 ; Round Robin Task Switching required. Check if task generates timeout
363 ; Check for Round Robin Timeout on the current task
004C 300001 F 364 JNB ?RTX_TS_DELAY,CheckRobinTime
004F 365 NoRobinTimeout:
004F 366 ?RTX?SET_ISR:
367 IF (CPU_IDLE_CODE)
SETB ?RTX_ISR_SIG
ENDIF
004F 22 370 RET
0050 D50DFC 371 CheckRobinTime: DJNZ ?RTX_ROBINTIME,NoRobinTimeout
372
0053 373 ?RTX_TASKSWITCHING:
0053 C0E0 374 PUSH ACC
0055 C0D0 375 PUSH PSW
0057 C0F0 376 PUSH B
0059 C083 377 PUSH DPH
005B C082 378 PUSH DPL
005D C000 379 PUSH AR0
005F C001 380 PUSH AR1
0061 C002 381 PUSH AR2
0063 C003 382 PUSH AR3
0065 C004 383 PUSH AR4
0067 C005 384 PUSH AR5
0069 C006 385 PUSH AR6
006B C007 386 PUSH AR7
387 IF (CODE_BANKING <> 0)
PUSH ?B_CURRENTBANK
ENDIF
390
006D E50C 391 MOV A,?RTX_CURRENTTASK
006F 23 392 RL A
A51 MACRO ASSEMBLER CONF_TNY 02/14/2009 15:37:26 PAGE 7
0070 2400 F 393 ADD A,#?RTX?TASKSTATE?S+1
0072 F8 394 MOV R0,A
0073 7440 395 MOV A,#K_ROBIN
0075 C2AF 396 CLR EA
0077 46 397 ORL A,@R0
0078 F6 398 MOV @R0,A
0079 D2AF 399 SETB EA
400 IF (CODE_BANKING <> 0)
SJMP os_switch_task1
ENDIF
403 ENDIF
404
405 ;------------------------------------------------
406 ; Perform a Task-Switch
407 ; void os_switch_task (void)
408 ; uchar i;
409 ; uchar limit;
410
411 ;---- Variable 'current' assigned to Register 'R6' ----
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -