嵌入式C(P1-P19)

嵌入式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:告知编译器编译方法的关键字,不优化编译
应用:嵌入式底层应用十分多;
注:
告知编译器编译方法的关键字,不进行优化;
修饰变量的修改,不仅仅可以通过软件,也可以通过其他方式(硬件)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值