1、缓冲池
RTXPOOL.A51
实现创建缓冲池 _os_create_pool、申请缓冲区 _os_get_block、释放缓冲区内存 _os_free_block
_os_create_pool:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
RTX_ALLOW_DRV_INT
; Check the block-size
MOV A, R7
ORL A, R6
JNZ INPUT_OK1
MOV R7, #NOT_OK
JMP END_POOL
_os_get_block:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
RTX_ALLOW_DRV_INT
; Check the block-size
MOV A, R7
ORL A, R6
JNZ INPUT_OK2
MOV R6, #00H
MOV R7, #00H
JMP END_POOL
_os_free_block:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
RTX_ALLOW_DRV_INT
; Check the block-size
MOV A, R7
ORL A, R6
JNZ INPUT_OK3
MOV R7, #NOT_OK
JMP END_POOL
2、队列
RTXQUOP.A51
各种信号的入队、离队操作
-
信号
-
?RTX_SIG_ENQUEUE
-
?RTX_SIG_DEQUEUE
-
消息
-
?RTX_MSG_ENQUEUE
-
?RTX_MSG_DEQUEUE
-
非完全等待任务
-
?RTX_NFL_ENQUEUE
-
?RTX_NFL_DEQUEUE
-
令牌
-
?RTX_SEM_ENQUEUE
-
?RTX_SEM_DEQUEUE
-
超时
-
?RTX_TMO_ENQUEUE
-
?RTX_TMO_DEQUEUE
-
周期等待
-
?RTX_IVL_ENQUEUE
-
任务等待位设置
-
?RTX_INT_ENQUEUE
-
复位等待位标志
-
?RTX_INTSIG_DEQUEUE
3、获取当前运行任务id
RTXRUNID.A51
os_running_task_id:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
MOV A, ?RTX_RUNNING_TID
ANL A, #1FH ; A = internal task_num
MOV DPH, #HIGH(?RTX_INTERNAL_NUM_TABLE)
ADD A, #LOW(?RTX_INTERNAL_NUM_TABLE)
MOV DPL, A
MOVX A, @DPTR ; Get the ext. task-num
MOV R7, A
CLR ?RTX_SUPERVISOR_MODE ; supervisor_mode := OFF
DBG_SYS_EXIT
RTX_ALLOW_INT
RET
4、消息、信号发送及系统令牌调用
RTXSEND.A51
- 发送消息
_os_send_message:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
; Copy the C-51 parameters to the used registers
; (this Version uses the original V3.20 Register-Layout
; in this function)
MOVR R2, R3 ; timeout
MOVR R6, R5 ; LOW(message)
MOVR R5, R4 ; HIGH(message)
MOVR R4, R7 ; mailbox no
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
RTX_ALLOW_DRV_INT
- 发送信号
_os_send_signal:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
; Check task-number
MOV A, R7
SETB C
SUBB A, #?RTX_MAXTASKN
JC EVAL_INTERNAL_NUM
; Number is greater than the maximum used task-number
MOV R7, #NOT_OK
JMP END_SEND
- 令牌调用
_os_send_token:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
; Check semaphore-number
MOV A, R7
JNB ACC.3, SEM_NOTOK
ANL A, #0F0H
JZ SEM_OK
5、系统延时
RTXWAIT.A51
对系统延时函数_os_wait的实现
_os_wait:
_os_wait2:
DBG_SYS_ENTRY
RTX_EXCLUDE_INT
SETB ?RTX_SUPERVISOR_MODE ; Supervisor_mode := on
MOV A, R5
MOV R4, A ; store timeout to R4
RTX_ALLOW_DRV_INT
; Set up pointer to task_state
MOV A, ?RTX_RUNNING_TID
ANL A, #1FH
RL A
RL A
ADD A, #LOW(?RTX_STATE_TABLE)
MOV DPL, A
MOV DPH, #HIGH (?RTX_STATE_TABLE) ; DPTR-->task_state[task_no]
; Ensure R4 = 0FFH, if R4=0 and event bit "d"=0
MOV A, R7
JB ACC.7, TMO
CJNE R4, #0, TMO
MOV R4, #0FFH ; R4=0 --> R4=0FFH
6、版权
RIGHT.A51
name COPYRIGHT_METTLER_FUCHS_AG_1991_2001
END
7、系统参数配置
RTXCONF.A51
用户对系统参数的设置,例如,时间片长度、系统滴答时钟的选择、芯片器件的选择等等,具体配置在RTXSETUP.INC进行设置,再导入到此处进行配置,所以用户实际配置文件是RTXSETUP.INC
8、总结
到这里,RTX 51 FULL所有源码就全浏览了一边,对RTX 51 也就有一定的初步了解!