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;来启动发送也是一样的