前言:
嵌入式C语言的基本结构与特点:
- 所有的C语言程序都需要包含main()函数,代码从main()函数开始执行;这一条在嵌入式中不一定完全正确,在执行main()函数之前也有开发者可以操纵的空间,因而开始函数可以不是main(),例如也可以是myMain()这样的函数,而这所涉及到的知识已经超过基础知识的范围,会在后续详细说明;
- C语言的语句以用分号“ ;”结束;
- C语言的注释有行注释(“ //”)和段注释(“/*…*/”);
- 函数是C语言的基本结构,每个C程序都是由至少一个函数组成;
- C语言的文件有两种格式:源文件.c文件和头文件.h文件,通常.c文件用于功能函数的实现,而.h文件用于预处理、宏定义和声明等;在嵌入式中,通常将某个硬件模块的功能实现函数及其声明和包含的全局变量声明分别处理到一个.c和.h文件中,例如led.c、 hello.c和led.h、 hello.h就分别对应于LED灯的功能函数及其声明和hello的功能函数及其声明;
- 我们将这种基于某个模块的独立设计称之为模块化设计,在一个系统中通常是由许许多多的模块共同组成的,因而模块化设计是一个非常科学且非常值得学习的程序设计方法;
- 除了模块化设计,通常嵌入式的编程设计还有层次化设计。在一个工程系统中,硬件驱动仅仅只是第一步,对硬件的应用则是一个功能丰富的系统的更进一步的设计,通常在这一块会设计到例如图像处理、数据处理等算法;我们可以笼统的将一个嵌入式工程系统分为驱动层和应用层。
1.数据类型
在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,变量的类型决定了变量存储占用的空间以及如何解释存储的位模式。在嵌入式系统中,芯片的容量是有限的,且对比于PC机容量通常都是比较小的,因而了解变量所占用的存储空间是嵌入式开发者应当掌握的一项技能,所以对于不同数据类型在不同位数的芯片中(例如STM32xxx就表示此款芯片是32bit的芯片, STM8xxx表示此款芯片是8bit的芯片)的长度开发者也应该掌握。C语言中的数据类型有以下几种:
图 1 C 语言数据类型
就以STM32F103ZE这一款芯片为例,这是一块32bit的MCU,基本数据类型在此款芯片中的数据长度,以及在HAL库函数中的定义( stdint.h文件中的定义,采用C99标准)如图 5.3.2 所示。 这里建议开发者在开发过程中使用库定义的数据类型, 来定义变量或函数, 比如unsigned char a, 使用uint8_t a。
2.const 用法
C语言中const关键字是constant的缩写,译为常量、常数等,但const关键字不仅仅是用于定义常量,还可以用于修饰数组、指针、函数参数等。
1) 修饰变量
C语言中使用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。 例如:
const int i = 5;这个例子表明整形变量i具有只读性,不能够被修改;若想对其重新赋值,例如i=10则是错误的用法。需要注意的是, const定义变量的同时还必须对其初始化, const可以放在数据类型的前面或者后面,比如上述例子也可以写成:
int const i = 5;
此外, const修饰变量还起到了节约空间的目的,通常编译器并不给普通const只读变量分配空间,而是将它们保存在符号列表中,无需读写内存操作,程序执行效率也会提高
2) 修饰数组
C语言中const还可以修饰数组,例如:
const int array[5] = {0, 1, 2, 3, 4};
// 或
int const array[5] = {0, 1, 2, 3, 4};
const关键字修饰数组与修饰变量类似,表明此数组具有只读性,不可修改, 一旦被更改程序会出错,例如上述例子如果:
array[1] = 10;
则程序将会提示错误。
3) 修饰指针
C语言中const修饰指针需要特别注意,共有两种形式,一种是用来限定指向空间的值不可修改;另一种是限定指针不可修改,例如:
int i = 5;
int k = 10;
int const *p1 = &i;
int * const p2 = &k;
对于指针p1, const修饰的是*p1,即p1指向的空间的值不可改变,例如*p1 = 20;就是错误的用法;但是
p1的值是可以改变的,例如p1 = &k;则没有任何问题。对于指针p2, const修饰的是p2,即指针本身p2不可更改,而指针指向空间的值是可以改变的,例如*p2= 15;是没有问题的,而p2 = &i;则是错误的用法。
4) 修饰函数参数
在C语言中const修饰函数参数对参数起限定作用,防止其在函数内部被意外修改,所限定的参数可以是普通变量也可以是指针变量,如:
int k = 0;
void fun3(void)
{
for(k=0; k<10; k++)
{
...
}
}
我们则将定义在函数体外的变量称之为全局变量,其作用范围为当前源文件和工程,若其它源文件想要
调用用此变量需要在文件内使用关键字extern声明,如extern int k。
简单的总结下局部变量和全局变量的特点:
3.extern的用法
在C语言中, extern关键
字用于指明函数或变量定义在其它文件中,提示编译器遇到此函数或者变量的时候到其它模块去寻找其定义,这样被extern声明的函数或变量就可以被本模块或其它模块使用。因而, extern关键字修饰的函数或者变量是一个声明而不是定义,例如:
/* example.c */
uint16_t a = 0;
uint16_t max(uint16_t i, uint16_t j)
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/14af38f9b79c9c772477455b106a46cd.png)
![img](https://img-blog.csdnimg.cn/img_convert/bb1039828b9d37a6ec52c104ce0b59e3.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/8cf8a8937fad2d19ff6dc3656231fb8d.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
![img](https://img-blog.csdnimg.cn/img_convert/8eac8bdbb11f8aef8820e1b27d50f05d.png)
![img](https://img-blog.csdnimg.cn/img_convert/b5898934dd3e1daab25bcfe70f9390de.png)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**
<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />
# 最后
**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**
73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />
# 最后
**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**
**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**
**[更多资料点击此处获qu!!](https://bbs.csdn.net/topics/618376385)**