历史上的今天
返回首页

历史上的今天

今天是:2025年06月16日(星期一)

正在发生

2021年06月16日 | Keil c51指针变量

2021-06-16 来源:eefocus

单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)。


1. 1. 一般指针


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


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


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


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


2. 2. 存储器指针


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


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


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


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


3. 3. 指针转换


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


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


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


l 能强行改变指针类型。


变量的存储类别


一、static(静态局部)变量。


1、静态局部变量在程序整个运行期间都不会释放内存。


2、对于静态局部变量,是在编译的时候赋初值的,即只赋值一次。如果在程序运行时已经有初值,则以后每次调用的时候不再重新赋值。


3、如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。


4、虽然静态变量在函数调用结束后仍然存在,但是其他函数不能引用。


二、用extern声明外部变量。


用extern声明外部变量,是为了扩展外部变量的作用范围。比如一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。


正确的做法是在一个文件中定义外部变量,而在另外一个文件中使用extern对该变量作外部变量声明。


一个文件中: int abc;


另外一个文件中: extern abc;


例子:


用extern将外部变量的作用域扩展到其他文件:


文件1:


//用extern将外部变量的作用域扩展到其他文件中


#include


#include


#include


unsigned int array[10];


void fillarray();


void init_ser()


{


SCON=0X50;


TMOD|=0X20;


TH1=0XF3;


TR1=1;


TI=1;


}


void main()


{


unsigned int i;


init_ser();


fillarray();


for(i=0;i《10;i++)


{


printf(“array[%d]=%dn”,i,array[i]);


}


for(;;){;}


}


文件2:


extern int array[10];


void fillarray()


{


unsigned char i;


for(i=0;i《10;i++)


{


array[i]=i;


}


}


在单片机c语言中变量的空间分配几个方法


1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。


2、 data区内最好放局部变量。


因为局部变量的空间是能覆盖的某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),能提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;


3、 确保你的程序中没有未调用的函数。


在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。


4、 程序中遇到的逻辑标志变量能定义到bdata中,能大大降低内存占用空间。


在51系列芯片中有16个字节位寻址区bdata,其中能定义8*16=128个逻辑变量。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。


5、 其他不频繁用到和对运算速度要求不高的变量都放到xdata区。


6、 如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。


7、 当使用到指针时,要指定指针指向的内存类型。


在单片机c51语言中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。


推荐阅读

史海拾趣

Astema公司的发展小趣事

随着业务的迅速增长,Astema意识到供应链管理的重要性。公司开始优化供应链管理流程,提高生产效率和产品质量。同时,Astema还与供应商建立了紧密的合作关系,确保原材料供应的稳定性和可靠性。这些举措使得Astema在激烈的市场竞争中保持了稳定的运营。

骏晔科技(DreamLNK)公司的发展小趣事

随着公司业务的不断发展和市场规模的扩大,骏晔科技开始积极布局全球市场。公司通过与全球数十家半导体企业建立战略合作关系,拓展海外市场。同时,公司还积极参加国际电子展会和论坛,与全球同行交流合作,共同推动电子行业的发展。通过这些努力,骏晔科技在国际市场上逐渐崭露头角,成为了备受关注的行业新星。

GHI Electronics公司的发展小趣事

GHI Electronics公司成立于2003年,总部位于美国密歇根州。公司自创立之初便明确了其使命:为客户提供咨询、制造和解决方案,以降低风险、成本和复杂性。这一清晰的定位使得GHI Electronics能够迅速在电子工程和制造领域站稳脚跟。随着市场需求的不断变化,GHI Electronics不断调整和优化其服务内容,逐渐赢得了客户的信任和市场的认可。

C-MAC Automotive公司的发展小趣事

在电子行业快速发展的今天,C-MAC Automotive公司始终保持着对创新的追求。公司不断投入研发资金,探索新的技术方向和应用领域。通过持续创新,C-MAC成功推出了一系列具有竞争力的新产品,为公司的发展注入了新的动力。同时,公司还注重人才培养和团队建设,打造了一支高效、专业的研发团队,为公司的未来发展奠定了坚实基础。

这些故事虽然基于虚构,但反映了电子行业中许多企业发展的普遍规律。通过技术突破、战略合作、创新营销、全球化战略和持续创新等手段,企业可以不断提升自身竞争力,实现快速发展。

Franz Binder GmbH & Co公司的发展小趣事

为了进一步提升竞争力,C-MAC Automotive公司积极寻求与其他企业的战略合作。通过与一家知名汽车制造商建立合作关系,C-MAC成功将其电子控制单元(ECU)集成到了对方的新款车型中。这一合作不仅提升了C-MAC的品牌知名度,还为公司带来了稳定的订单来源。通过不断拓宽合作领域,C-MAC逐渐在电子行业中占据了一席之地。

华宇创公司的发展小趣事

随着市场的不断发展,华宇创意识到单一产品无法满足日益增长的市场需求。于是,公司加大了对研发的投入,积极引进高端人才,与国内外知名科研机构建立合作关系。经过不懈努力,华宇创成功研发出一系列智能电子设备,包括智能手表、智能眼镜、智能家居控制器等。这些新产品的推出不仅丰富了公司的产品线,也进一步提升了华宇创的市场竞争力。

问答坊 | AI 解惑

2~26GHzGaAs单片功率放大器

  摘 要: 报道了一个具有低噪声性能的2~26GHzGaAs超宽带单片功率放大器的研究结果,介绍了模型提取!电路设计和单片制作的全过程.放大器采用分布式设计,在超宽带频率范围内增益为615?015dB,输入输出驻波比小于210.在2~20GHz内测得输出功率大于30 ...…

查看全部问答>

我今天焊光影棒板子的时候发一个小问题!

请进我的博客日志看:https://home.eeworld.com.cn/index.php?uid-77246-action-viewspace-itemid-13210…

查看全部问答>

请问这两个二极管的作用及应选择的型号

此电路是将自整角机的三线信号转换为AD2S83可接受的2V sin以及cos信号的电路,上面的一路为参考电压输入 请问这里面二极管的作用,选择的二极管应该是稳压二极管吗?还是普通二极管,应该选择什么样的型号?…

查看全部问答>

ADS环境下的ASSERT的用法介绍

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序 ...…

查看全部问答>

LCD字符错位的问题

用的是sharp5.7的屏 320*240分辨率 字库是16*8的 在uboot里添加了对LCD的驱动 而且上电后可以看到LOGO 显示正常 但是LOGO下方的输出信息字符错位 例如:字符B->B的两个竖杠会往右偏移 而B的上中下横杠是位置不变的      &nbs ...…

查看全部问答>

platform builder sysgen时的错误 LNK1123

大家好,我使用platformbuilder进行编译 厂家给的操作系统 然后是成功的,但是它里面只有一个arm的cpu 我又增加了模拟器的cpu并且切换过去进行sysgen,结果就报错了 报错的内容如下 G:\\mytest\\wince_form_utu_2440\\WINCE5.0_Proj\\WINCE500\ ...…

查看全部问答>

STM32的USB设备拔出时,能否产生一个中断?

                                 STM32的USB设备拔出时,能否产生一个中断?…

查看全部问答>

FPGA之VHDL小应用设计讨论帖。。。。。

最近写一段小代码,发现了一个问题,我的QUARTUSII9.0下运行的。 我写了一个多人表决器的底层模块,在写VHDL代码时,在结构体里面定义了一个sinal量,名称为data,它是一个含有3位的矢量。 它的值等于外部接口A,B,C三个组成的矢量,即data<=C& ...…

查看全部问答>

求C#开发WinCE应用程序的资料!

求C#开发WinCE应用程序的资料! 非常感谢!…

查看全部问答>