KEIL中的一些细节

时间:2023-03-08 20:31:21

1。KEIL中的指针:

基于存储器的指针:数据类型 [指向存储区]  *[ 指针存储区]指针变量

char xdata * px         //px本身存在于自动分配的空间,一般位于data中,指向的内容位于xdata
char xdata * data px    //px本身存在于data空间,指向的内容位于xdata
data char xdata * px =char xdata *data px;

data空间:内部ram 0~128字节

xdata空间:外部扩展ram, 用movx 及间址访问

一般指针两种类型:默认是万能的,分配三个字节空间

指针本身地址

+0(0X05)

+1(0X06)

+2(0X07)

存放内容

数据类型

高8位数据

低8位数据

例:OSTCBCur(0X05=0X000014)

MOV  R0,#LOW (OSTCBCur)       //取得指针的最低地址;R0=0X05

2。汇编相关

$NOMOD51            // disable predefined  registers//禁能预定义的  寄存器
#include <reg52.h>    // include CPU definition file (for example, )// 包含 CPU 定义文件(例如,)

EXTRN CODE (code_symbol)    ; May be a subroutine entry declared in
                            ; CODE segments or with CODE directive.
                            ; 可以是在 CODE 段中或用伪指令CODE
                            ; 声明的子程序入口
EXTRN DATA (data_symbol)    ; May be any symbol declared in DATA segments
                            ; segments or with DATA directive.
                            ; 可以是在 DATA 段中或用伪指令 DATA
                            ; 声明的的任意符号。
PUBLIC data_variable        ; 此处,你可以把符号输出到其它模块
PUBLIC code_entry           ; 此处,你可以把符号输出到其它模块

NAME   ?C_STARTUP           ;// NAME 模块名 ;与文件名无关          

       ?C_C51STARTUP    SEGMENT   CODE        ; 把 ?C_C51STARTUP     定义在CODE 中。
       ?STACK            SEGMENT   IDATA      ; 把 ?STACK 定义在IDATA RAM 中。
                RSEG    ?STACK                ;//切换到 ?STACK 段
                        DS                   ;//保留一个字节
                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP

                CSEG    AT                  ;程序绝对起始位置0000

定义重定位段 必须按照C51 格式定义汇编遵守C51 规范段名格式为 : ?PR?函数名?模块名
;声明引用全局变量和外部子程序 注意关键字为EXTRN 没有E
全局变量名直接引用
无参数/无寄存器参数函数 FUNC
带寄存器参数函数 _FUNC
重入函数 _?FUNC

3.keil的printf默认为向串口输出.在一些特定的时候需要软件调试一下我们的程序是否有问题,我们需要使用printf()来输出过程数据做跟踪可是在keil里我发现直接就写上printf("start debug");根本不能输出到终端窗口,在程序的初始化部分往串口数据寄存器SBUF里放一个字符来起用终端显示;

如:

SBUF=' ';

printf("Welcome to debug software!\n");

原因:由于不管是中断还是查询TI标志的方法,都会检测TI,因此首次发送必须置位TI标志,使串口开始发送“在程序的初始化部分往串口数据寄存器SBUF里放一个字符来起用终端显示;”方法最终作用也就是把TI置1,改成TI=1;来启动发送也是一样的