嵌入式C语言:
嵌入式C语言思想和设计的交流
什么时候用?
怎么用?
为什么要这样用?
推荐书籍:C语言深度剖析、C和指针
对于各种优先级:利用()将优先级定义出来
gcc就是翻译官:
gcc -o 输出文件名 输入文件名(-o和输出文件名是一个整体)
gcc是根据后缀名来识别翻译的;
gcc:文件后缀名的不用,会调用不同的编译器。
gcc -o 输出文件名 输入文件名(-o和输出文件名是一个整体)
注:内部包含了许多内容
04——C语言常见错误
预处理错误:——当前路径无法找到
#include “name.h”:从当前目录下寻找文件,“”——是自定义的
#include <name.h> :只会从系统目录下寻找文件,<>是系统库的。
编译错误:语法错误: ;{} ()忘记写这类
链接错误:
#include "stdio.h"
void fun(void);
int main(void)
{
fun();
printf("hello\n");
return 0;
}
05——C语言预处理
预处理的使用:
#include :包含头文件;
#define :宏——替换
#define 宏名 宏体 不进行语法检测,在编译的时候进行语法检测
#include "stdio.h"
#define ABC 5+3
int main(void)
{
printf("%d\n",ABC*5);
//运行结果是20,直接是原原本本的替换,5+3*5=20
return 0;
}
#include "stdio.h"
#define ABC (5+3)
int main(void)
{
printf("%d\n",ABC*5);
//运行结果是40,(5+3)*5=40
return 0;
}
宏函数 :#define ABC(x) (5+(x)) :使用宏是为了保险期间,一定要加括号;
条件编译:
#ifdef #else #endif
预定义宏:作用:用来调试
FUNCTION :函数名
LINE :行号
FILE :文件
注:VC6.0编译出错
06——程序预处理
程序的版本:一般分为调试版本和发行版本
条件处理:根据条件处理,确定那些编译那些不编译;进而来切换realse和debug版本
#include "stdio.h"
#define ABC
int main(void)
{
#ifdef ABC //如果没有定义##define ABC,则不执行<1>,如果有,则<1>执行
printf("00000000\n"); //<1>
#endif
printf("hello\n"); //<2>
return 0;
}
备注:利用gcc -D 进行预处理,gcc -DABC 等价于 程序中的 #define ABC
07——宏展开下的# 和 ##
#include "stdio.h"
#define ABC(x) #x
#define DAY(x) myday##x
int main(void)
{
int myday1=10;
int myday2=20;
printf(ABC(ab\n));
//实际展开为 "ab\n"
//输出结果是:ab
printf("%d\n",DAY(1)); //运行结果为10
}
08——C语言关键字
要求:掌握常用的关键字及其使用技巧,应用场景
关键字:预先已经定义了意义的编辑器
sizeof:
int a = 0;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof a);//运行结果同上,不报错
应用场景:查看内存空间容量的一个标准,不存在具体函数的实现,任何环境下都可以使用。
而printf是具体的函数,在裸机的情况下就无法实现
return :返回的概念
10——数据结构关键字及char类型:
C语言的关键字:限制内存的大小
如果被提问占用内存的大小:应该是与编译器有关,不一定是定值
char类型:应用场景——硬件处理的最小单元
软件操作的最小单位:8bit=B
char :2如果采用8bit,所能采取的最大数据时256,注意溢出情况
有符号or无符号:内存的最高字节是符号位还是数据;
unsigned :数据
signed:数字(有正负)
涉及到位运算:右移运算
浮点数:非常耗内存空间
double :8个字节
float:4个字节
void a;是一种声明标志;
13——C语言自定义数据类型
struct:元素之间的和;
共用体:其实就是共用大家的起始地址,使用内存空间
union: 技巧性代码
#include "stdio.h"
union myabc{
char a;
int b;
float c;
};
int main(void)
{
union myabc abc;
abc.b = 2;
printf("%d\n",abc.b);
return 0;
}
enum:使用较少;是一个常数集合,与define一致
使用场景:
#include "stdio.h"
enum week{A,B,C,D,E,F,G};//week是集合的代名词,可有可无
//数字顺序默认是 0开始,也开始指定
enum {Q=100,W,R};//
int main(void)
{
printf("%d-",A);
printf("%d-",B);
printf("%d-",C);
printf("%d-",D);
printf("%d-",E);
printf("%d-",F);
printf("%d\n",G);
printf("%d-",Q);
printf("%d-",W);
printf("%d\n",R);
return 0;
}
/*-----------------------------------------
0-1-2-3-4-5-6
100-101-102
Press any key to continue
------------------------------------------*/
enum的字节问题:
typedef的使用:
int a 定义了一个整型变量
typedef int a; a是int 的外号
C语言逻辑结构:
goto:尽量不要用,只能在同一个函数之间跳
类型描述符:
对内存资源存放位置的限定:
auto: 占位符,默认情况下分配的内存可读可写
regisiter : 限制变量在寄存器的内存上
内存:存储器
register int a
限制变量定义在存储器上的修饰符
定义一些快速访问的变量
编辑器会尽量的安排CPU的寄存器去存放这个A,如果
寄存器不足时,a还是放在存储器上
PS:对于register不能取地址
static:
应用场景:
修饰三种数据:
(1)修饰函数内部的变量
int fun()
{
int a;-> static int a;//两者区别很大
}
(2) 修饰函数外部的变量
int a;-> static int a;//两者区别很大
int fun()
{
}
(3)函数的修饰符
int fun(); static int fun();
const:
常量的定义
const int a;//只读的变量
volatile:告知编译器编译方法的关键字,不优化编译
应用:嵌入式底层应用十分多;
注:
告知编译器编译方法的关键字,不进行优化;
修饰变量的修改,不仅仅可以通过软件,也可以通过其他方式(硬件)