RTX 51 FULL源码学习(2.1)
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的实现
- 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
- 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
这个部分分为:快速任务块、标准任务快。
- 快速任务块:
?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
- 标准任务快:
?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
对系统时钟的初始化以及中断服务
- 设置系统时钟重装载值
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
- 系统时钟初始化
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
- 系统时间片的设置
_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)相关推荐
- postgresql源码学习(51)—— 提交日志CLOG 原理 用途 管理函数
一. CLOG是什么 CLOG(commit log)记录事务的最终状态. 物理上,是$PGDATA/pg_xact目录下的一些文件 逻辑上,是一个数组,下标为事务id,值为事务最终状态 1. 事务最 ...
- Api demo源码学习(8)--App/Activity/QuickContactsDemo --获取系统联系人信息
本节通过Content Provider机制获取系统中的联系人信息,注意这个Anctivity直接继承的是ListActivity,所以不再需要setContentView函数来加载布局文件了(我自己 ...
- ABP框架源码学习之修改默认数据库表前缀或表名称
ABP框架源码学习之修改默认数据库表前缀或表名称 1,源码 1 namespace Abp.Zero.EntityFramework 2 { 3 /// <summary> 4 /// E ...
- gallery3d源码学习总结(一)——绘制流程drawFocusItems
eoe·Android开发者门户 标题: gallery3d源码学习总结(一)--绘制流程drawFocusItems [打印本页] 作者: specialbrian 时间: 2010-10-2 ...
- 以太坊源码学习(一) 正本清源
以太坊源码学习(一)正本清源 背景 geth源码一直在不断增加,优化,发展到现在已经非常庞大,第一次看geth源码,会有不小的难度.虽然如此,还是可以从geth仓库的第一个commit开始,这时的代码 ...
- 【iScroll源码学习01】准备阶段 - 叶小钗
[iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文 http://www.cnblogs.com/yexiaochai/p/3 ...
- Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...
- Shiro源码学习之一
一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
最新文章
- Atom 编辑器实时预览 HTML 页面
- pic1路AD转换c语言,pic单片机的ad转换(实例解析)
- vue获取当前日期和时间并进行格式化
- 西华大学计算机学院陈鹏,中国计算机学会CCF服务计算专委会走进西华大学
- 数字奇数和偶数的判断
- java 视频 缩略图_如何使用java提取视频缩略图或某一帧的图片
- html 中用canvas加载图片,【实例】使用canvas缓缓加载一个图片到web页面中
- java 适配器模式记载学习
- thinkpad分区win10_预装win10系统Thinkpad笔记本只有一个C盘怎么分区
- C语言求斐波那契数列前10项
- dspic flash不够后,选择优化等级
- 软件测试——软件开发过程
- 保存 Hexo 博客源码到 GitHub
- 51单片机流水灯方法大全
- 在Mac里读取NTFS格式的盘
- 面试题:你让工人为你工作7天,给工人的回报是一根金条...
- matlab收益率,债券价格与收益率的Matlab实现(10页)-原创力文档
- 用python画一个正方形
- 小米迎来NLP首席科学家王斌:中科院研究员,雷军崔宝秋亲学弟
- Day507508509510.图灵学院之面试题② -面经