Keil C51与Keil ARM共存

发布者:epsilon15最新更新时间:2016-12-12 来源: eefocus关键字:Keil  C51  ARM 手机看文章 扫描二维码
随时随地手机看文章

第一节 绝对地址访问 

C51提供了三种访问绝对地址的方法: 
1. 绝对宏: 

在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括: 
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 

具体使用可看一看absacc.h便知 

例如: 
rval=CBYTE[0x0002];指向程序存贮器的0002h地址 
rval=XWORD [0x0002];指向外RAM的0004h地址 
2. _at_关键字 
直接在数据定义后加上_at_ const即可,但是注意: 

(1)绝对变量不能被初使化; 

(2)bit型函数及变量不能用_at_指定。 

例如: 
idata struct link list _at_ 0x40;指定list结构从40h开始。 
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始 
提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。 

3. 连接定位控制 

此法是利用连接控制指令code xdata pdata data bdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。

第二节 Keil C51与汇编的接口

1. 模块内接口 
方法是用#pragma语句具体结构是: 
#pragma asm 
汇编行 
#pragma endasm 

这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中。

2. 模块间接口 

C模块与汇编模块的接口较简单,分别用C51与A51对源文件进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。 
(1) 通过寄存器传递函数参数 
最多只能有3个参数通过寄存器传递,规律如下表: 

参数数目

char

int

long,float

一般指针

1
2
3

R7
R5
R3

R6 & R7
R4 & R5
R2 & R3

R4~R7
R4~R7

R1~R3
R1~R3
R1~R3


(2) 通过固定存储区传递(fixed memory) 

这种方法将bit型参数传给一个存储段中: 
?function_name?BIT 
将其它类型参数均传给下面的段:?function_name?BYTE,且按照预选顺序存放。 
至于这个固定存储区本身在何处,则由存储模式默认。 

(3) 函数的返回值 
函数返回值一律放于寄存器中,有如下规律:

return type

Registev

说明

bit

标志位

由具体标志位返回

char/unsigned char 1_byte指针

R7

单字节由R7返回

int/unsigned int 2_byte指针

R6 & R7

双字节由R6和R7返回,MSB在R6

long&unsigned long 

R4~R7

MSB在R4,  LSB在R7

float

R4~R7

32Bit IEEE格式

一般指针

R1~R3

存储类型在R3 高位R2 低R1

(4) SRC控制 

该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。 
第三节 Keil C51软件包中的通用文件 

在C51LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。 
1. 动态内存分配 

init_mem.C:此文件是初始化动态内存区的程序源代码。它可以指定动态内存的位置及大小,只有使用了init_mem( )才可以调回其它函数,诸如malloc calloc,realloc等。 

calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。 
malloc.c:此文件是malloc的源代码,分配一段固定大小的内存。 
realloc.c:此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。 

2. C51启动文件STARTUP.A51 

启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行,其功能包括: 

定义内部RAM大小、外部RAM大小、可重入堆栈位置 
清除内部、外部或者以此页为单元的外部存储器 
按存储模式初使化重入堆栈及堆栈指针 
初始化8051硬件堆栈指针 

向main( )函数交权 

开发人员可修改以下数据从而对系统初始化 

常数名 意义 

IDATALEN 待清内部RAM长度 
XDATA START 指定待清外部RAM起始地址 
XDATALEN 待清外部RAM长度 
IBPSTACK 是否小模式重入堆栈指针需初始化标志,1为需要。缺省为0 
IBPSTACKTOP 指定小模式重入堆栈顶部地址 
XBPSTACK 是否大模式重入堆栈指针需初始化标志,缺省为0 
XBPSTACKTOP 指定大模式重入堆栈顶部地址 
PBPSTACK 是否Compact重入堆栈指针,需初始化标志,缺省为0 
PBPSTACKTOP 指定Compact模式重入堆栈顶部地址 
PPAGEENABLE P2初始化允许开关 
PPAGE 指定P2值 
PDATASTART 待清外部RAM页首址 
PDATALEN 待清外部RAM页长度 

提示:如果要初始化P2作为紧凑模式高端地址,必须:PPAGEENAGLE=1,PPAGE为P2值,例如指定某页1000H-10FFH,则PPAGE=10H, 


3. 标准输入输出文件 

putchar.c 
putchar.c是一个低级字符输出子程,开发人员可修改后应用到自己的硬件系统上,例如向CLD或LEN输出字符。 
缺省:putchar.c是向串口输出一个字符XON XOFF是流控标志,换行符“*n”自动转化为回车/换行“ 
”。 

getkey.c 
getkey函数是一个低级字符输入子程,该程序可用到自己硬件系统,如矩阵键盘输入中,缺省时通过串口输入字符。 
4. 其它文件 

还包括对Watch-Dog有独特功能的INIT.A51函数以及对8×C751适用的函数,可参考源代码。

第四节 段名协定与程序优化 

1. 段名协定(Segment Naming Conventions) 

C51编译器生成的目标文件存放于许多段中,这些段是代码空间或数据空间的一些单元,一个段可以是可重定位的,也可以是绝对段,每一个可重定位的段都有一个类型和名字,C51段名有以下规定: 

每个段名包括前缀与模块名两部分,前缀表示存储类型,模块名则是被编译的模块的名字,例如: 

?CO?main1 :表示main1模块中的代码段中的常数部分 

?PR?function1?module 表module模块中函数function1的可执行段,具体规定参阅手册。 
2. 程序优化 

C51编译器是一个具有优化功能的编译器,它共提供六级优化功能。确保生成目标代码的最高效率(代码最少,运行速度最快)。具体六级优化的内容可参考帮助。 

在C51中提供以下编译控制指令控制代码优化: 

OPTIMIZE(SJXE):尽量采用子程序,使程序代码减少。 

NOAREGS:不使用绝对寄存器访问,程序代码与寄存器段独立。 

NOREGPARMS:参数传递总是在局部数据段实现,程序代码与低版本C51兼容。 

OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6级优化功能,缺省为: OPTIMIZE(6,SPEED)。


关键字:Keil  C51  ARM 引用地址:Keil C51与Keil ARM共存

上一篇:Keil C51编译错误警告解决方法积累
下一篇:Keil C51软件使用方法

推荐阅读最新更新时间:2024-03-16 15:24

Arm拟分拆旗下实验室,以扩大CeRam技术研发和专利授权业务
据digitimes报道,安谋(Arm)日前宣布公司将分拆旗下实验室Cerfe Labs,以扩大关联电子存储器(correlated electron RAM;CeRAM)和铁电场效应晶体管(FeFET)的技术研发与专利授权业务。 该报道称,Arm将把旗下150项与CeRAM产品相关的专利内容转移至Cerfe Labs,其CeRAM研究人员也将加入该分拆公司。另外,Cerfe Labs将与Symetrix共同成立一家总部位于德州的奥斯汀的新公司,并由Arm研究团队负责人Eric Hennenhoefer与Greg Yeric等分别担任CEO与技术官。 Cerfe Labs目前正研究与CeRAM相关的材料,以加速AI领域的存储技
[手机便携]
C51编译器的数据存储格式及编程技巧分享
Data Storage Formats数据存储格式 这一部说明可用的数据类型的存储格式。Cx51提供了几种数据存储格式如下: Data Type Bits Bytes Value Range bit 1 — 0 to 1 signed char 8 1 -128 to +127 unsigned char 8 1 0 to 255 enum 8 / 16 1 or 2 -128 to +127 or -32768 to +32767 signed short 16 2 -32768 to +32767 unsigned short 16 2 0 to 65535 signed int 16 2 -32768 to +3276
[单片机]
<font color='red'>C51</font>编译器的数据存储格式及编程技巧分享
C51单片机对共阳极数码管的控制设计
这是共阳极数码管的电路图,其中JP3接到P0口,JP3的8-1对应数码管的a-dp引脚。 共阳极数码管的编码表如下,注意a---最低位,dp---最高位: 【0---3】0xco,0xf9,0xa4,0xb0, 【4---7】0x99,0x92,0x82,0xf8, 【8---B】0x80,0x90,0x88,0x83, 【C---F】0xc6,0xa1,0x86,0x8e。 C51程序显示数字0-9: #include #define uchar unsigned char void delay(); uchar smg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
[单片机]
<font color='red'>C51</font>单片机对共阳极数码管的控制设计
基于ARM和FPGA的靶场破片测速系统的设计
破片速度是战斗部爆炸效能*估的一个重要参数。传统的靶场破片测速系统多使用多路数据采集卡设置好的参数现场采集标靶的试验波形,试验完成后再交由计算机进行后期处理和解读以获取破片速度等参数。但随着军事科技的日新月异,靶场破片测速系统需要根据实际情况现场设置的参数越来越多,参数设置的灵活性越来越强,对系统工作的实时性要求越来越高;另一方面,战斗部爆炸试验在野外进行,条件恶劣,大型设备携带不便,以往的PC机+数据采集卡设计已经越来越不能满足靶场试验的要求。嵌入式系统具有功耗小、便携性好、稳定性高、实时性强的特点,近年来随着嵌入式技术的不断发展,把嵌入式技术引入靶场破片测速系统设计中,为靶场破片测速系统设计提供了一个新的思路。 本文设计
[嵌入式]
基于<font color='red'>ARM</font>和FPGA的靶场破片测速系统的设计
C51开发中的static, const, code关键字
static关键字 static在C里面可以用来修饰变量, 也可以用来修饰函数 static修饰变量 变量在C里面可以存在三处: 全局数据区, 栈和堆. 堆和栈是不同的. int a ; int main() { int b ; int c* = (int *)malloc(sizeof(int)); } 上面的代码中, a是全局变量, b是栈变量, c是指向堆变量的指针 static对全局变量的修饰: 限制了只能是本文件引用此变量. 有的程序由多个C文件组成, 可以互相引用变量, 但加入static修饰之后, 只能被本文件中函数引用. static对栈变量的修饰: 栈变量的生命周期延长到程序执行结束时. 一般
[单片机]
ARM+FPGA开发板的强劲图形系统体验——米尔基于NXP i.MX 8M Mini+Artix-7开发板
ARM+FPGA开发板的强劲图形系统体验——米尔基于NXP i.MX 8M Mini+Artix-7开发板 关键词:NXP、Xilinx、i.MX 8M Mini、Artix-7、ARM+FPGA、图像处理、异构处理器 本篇测评由优秀测评者“qinyunti”提供。 01 ARM+FPGA异核架构开发板简单介绍 MYD-JX8MMA7的这款ARM+FPGA异核架构开发板, 拥有2个GPU核,一个用来做3D数据处理,另一个用来做2D和 3D加速。3D GPU核支持:  OpenGL ES 1.1,2.0  Open VG 1.1  2D GPU核支持  多图层混合 基于ARM+FPG
[嵌入式]
<font color='red'>ARM</font>+FPGA开发板的强劲图形系统体验——米尔基于NXP i.MX 8M Mini+Artix-7开发板
C51红外解码程序
这是一个简单的红外解码程序,是针对9ms起始码和4.5ms结束码的红外信号晶振用的是11.0592M的 #i nclude at89x52.h #i nclude stdio.h sfr p0=0x80; sfr p3=0xb0; sbit p32=p3^2; unsigned char dm,i,j,k; unsigned char data a ;//定义4个数组,用来存储代码 void ds0_9ms(void) { unsigned char j,k; for(j=18;j 0;j--) for(k=20;k 0;k--) ; } void ds1ms(void) { unsigned char i,j; for(i
[单片机]
非移动市场需求飙升ARM预计50亿片出货量
ARM核产品覆盖了MCU应用的每一个领域,从消费娱乐、无线移动、到网络和家庭应用等。而在便携式移动产品领域,以低功耗著称的ARM处理器占绝对优势。ARM公司于3月份宣称截至2007第四季度已累计“出货”100亿片MCU,而自2007年Q4至今又有10亿片基于ARM核的处理器出货。因此说ARM产品无处不在并不为过。而正当人们惊讶于ARM公司的快速成长与其低功耗产品在移动领域所取得的成就的同时,ARM已经将目光投向了非移动领域。 2008年6月11日,在深圳举办了ARM第一届家庭应用创新研讨会暨合作伙伴中国峰会上,ARM公司中国总裁谭军博士表示,ARM预计2010年的年出货量将达50亿片,而ARM也将在家庭应用上捕获更多的
[其他]
非移动市场需求飙升<font color='red'>ARM</font>预计50亿片出货量
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved