历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2018年12月13日 | 单片机中的C知识

2018-12-13 来源:eefocus

1、在没有任何后缀标志的情况下,整型变量的数据类型是在能承受范围内中最短的一个!


2、实际编程中,应尽可能采用 unsigned 的变量,因为计算机内存的数据存储都是补码的形式,有符号类型(特别是其中的负数)还得来回转换,导致效率不高。


3、另外unsigned long的取值最大可达到42亿,这个有必要记住。


4、实数型数据在内存中的存储是23位有效二进制,且有一位固定为1不存储,所以实际能表示24位有效值。(这有详细介绍)若24位全为1,十进制最大整数值为16777215(不考虑指数),换言之,纯整数在7位以内是准确的。同样的方法也可达到,纯小数在7位以内是准确的*。当小数整数都有的时候,只有前6位数据是准确的*。


5、单片机的变量存储空间 bit sbit bdata data idata pdata xdata 


仅仅知道这些名词是不够的,还必须知道实际的存储空间。


bit:内部RAM的可位寻址区(0x20~0x7F)的某位 

sbit:定义单(多)字节可位寻址区的某位 

bdata:存储在内部RAM可位寻址区,通常搭配sbit使用


data: 内部RAM,0x00~0x7F,可位寻址区(128字节),直接寻址,效率最高 

idata: 内部RAM,0x00~0xFF,256字节,间接寻址,访问效率一般(内部RAM的0x80~0xFF用于中断和函数调用的堆栈) 

pdata:外部RAM,0x00~0xFF,256字节,间接寻址 

xdata:外部RAM,0x0000~0xFFFF,64K字节,借助DPTRH,DPTRL进行间接寻址


code:程序存储空间Flash中


keil的Memory Model 可以设置默认变量存储空间。 

Small : 默认存储在data区域中 

Compact:默认存储在Pdata中 

Large:默认存储在xdata中


标准51:RAM 共512字节,片内256(片内不可扩展),片外256字节(片外可扩展)。 

bdata < data < idata 

pdata < xdata


6、需要注意,当keil利用printf调试的时候,格式化字符 %d 表示的是输出有符号的数据类型范围,可能造成溢出,要特别注意。 


无符号长整型,%lu 


单字节整型, %bd


7、keil特有的绝对定位关键字 _at_ 


eg: unsigned int data a _at_ 0x28 


但是这个关键字只能定义全局变量。


8、static 是一门学问,戳这里。

我们常见的用法,静态局部变量 = 全局变量 


static 修饰全局变量或者函数的时候,表示该函数或者该局部变量只是在该文件可见。


9、位操作运算符的妙用:


按位与 & 


将某位清0,比如 a &= 0xFE, 最低位清0了


检测某位是0,还是1。在通信中用到的多。 


方法为分别与 0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80 进行即可。


按位或 | 某位置1,比如 a |= 0x80 最高位置1


按位取反 ~ 将所有位取反 a = ~0x01; 取反后得到 0xFE


按位异或 将某一位取反。 a ^= 0x80; 将最高位取反


10、移位和乘除法的效率


结论为:


乘法比左移效率高


右移比除法效率高


11、指针


变量指针:一个变量在内存中的起始地址称为这个变量的指针。说白了,指针的本质就是地址。 


指针变量:专门用来存放其他变量起始地址的变量,称为指针变量。


keil特有指针的表达格式: 所指变量类型 当无


char *point; //定义通用指针变量和C一样。

unsigned char *cp1, *cp2; //同上 

char xdata *Point; //定义内存特殊指针,和C不一样

unsigned char xdata * data Point1; //unsigned char 变量存储在xdata, 指针变量存储在data 


需要说明的是,通用指针变量在内存中占三个字节。而标准C是4个字节。


keil测试代码


#include

#include


void main()

{

    unsigned char *a;   

    unsigned char x;


    TI = 1;

    x = sizeof(a);

    while(1);

}


CB测试代码


#include


int main()

{

    char *a;

    printf("%d", sizeof(a));

}


通用指针变量


当无通用指针,默认指针变量存储在数据存储器data中,若要指定指针变量存储位置,可在 * 后加上对应的存储空间。


char * data a1; //等价于 char *a1

char * idata a2; //指针变量存储在内部RAM idata

char * xdata a3; //指针变量存储在片外RAM 64K地址范围


特殊指针变量


存储空间为内部RAM(data idata bdata)时,指针变量自身占一个字节。


char data * a1;

char xdata * a2;

char bdata * a3;


存储空间为外部RAM时,指针变量自身占用两个字节。


char pdata * b1;

char xdata * b2;


当使用特殊指针的时候通常要把指针变量定义在内部RAM中,这样才是最快,效率最高的。


char bdata * a1; 

char pdata * b1;


12、多文件操作


函数可以不加 extern (引用的函数不能是加static关键字的) 


变量必须得加 extern


推荐阅读

史海拾趣

DCX-CHOL Enterprises公司的发展小趣事

在追求经济效益的同时,DCX-CHOL Enterprises也积极履行社会责任,倡导绿色环保。公司采用环保材料和生产工艺,减少生产过程中的污染物排放。同时,公司还积极推广节能减排的理念,鼓励员工和合作伙伴共同参与环保行动。这些举措不仅提升了公司的社会形象,也为公司的可持续发展提供了有力保障。

Cristek Interconnects Inc公司的发展小趣事

Cristek Interconnects Inc公司自成立以来,一直致力于电子连接器技术的研发与创新。在早期的发展阶段,公司凭借其出色的研发团队,成功开发出一种新型的高性能连接器,这种连接器具有更高的导电性和更低的信号衰减,极大地提高了电子设备的性能。这一技术突破为公司赢得了市场的广泛认可,也奠定了Cristek在电子行业中的重要地位。

COILCRAFT公司的发展小趣事

为了更好地服务全球客户,COILCRAFT公司在北美、亚洲和欧洲等地建立了制造、分销和工程设施。这一全球布局使得公司能够快速地响应客户需求,提供高效的服务和运输。同时,COILCRAFT还拥有丰富的网络工具库和免费评估样品政策,这些措施简化了部件选择过程,提高了客户的满意度。

FerriShield公司的发展小趣事

为了进一步推动技术创新和产品研发,FerriShield积极寻求与高校和研究机构的合作。公司与多所知名大学建立了产学研合作关系,共同开展新材料、新工艺的研究和开发。这些合作不仅提升了FerriShield的技术实力,还为公司培养了一批高素质的研发人才。

AEL [AEL Crystals Ltd]公司的发展小趣事

随着业务的不断发展,AEL Crystals意识到全球化战略的重要性。公司开始在全球范围内寻找合适的生产基地,并在英国、日本、台湾、韩国等地区建立了生产基地网络。这一战略布局使得AEL Crystals能够更好地满足全球客户的需求,同时也降低了供应中断的风险。

FWBELL公司的发展小趣事
根据电压比较器的输出信号控制充电电流的大小和充电模式。

问答坊 | AI 解惑

数据采集资料

数据采集,大家多交流问题,多提问!…

查看全部问答>

什么是单片机?单片机有什么用?

单片机又称单片微控制器]它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与 ...…

查看全部问答>

请高手解惑: 在wince5.0下如何读AD卡采集的数据...

用pc104 跑wince5.0,我现在有一块AD卡,用来采集传感器传回的数据,不知道如何才能采集到啊? 用不用编驱动程序啊?直接读地址行不行啊?请高手指点一下啊,最好有原代码参考一下啊,十分感谢啊!…

查看全部问答>

To 一个简单的提问

我现在想开发一款USB驱动程序,我目前 的操作系统是Win2003,请问使用win2003DDK开发的驱动程序,能够在WIN2000及XP上使用吗?DDK有什么要求吗?谢谢,见笑了.…

查看全部问答>

安捷伦推出业界首个用于示波器的GDDR5 一致性测试工具

2010 年 8 月 19 日,北京――安捷伦科技公司(NYSE: A)宣布,推出业界首个用于示波器的 GDDR5(图形双倍数据速率第五版)一致性测试应用程序包和 GDDR5 球形栅格阵列(BGA)探头。新工具将帮助工程师更快地启动和调试 GDDR5 系统,高效地确定 GDD ...…

查看全部问答>

没有电感手册,需要一款电感。

33uh和47uh磁屏蔽电感,求推荐型号(贴片小封装的,质量比较好的)电流最大3a。…

查看全部问答>

基于51单片机的函数信号发生器资料总汇

基于51单片机的函数信号发生器资料总汇…

查看全部问答>

困扰我多久的问题,望高手解答

下面一个问题,已经困扰我很久了,一直找不到罪魁祸首,希望有高手帮我解答,非常感谢! 问题背景: 1.此项目为BLDC电机供电,提供310V,15V,GND,电机的VSP与FG由其他控制板输出或接收 2.附件原理图只是电源部分的简要示意图,非完整原理图, ...…

查看全部问答>

IMP813L

那位大哥大姐用过IMP813L看门狗芯片啊,求帮助,求解脱。 WDI喂狗信号都放软件延时函数里了(WDI = ~WDI),时间绝对小于1.6秒,为什么还是产生复位信号,RESET变高电平啊? 真心急!!!!!!!!!!!!!!!!!!…

查看全部问答>

会电机控制的都进来

本帖最后由 liuming759 于 2014-1-13 15:56 编辑 电机控制的朋友请赐教问题如下: 1.他励电机的控制需要注意哪些方面?如何发挥他励电机的最大性能 2.电机控制方面程序的框架最好该如何搭接? 3.如果说是F28035的EPWM模块,该如何设置合适 ...…

查看全部问答>