嵌入式C语言基础

最近在加强单片机开发的基础,所以买了韦东山的7天物联网智能家居训练营的课程,以此来把基础打扎实。

目录

前言:

1.数据类型

2.const 用法

 1) 修饰变量

2) 修饰数组

3) 修饰指针

4) 修饰函数参数

3.extern的用法


前言:

嵌入式C语言的基本结构与特点:

1) 所有的C语言程序都需要包含main()函数,代码从main()函数开始执行;这一条在嵌入式中不一定完全正确,在执行main()函数之前也有开发者可以操纵的空间,因而开始函数可以不是main(),例如也可以是myMain()这样的函数,而这所涉及到的知识已经超过基础知识的范围,会在后续详细说明;
2) C语言的语句以用分号“ ;”结束;
3) C语言的注释有行注释(“ //”)和段注释(“/*…*/”);
4) 函数是C语言的基本结构,每个C程序都是由至少一个函数组成;
5) C语言的文件有两种格式:源文件.c文件和头文件.h文件,通常.c文件用于功能函数的实现,而.h文件用于预处理、宏定义和声明等;在嵌入式中,通常将某个硬件模块的功能实现函数及其声明和包含的全局变量声明分别处理到一个.c和.h文件中,例如led.c、 hello.c和led.h、 hello.h就分别对应于LED灯的功能函数及其声明和hello的功能函数及其声明;
6) 我们将这种基于某个模块的独立设计称之为模块化设计,在一个系统中通常是由许许多多的模块共同组成的,因而模块化设计是一个非常科学且非常值得学习的程序设计方法;
7) 除了模块化设计,通常嵌入式的编程设计还有层次化设计。在一个工程系统中,硬件驱动仅仅只是第一步,对硬件的应用则是一个功能丰富的系统的更进一步的设计,通常在这一块会设计到例如图像处理、数据处理等算法;我们可以笼统的将一个嵌入式工程系统分为驱动层和应用层。

1.数据类型

在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统,变量的类型决定了变量存储占用的空间以及如何解释存储的位模式。在嵌入式系统中,芯片的容量是有限的,且对比于PC机容量通常都是比较小的,因而了解变量所占用的存储空间是嵌入式开发者应当掌握的一项技能,所以对于不同数据类型在不同位数的芯片中(例如STM32xxx就表示此款芯片是32bit的芯片, STM8xxx表示此款芯片是8bit的芯片)的长度开发者也应该掌握。C语言中的数据类型有以下几种:
 

嵌入式C语言基础_第1张图片

图 1 C 语言数据类型

就以STM32F103ZE这一款芯片为例,这是一块32bit的MCU,基本数据类型在此款芯片中的数据长度,以及在HAL库函数中的定义( stdint.h文件中的定义,采用C99标准)如图 5.3.2 所示。 这里建议开发者在开发过程中使用库定义的数据类型, 来定义变量或函数, 比如unsigned char a, 使用uint8_t a。
嵌入式C语言基础_第2张图片

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)
{
    return ((i>j)?i:j);
}
/* main.c */
#include 
extern uint16_t a;
extern uint16_t max(uint16_t i, uint16_t j);
void main(void)
{
    printf("a=%d\r\n", a);
    printf("Max number between 5 and 9: %d\r\n", max(5, 9));
}

extern关键字还有一个重要的作用,就是如果在C++程序中要引用C语言的文件,则需要用以下格式:
 

#ifdef __cplusplus
extern "C"{
#endif /* #ifdef __cplusplus */
......
#ifdef __cplusplus
}
#endif /* #ifdef __cplusplus */

本节分享嵌入式C语言基础先去学习这个课程了,如果有需要这个课程的可以私信我(q:316074750)。

嵌入式C语言基础_第3张图片

嵌入式C语言基础_第4张图片

你可能感兴趣的:(7天物联网智能家居训练营,物联网,C语言)