历史上的今天
返回首页

历史上的今天

今天是:2025年03月23日(星期日)

正在发生

2021年03月23日 | Keil模式设置及编程事项

2021-03-23 来源:eefocus

因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类:


8051存储类型及存储区域 , 存储模式 , 存储器类型声明 , 变量类型声明 , 位变量与位寻址 ,特殊功能寄存器(SFR) ,C51指针


l 函数属性


具体说明如下(8031为缺省CPU)。


第一节KeilC51扩展关键字


C51 V4.0版本有以下扩展关键字(共19个):


_at_ idata sfr16 alien interrupt small


bdata large _task_ Code bit pdata


using reentrant xdata compact sbit data sfr


第二节 内存区域(Memory Areas):


1. Pragram Area:


由Code说明可有多达64kBytes的程序存储器


2. Internal Data Memory:


内部数据存储器可用以下关键字说明:


data:直接寻址区,为内部RAM的低128字节 00H~7FH


idata:间接寻址区,包括整个内部RAM区 00H~FFH


bdata:可位寻址区, 20H~2FH


3. External Data Memory


外部RAM视使用情况可由以下关键字标识: xdata:可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFH


pdata:能访问1页(25bBytes)的外部RAM,主要用于紧凑模式(Compact Model)。


4. Speciac Function Register Memory


8051提供128Bytes的SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:


sfr:字节寻址 比如 sfr P0=0x80;为PO口地址为80H,“=”后H~FFH之间的常数。


sfr16:字寻址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCD


sbit:位寻址,如sbit EA="0xAF";指定第0xAF位为EA,即中断允许


还可以有如下定义方法:


sbit 0V=PSW^2;(定义0V为PSW的第2位)


sbit 0V=0XDO^2;(同上)


或bit 0V-=0xD2(同上)。


第三节 存储模式


存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:


1. Small模式


所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。


small模式下,再入函数的堆栈是设在idata中的


2. Compact模式


所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。


compact模式下,再入函数堆栈是设在pdata中的


3. large模式


所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。


提示:存储模式在C51编译器选项中选择。


第四节 存储类型声明


变量或参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指定。各类型分别用:code,data,idata,xdata,pdata说明,例:


data uar1


char code array[ ]=“hello!”;


unsigned char xdata arr[10][4][4];


第五节 变量或数据类型


C51提供以下几种扩展数据类型:


bit 位变量值为0或1


sbit 从字节中定义的位变量 0或1


sfr sfr字节地址 0~255


sfr16 sfr字地址 0~65535


其余数据类型如:char,enum,short,int,long,float等与ANSI C相同。


第六节 位变量与声明


1. bit型变量


bit型变量可用变量类型,函数声明、函数返回值等,存贮于内部RAM20H~2FH。


注意:


(1) 用#pragma dISAble说明函数和用“usign”指定的函数,不能返回bit值。


(2) 一个bit变量不能声明为指针,如bit *ptr;是错误的


(3) 不能有bit数组如:bit arr[5];错误。


2. 可位寻址区说明20H-2FH


可作如下定义:


int bdata i;


char bdata arr[3],


然后:


sbit bito=in0;sbit bit15=I^15;


sbit arr07=arr[0]^7;sbit arr15=arr[i]^7;


第七节 Keil C51指针


C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).


1. 一般指针


一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如:


long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。


char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。


一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。


2. 存储器指针


基于存储器的指针说明时即指定了存贮类型,例如:


char data * str;str指向data区中char型数据


int xdata * pow; pow指向外部RAM的int型整数。


这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。


3. 指针转换


即指针在上两种类型之间转化:


l 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。


l 如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。


l 可以强行改变指针类型。


第八节 Keil C51函数


C51函数声明对ANSI C作了扩展,具体包括:


1. 中断函数声明:


中断声明方法如下:


void serial_ISR () interrupt 4 [using 1]

{


}


为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。


void extern0_ISR() interrupt 0{}


void timer0_ISR () interrupt 1{}


void extern1_ISR() interrupt 2{}


void timer1_ISR () interrupt 3{}


void serial_ISR () interrupt 4{}


2. 通用存储工作区


3. 选通用存储工作区由using x声明,见上例。


4. 指定存储模式


由small compact 及large说明,例如:


void fun1(void) small { }


提示:small说明的函数内部变量全部使用内部RAM。关键的经常性的耗时的地方可以这样声明,以提高运行速度。


5. #pragma dISAble


在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。


6. 递归或可重入函数指定


在主程序和中断中都可调用的函数,容易产生问题。因为51和PC不同,PC使用堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而51一般使用寄存器传递参数,内部变量一般在RAM中,函数重入时会破坏上次调用的数据。可以用以下两种方法解决函数重入:


a、在相应的函数前使用前述“#pragma dISAble”声明,即只允许主程序或中断之一调用该函数;


b、将该函数说明为可重入的。如下:


void func(param...) reentrant;


KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法。


由于一般可重入函数由主程序和中断调用,所以通常中断使用与主程序不同的R寄存器组。


另外,对可重入函数,在相应的函数前面加上开关“#pragma noaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。


7. 指定PL/M-51函数由alien指定。


推荐阅读

史海拾趣

方舟(ARKLED)公司的发展小趣事

方舟公司不仅关注经济效益,还积极履行社会责任。公司积极参与环保事业,推动绿色生产,减少能源消耗和废弃物排放。同时,方舟公司还关注社会公益事业,捐资助学、扶贫济困,为社会和谐发展贡献了一份力量。

DAQ Electronics LLC公司的发展小趣事

在DAQ Electronics LLC公司的发展历程中,质量一直是其坚守的核心原则。公司建立了严格的质量控制体系,从原材料采购到产品生产、检测、包装等各个环节都进行严格把控。这种对质量的坚持,使得DAQ Electronics LLC公司的产品在市场上获得了良好的口碑和信誉。客户对公司的产品和服务给予了高度评价,也为公司的持续发展提供了有力保障。

Crowd_Supply__Inc.公司的发展小趣事

在电子行业的众多初创公司中,Crowd Supply Inc.以其独特的理念和模式崭露头角。公司成立之初,便聚焦于开放式硬件和社区驱动的产品开发,这在当时的行业环境中还是一个较为新颖的概念。创始人团队由一群富有热情和创新精神的电子工程师和产品开发专家组成,他们通过线上平台汇聚了一群同样对电子硬件感兴趣的爱好者和开发者。初期,公司面临资金短缺、市场认可度低等挑战,但通过不断试错和社区反馈,逐渐找到了自己的发展方向。

艾吉芯(Agertech)公司的发展小趣事

在电子行业的快速发展中,艾吉芯公司凭借其在半导体芯片研发领域的深厚积累,成功推出了一系列高性能的半导体分立器件。这些产品不仅满足了市场对功率半导体的高效、稳定需求,更在技术创新方面取得了显著突破。艾吉芯公司通过持续的研发投入和严格的生产质量控制,确保了产品的可靠性和竞争力,逐渐在市场中树立起了良好的口碑。

长江微电(cjiang)公司的发展小趣事

随着新能源汽车市场的快速发展,汽车电子领域对电感产品的需求不断增长。长江微电敏锐地捕捉到这一市场机遇,加大了对汽车电子领域的投入力度。公司推出的车规级系列电感产品广泛应用于汽车LED驱动电路、汽车多媒体系统、车联网系统等领域。凭借优异的产品性能和稳定可靠的质量保障,长江微电在汽车电子领域树立了良好的口碑和品牌形象。

宝乘(baocheng)公司的发展小趣事

面对未来电子行业的发展趋势,宝乘公司继续坚持创新驱动的发展战略。公司加大研发投入,不断推出具有创新性和前瞻性的产品。同时,宝乘还积极探索新的市场领域和应用场景,为公司的未来发展奠定坚实的基础。相信在不久的将来,宝乘公司将成为电子行业中的佼佼者,为社会的进步和发展做出更大的贡献。

请注意,这些故事是基于现有信息的推测,并不代表宝乘公司的真实历史。如果您需要更准确和详细的信息,建议直接联系宝乘公司或查阅相关报道和资料。

问答坊 | AI 解惑

xilinx中文培训材料

xilinx中文培训材料内容: Xilinx fpga 设计培训中文教程1 Xilinx fpga 设计培训中文教程2 Xilinx fpga 设计培训中文教程3 Xilinx fpga 设计培训中文教程4 Xilinx fpga 设计培训中文教程5 Xilinx fpga 设计培训中文教程5.1 Xilinx fpga 设计 ...…

查看全部问答>

大家对电子大赛的清单有什么想法/

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 大赛清单下来了,大家都有什么想法,大家来分享分享  …

查看全部问答>

点阵液晶驱动的问题(基于RA8835)……

小弟初识,描点函数W_DOT void __fastcall TForm1:: W_DOT(int O_X,int O_Y)   {     unsigned char i,j,dat;     unsigned int k;       j=PARA;//PARA=0x30;      &nbs ...…

查看全部问答>

金税卡卡住我!

我公司要安装税控软件但反复几次,总是无法正常使用,航天信息的工作人员告诉我,电脑主板不兼容,我已经换了好几块主板了,就是不行。我隐隐的感觉到他们好像在引导我买他们的税控机,我好郁闷,大家帮帮我把!…

查看全部问答>

BREW和SD卡外设通信,

BREW平台下,能通过SD/SPI接口和外设通信吗, 还是要自己做驱动,或要知道和调用手机厂商的API呢, …

查看全部问答>

怎样在应用程序中控制(使之输出与不输出)调试串口一,即打开或者关闭“调试”串口一

怎样在应用程序中控制(使之输出与不输出)调试串口一,即打开或者关闭“调试”串口一? 用个实例说可能更明白一点:在bsp的触摸驱动里面我需要将坐标信息通过串口发送出去,而有时候我又需要关闭它,不让这些坐标信息发送,该怎么入手 …

查看全部问答>

ADC轉換

各位大大,我是剛接觸WinCE的新手,有幾個問題想請問一下我用的板子是mini6410 WinCE 6.0  去做開發,想要寫一個應用程式裡面想要有ADC轉換的功能請問各位大大,我目前搞不懂我要用ADC是要再寫一個driver燒進去版子,還是直接在應用程式上實現就可 ...…

查看全部问答>

8962评估套件上运行成功的CAN例程

CAN例程中的所用的驱动文件都来自套件光盘中提供的2010年5月份5961版驱动库 已全部打包。 LM3S2110小板发送报文    …

查看全部问答>

各位大仙帮忙看看为啥PWM,木有输出

void Init_TimerB(void){   TBCTL= TBSSEL_2+ ID_3 +TBCLR;                // MCLK  TBCCR0 = 40000;        &n ...…

查看全部问答>

ATmega168 bootloader烧写问题

请问下:       在我用bootloader烧写完程序(程序正常)后,再次用bootloader烧写程序,但是一直联机超时?        还有后面读取hex文件和之前bootloader的hex文件对比之前程序也没覆盖bootloader程序区 ...…

查看全部问答>