1、版本信息

VERSION.A51

NAME    RTX51_LIB____VERSION_0V700

2、RTX 51与Keil C51 编程接口

RTX2C51.A51
例如寄存器组、系统上下文、标志位、任务描述表等入口地址:

        System-Constants
PUBLIC   ?RTX_EXTREGSIZE
;        Flags
PUBLIC   ?RTX_TS_DELAY, ?RTX_TS_REQ
;        Initial-Task-Descriptor Table
PUBLIC   ?RTX_TASKCONST
;        Table for external to internal task-number conversion
PUBLIC   ?RTX_USER_NUM_TABLE
;        Shows the interrupts used by ISR-Routines
PUBLIC   ?RTX_ISRDESCR
;        Taskswitching for Floating-Point Operations
PUBLIC   ?RTX_TASKSWITCHING

3、中断

RTXATTA.A51
对函数os_attach_interrupt和os_detach_interrupt的实现

  1. os_attach_interrupt:
_os_attach_interrupt:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE ; Supervisor_mode := onRTX_ALLOW_DRV_INTRTX_ALLOW_DRV_INT; Check the input parameterMOV   A, R7SETB  CSUBB  A, #?RTX_MAX_INT_NBRJC    PARA_OK1; Input parameter is not okMOV   R7, #NOT_OKJMP   END_ATTACH
  1. os_detach_interrupt:
_os_detach_interrupt:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := on; Check the input parameterMOV   A, R7SETB  CSUBB  A, #?RTX_MAX_INT_NBRJC    PARA_OK2; Input parameter is not okMOV   R7, #NOT_OKJMP   END_DETACH

4、任务快

RTXBLOCK.A51
这个部分分为:快速任务块、标准任务快。

  1. 快速任务块:
?RTX?DBLOCK?RTXBLOCK  SEGMENT CODERSEG    ?RTX?DBLOCK?RTXBLOCK
?RTX_DBLOCK:MOV   A, R0                      ; save R0JB    ?RTX_RUNNING_TID.1, DBLOCK3JB    ?RTX_RUNNING_TID.0, DBLOCK2
  1. 标准任务快:
?RTX?NDBLOCK?RTXBLOCK  SEGMENT CODERSEG    ?RTX?NDBLOCK?RTXBLOCK
?RTX_NDBLOCK:  MOV   A, ?RTX_RUNNING_TID        ; Extract standard taskANL   A, #00FH                   ; (non driver task) noMOV   B, A                       ; save task-noMOV   A, #LOW(?RTX_KNTXT_PTR_TABLE)ADD   A, BADD   A, BMOV   DPL, AMOV   DPH, #HIGH(?RTX_KNTXT_PTR_TABLE)MOVX  A, @DPTRMOV   B, AINC   DPLMOVX  A, @DPTRMOV   DPL, AMOV   DPH, B                     ; DPTR -> kntxt ACC; Saved context(R7)=NIL_EVENTMOV   A, #NIL_EVENTINC   DPLMOVX  @DPTR, A; Prepare DPTR-offset for SPMOV   B, #0CH; Check if save of R6..R4 requestedCJNE  R3, #1, STACK_SAV; Store R6INC   DPLMOV   A, R6MOVX  @DPTR, A; Store R5INC   DPLMOV   A, R5MOVX  @DPTR, A; Store R4INC   DPLMOV   A, R4MOVX  @DPTR, A; Correct DPTR-offset for SPMOV   B, #09H

5、信号的清除

RTXCLEAR.A51
对_os_clear_signal的实现

_os_clear_signal:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := onRTX_ALLOW_DRV_INTRTX_EXCLUDE_INT; Check task-numberMOV   A, R7SETB  CSUBB  A, #?RTX_MAXTASKNJC    EVAL_INTERNAL_NUM; Number is greater than the maximum used task-numberMOV   R7, #NOT_OKJMP   END_CLEAR

6、系统时钟

RTXCLK.A51
对系统时钟的初始化以及中断服务

  1. 设置系统时钟重装载值
SYSCLK_RELOAD  MACROLOCAL ENDLGLOBAL_INT_DISABLECLR   ?RTX_TCONTROLMOV   DPL, #LOW(?RTX_SYS_TICK)MOV   DPH, #HIGH(?RTX_SYS_TICK)INC   DPL                        ; Get low byte firstMOVX  A, @DPTRADD   A, ?RTX_TLOWMOV   ?RTX_TLOW, ADEC   DPLMOVX  A, @DPTR                   ; Get high byteADDC  A, ?RTX_THIGHMOV   ?RTX_THIGH, AJNC   ENDL                       ; Check if compensate-overflow; Compensate overflow. Set the timer to -50 for immediate; Clock-INTMOV   ?RTX_THIGH, #0FFHMOV   ?RTX_TLOW, #0CDH
  1. 系统时钟初始化
SYSCLK_INIT    MACROCLR   ?RTX_TCONTROL              ; Stop timer 0CLR   ?RTX_TFLAG                 ; Clear int. requestMOV   DPH, #HIGH(?RTX_SYS_TICK)  ; Get count valuesMOV   DPL, #LOW(?RTX_SYS_TICK)MOVX  A, @DPTRMOV   ?RTX_THIGH, A              ; Load countersINC   DPLMOVX  A, @DPTRMOV   ?RTX_TLOW, A;MOV   A, ?RTX_TCON               ; Set initial valuesANL   A, #?RTX_TCON_AND_MASK     ; for TCON registerORL   A, #?RTX_TCON_OR_MASK      ; (if required)MOV   ?RTX_TCON, A;MOV   A, ?RTX_TMODANL   A, #?RTX_TMOD_AND_MASK     ; Use timer 0 as 16ORL   A, #?RTX_TMOD_OR_MASK      ; bit timerMOV   ?RTX_TMOD, A;SETB  ?RTX_TCONTROL              ; Enable countingENDM

3.系统时钟中断服务

?RTX_SYSCLK_INTHNDLR:; Check if already in the system-clock handlerJNB   ?RTX_SYSCLK_ISR, ENTRY_OKSETB  ?RTX_TFLAG                 ; re-activate overflow-INTRETI
  1. 系统时间片的设置
_os_set_slice:DBG_SYS_ENTRYRTX_EXCLUDE_INT; Check the time sliceCLR     CMOV     A,R7SUBB    A,#LOW(CLK_SLICE_MIN)MOV     A,R6SUBB    A,#HIGH(CLK_SLICE_MIN)JC      OSS_1SETB    CMOV     A,R7SUBB    A,#LOW(CLK_SLICE_MAX)MOV     A,R6SUBB    A,#HIGH(CLK_SLICE_MAX)JC      OSS_2

7、任务创建与调度

RTXCREA.A51
对_os_create_task的实现

os_create_task:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := onRTX_ALLOW_DRV_INT; Test if the task is not already startedMOV   DPH, #HIGH(?RTX_USER_NUM_TABLE)MOV   A, #LOW(?RTX_USER_NUM_TABLE)ADD   A, R7MOV   DPL, A; DPTR -> user_num_table[user_task_num]MOVX  A, @DPTRCLR   CSUBB  A, #NO_TASKJZ    TASK_OK                    ; Task does not existJMP   ERR_EXIT

8、系统数据变量的声明

RTXDATA.A51
包含各种字段的定义、中断向量表、任务就绪表、邮箱和信号量控制块等等

?RTX_DISP_TMP1: DS      1       ; Temp. var. for RTXDISP (do NOT use elsewhere)
?RTX_DISP_TMP2: DS      1       ; Temp. var. for RTXDISP (do NOT use elsewhere)
?RTX_DISP_TMP3: DS      1       ; Temp. var. for RTXDISP (do NOT use elsewhere)
?RTX_DISP_TMP4: DS      1       ; Temp. var. for RTXDISP (do NOT use elsewhere)
?RTX_DISP_TMP5: DS      1       ; Temp. var. for RTXDISP (do NOT use elsewhere)
?RTX_RDY_PRIO0:      DS      16              ; Ready list FIFO for prio. = 0
?RTX_RDY_PRIO0_END:
?RTX_RDY_PRIO1:      DS      16              ; Ready list FIFO for prio. = 1
?RTX_RDY_PRIO1_END:
?RTX_RDY_PRIO2:      DS      16              ; Ready list FIFO for prio. = 2
?RTX_RDY_PRIO2_END:
?RTX_RDY_PRIO3:      DS      16              ; Ready list FIFO for prio. = 3
?RTX_RDY_PRIO3_END:
?RTX_INT0_TID:       DS       1              ; Interrupt owner list (#=0..15)
?RTX_INT1_TID:       DS       1              ;
?RTX_INT2_TID:       DS       1              ;
?RTX_INT3_TID:       DS       1              ;
?RTX_INT4_TID:       DS       1              ;
?RTX_INT5_TID:       DS       1              ;
?RTX_INT6_TID:       DS       1              ;
?RTX_INT7_TID:       DS       1              ;
?RTX_INT8_TID:       DS       1              ;
?RTX_INT9_TID:       DS       1              ;
?RTX_INT10_TID:      DS       1              ;
?RTX_INT11_TID:      DS       1              ;
?RTX_INT12_TID:      DS       1              ;
?RTX_INT13_TID:      DS       1              ;
?RTX_INT14_TID:      DS       1              ;
?RTX_INT15_TID:      DS       1              ;

9、系统调试

RTXDBG.A51

  • 获取所有邮箱状态:
_os_check_mailboxes:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := onMOV   R0, #0                     ; R0 -> counter
  • 获取已定义邮箱状态:
_os_check_mailbox:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := on; Check the mailbox-parameterMOV   A, R7SETB  CSUBB  A, #7HJC    MBX_OK; input parameter not okMOV   R7, #NOT_OKJMP   CX_END
  • 获取所有信息量状态
_os_check_semaphores:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := onMOV   R0, #0                     ; R0 = counter
  • 获取已定义信息量状态
_os_check_semaphore:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := on; Check the semaphore parameterMOV   A, R7JNB   ACC.3, SEM_NOTOKANL   A, #0F0HJZ    SEM_OK
  • 获取所有任务状态
_os_check_tasks:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := onMOV   R0, #0                     ; R0 -> task-counter
  • 获取系统中当前有效任务的状态
_os_check_task:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := on; Check if valid tasknumberMOV   A, R7SETB  CSUBB  A, #?RTX_MAXTASKNJC    EVAL_INTERNAL_NUM; Number is greater than the maximum used task-numberMOV   R7, #NOT_OKJMP   CHK_TSK_END
  • 获取内存池信息
_os_check_pool:DBG_SYS_ENTRYRTX_EXCLUDE_INTSETB  ?RTX_SUPERVISOR_MODE       ; Supervisor_mode := onMOV   A, R7ORL   A, R6JNZ   CP_INP_OKMOV   R7, #NOT_OKJMP   CP_END

10、总结:

主要简要概述了各个文件的功能以及罗列了功能实现的主要代码,阅读时,打开源码,可参照上面的主要代码进行定位,阅读每个功能的具体实现!

RTX 51 FULL源码学习(2.1)相关推荐

  1. postgresql源码学习(51)—— 提交日志CLOG 原理 用途 管理函数

    一. CLOG是什么 CLOG(commit log)记录事务的最终状态. 物理上,是$PGDATA/pg_xact目录下的一些文件 逻辑上,是一个数组,下标为事务id,值为事务最终状态 1. 事务最 ...

  2. Api demo源码学习(8)--App/Activity/QuickContactsDemo --获取系统联系人信息

    本节通过Content Provider机制获取系统中的联系人信息,注意这个Anctivity直接继承的是ListActivity,所以不再需要setContentView函数来加载布局文件了(我自己 ...

  3. ABP框架源码学习之修改默认数据库表前缀或表名称

    ABP框架源码学习之修改默认数据库表前缀或表名称 1,源码 1 namespace Abp.Zero.EntityFramework 2 { 3 /// <summary> 4 /// E ...

  4. gallery3d源码学习总结(一)——绘制流程drawFocusItems

    eoe·Android开发者门户 标题: gallery3d源码学习总结(一)--绘制流程drawFocusItems [打印本页] 作者: specialbrian    时间: 2010-10-2 ...

  5. 以太坊源码学习(一) 正本清源

    以太坊源码学习(一)正本清源 背景 geth源码一直在不断增加,优化,发展到现在已经非常庞大,第一次看geth源码,会有不小的难度.虽然如此,还是可以从geth仓库的第一个commit开始,这时的代码 ...

  6. 【iScroll源码学习01】准备阶段 - 叶小钗

    [iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文  http://www.cnblogs.com/yexiaochai/p/3 ...

  7. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  8. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  9. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

最新文章

  1. Atom 编辑器实时预览 HTML 页面
  2. pic1路AD转换c语言,pic单片机的ad转换(实例解析)
  3. vue获取当前日期和时间并进行格式化
  4. 西华大学计算机学院陈鹏,中国计算机学会CCF服务计算专委会走进西华大学
  5. 数字奇数和偶数的判断
  6. java 视频 缩略图_如何使用java提取视频缩略图或某一帧的图片
  7. html 中用canvas加载图片,【实例】使用canvas缓缓加载一个图片到web页面中
  8. java 适配器模式记载学习
  9. thinkpad分区win10_预装win10系统Thinkpad笔记本只有一个C盘怎么分区
  10. C语言求斐波那契数列前10项
  11. dspic flash不够后,选择优化等级
  12. 软件测试——软件开发过程
  13. 保存 Hexo 博客源码到 GitHub
  14. 51单片机流水灯方法大全
  15. 在Mac里读取NTFS格式的盘
  16. 面试题:你让工人为你工作7天,给工人的回报是一根金条...
  17. matlab收益率,债券价格与收益率的Matlab实现(10页)-原创力文档
  18. 用python画一个正方形
  19. 小米迎来NLP首席科学家王斌:中科院研究员,雷军崔宝秋亲学弟
  20. Day507508509510.图灵学院之面试题② -面经

热门文章

  1. 2020我的上半年好书推荐
  2. 如何选择我的搜索引擎关键字?
  3. [VIM]VIM/GVIM中代码的折叠和打开
  4. python实现图片转字符画_Python实现图片转字符画的示例
  5. Flutter 之简洁实用的图片编辑器
  6. Python爬虫:制作一个属于自己的IP代理模块2
  7. 实战演练 Navicat 中英文模式切换
  8. cityengine规则建模实例
  9. eclipse不编译的原因
  10. oge 封包工具 封包_什么是封包?