单片机中的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值