KEIL中的一些细节
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;来启动发送也是一样的
KEIL中的一些细节的更多相关文章
- KEIL中启动文件详解(汇编语言)
原文在此:http://www.cnblogs.com/mddblog/p/4920063.html 概述 在嵌入式系统中,启动文件是整个系统非常关键的部分,它会进行一些底层的初始化,构建程序运行必要 ...
- keil中出现Undefined symbol FLASH_PrefetchBufferCmd (referred from main.o)等问题解决办法
在keil中仿照别人的程序写了RCC初始化的程序,编译后出现以下问题 .\obj\pro1.axf: Error: L6218E: Undefined symbol FLASH_PrefetchBuf ...
- keil中的串口调试:
keil中串口的虚拟调试信息在通过View-serial windows-#usart1/2/3/4/debug(printf)可以看到.当然也可以通过虚拟串口VSPD+串口调试助手在外部实现,方法如 ...
- Keil中的code关键字
一般说来,我们在C语言中定义的每一个变量初始化后都会占用一定的内存(RAM)空间.但是在keil中提供了一个特殊的关键字“code”,这个关键字在标准C中是没有的.其语法举例如下: unsigned ...
- 关于keil中data,idata,xdata,pdata,code的问题
转自关于keil中data,idata,xdata,pdata,code的问题 从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类 ...
- 在KEIL中的模块化程序写法
在使用KEIL的时候,我们习惯上在一个.c的文件中把自己要写的东西按照自己思路的顺序进行顺序书写.这样是很普遍的写法,当程序比较短的时候比如几十行或者一百多行,是没有什么问题的.但是当程序很长的时候, ...
- 在keil中使用Astyle格式化你的代码的方法
一个好的程序,不仅要有好的算法,同时也需要有良好的书写风格.写出好的算法不容易,但是好的代码风格却并不困难.提到格式化代码,Astyle是一个不能错过的工具,它可以方便的将程序代码格式化成自己想要的样 ...
- keil中for循环变量递减,无法跳出循环的问题
定义j时应注意其变量类型char,此循环当j=0时,再执行一次则keil中j=0XFF,而不是-1,所以无法跳出循环.但在vc6.0中是可以跳出循环的. 解决办法如下:不能让j的值为负数 uchar ...
- keil中使用_at_绝对地址定位
使用_at_关键字对存储器进行绝对地址定位程序如下: #include<reg51.h> ] _at_ 0x8000; main() { LED_Data[] = 0x23; } 在kei ...
随机推荐
- iOS 9之WatchKit for WatchOS 2
金田(github示例源码) 自AppleWatch发行的同时就可以为AppWatch开发相应的应用程序,不过最初的版本,能开发的功能极为有限,所以也只是有少数的App厂商为Apple定制了App,所 ...
- HDU5196--DZY Loves Inversions 树状数组 逆序数
题意查询给定[L, R]区间内 逆序对数 ==k的子区间的个数. 我们只需要求出 子区间小于等于k的个数和小于等于k-1的个数,然后相减就得出答案了. 对于i(1≤i≤n),我们计算ri表示[i,ri ...
- HDU5140---Hun Gui Wei Company (主席树)
主席树太强大了,,如果仅仅用来求第k大就太屈才了..貌似和HDU4605差不多,那个是在图上根据点的顺序建立主席树,这个是根据年龄大小 或者等级高低建立主席树. 题意 大致就是一个二维区间的求和,但是 ...
- java 自制类加载器的简单实现
package com.xiaomo.reflex; import java.io.File; import java.io.FileInputStream; import java.io.IOExc ...
- [Angular 2] Transclusion in Angular 2
Link: Blog Single transclude: <ng-content></ng-content> Multi-translcude: <ng-content ...
- [React Testing] JSX error diffs -- expect-jsx library
When writing React component tests, it can be hard to decipher the error diffs of broken tests, sinc ...
- C++11 : variadic templates(可变参数模板)
Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...
- Java基础知识强化53:经典排序之选择排序(SelectionSort)
1.选择排序的原理图: 2. 选择排序代码实现: package cn.itcast_02; /* * 数组排序之选择排序: * 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在 ...
- jquery之checkbox
//checkbox 数据回显 var publishRange=rowData.publishRange.split(","); for(var i = 0;i < pub ...
- 广播接收者 BroadcastReceiver 示例-1
广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者.广播作为Android组件间的通信方式,可以使用的场景如下: 1 ...