单片机中的C知识
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 <stdio.h>
#include <reg52.h>
void main()
{
unsigned char *a;
unsigned char x;
TI = 1;
x = sizeof(a);
while(1);
}
CB测试代码
#include <stdio.h>
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
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/78987709
- 点赞
- 收藏
- 关注作者
评论(0)