历史上的今天
今天是: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
上一篇:关于IAP的一点深入理解
下一篇:STC12单片机实现自动下载程序
史海拾趣
|
单片机又称单片微控制器]它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与 ...… 查看全部问答> |
|
请高手解惑: 在wince5.0下如何读AD卡采集的数据... 用pc104 跑wince5.0,我现在有一块AD卡,用来采集传感器传回的数据,不知道如何才能采集到啊? 用不用编驱动程序啊?直接读地址行不行啊?请高手指点一下啊,最好有原代码参考一下啊,十分感谢啊!… 查看全部问答> |
|
我现在想开发一款USB驱动程序,我目前 的操作系统是Win2003,请问使用win2003DDK开发的驱动程序,能够在WIN2000及XP上使用吗?DDK有什么要求吗?谢谢,见笑了.… 查看全部问答> |
|
2010 年 8 月 19 日,北京――安捷伦科技公司(NYSE: A)宣布,推出业界首个用于示波器的 GDDR5(图形双倍数据速率第五版)一致性测试应用程序包和 GDDR5 球形栅格阵列(BGA)探头。新工具将帮助工程师更快地启动和调试 GDDR5 系统,高效地确定 GDD ...… 查看全部问答> |
|
下面一个问题,已经困扰我很久了,一直找不到罪魁祸首,希望有高手帮我解答,非常感谢! 问题背景: 1.此项目为BLDC电机供电,提供310V,15V,GND,电机的VSP与FG由其他控制板输出或接收 2.附件原理图只是电源部分的简要示意图,非完整原理图, ...… 查看全部问答> |




