嵌入式从入门到入土 C语言:概述及数据类型

C语言:概述

预备知识

计算机的组成

计算机组成
  • 计算机:能进行计算和逻辑的设备
  • 硬件:组成计算机的各种物理部件。(鼠标,键盘)
硬件 = 电子设备 + 单片机编程(单片机,微控制器)+ 集成电路(原理图PCB设计)+ 嵌入式系统

软件:计算机中运行的程序和数据。

软件 = 系统软件(Linux系统)+ 应用软件 + 编程语言(C/C+++ 算法和数据结构s
计算机的六大部件
  • 中央处理器(CPU)
  • 内存
  • 输⼊设备
  • 输出设备
  • 外存储器
  • ⽹络
计算机的工作原理

简单理解:“存储程序、程序控制

计算机语言

存储在计算机中的一切内容都是二进制的数字形式

数据:数、字符、图片等

  • 机器语言:二进制(0和1构成)
  • 汇编语言:充当翻译
  • 高级语言:C/C++,Java,Python,PHP,C#

C语言的简史与特点

嵌入式开发就是针对Linux系统的开发,而Linux系统是使用C语言开发的,所以从事嵌入式开发要使用C语言。

C语言特点

  • C语言是一种强大而灵活的语言,可以用来编写任意复杂的程序。
  • C语言简洁、紧凑,使用方便。
  • C语言是可移植的。
  • C语言很适合结构化程序设计,因而要求用户以功能模块的方式来思考问题。
  • C语言可直接控制硬件(位运算符,地址)
  • 生成目标代码质量高,程序执行效率高,运行速度快。

C语言的开发过程

开发一般分为三个步骤:

  • 编辑(程序员向.c文件写入程序)
  • 编译(将.c文件编译为二进制文件)
  • 运行(运行可执行程序)

在这里插入图片描述

C语言程序的编译过程(细节:后续预处理课程讲解)

编译过程分为四个步骤:

  • 预处理(所有的.h文件复制到对应的.c文件中)

  • 编译(将.c文件转换为字节码文件)

  • 汇编(将字节码文件转换为二进制文件)

  • 链接(与标准库的二进制文件一起打包)

    在这里插入图片描述

注意:标准库也是以二进制形式存在

C语言的基本结构

一个简单的C语言程序

功能:要求在控制台输出“hello world!”

代码:

// 引入系统库(系统的标准输入输出库,如:scanf(),printf())
#include <stdio.h>

// 入口函数:每一个.c文件有且仅有一个入口函数
// C语言中入口函数的返回值和参数列表比较灵活,唯一的要求:函数名必须是main
int main(int argc,char *argv[])
{
    // 向控制台输出hello world!
    printf("hello world!\n");// 一行代码执行结束,使用“;”表示结束
    
    return 0; 
}

程序结构分析:

  • 注释:
    • 代码中起到解释说明的文字(提高代码的可读性),或者对代码进行屏蔽,不会被执行
  • 预处理命令:
    • 程序中包含的某一文件的内容
  • 主函数:
    • C程序的入口函数,一个C文件有且仅有一个主函数(main函数)
  • 函数首部(函数头)/函数说明
    • 说明函数类型,函数名和函数参数,举例:int main(...)
  • 函数体:
    • 包括变量说明和语句执行部分,举例:(...)
  • 函数调用语句
    • 比如格式输出函数:printf(),输入"hello world!"

C语言编码规范要求

C语言在编码的时候,需要遵循如下规范:

  • 常用缩进书写格式(一般缩进2~4个字符,推荐4个字符)
  • 有足够的注释(添加必要的注释,使代码更好的理解)
  • 有合适的空行(一般预处理的命令和函数,全局变量和函数、函数和函数之间要有空行,使得代码结构更清晰)
  • {}的对齐(C和C++中 {}都需要独占一行)
  • 函数体内采用分层缩进和模块化的书写方式。
  • 不把多条语句写在程序的同一行上。
  • 命名:变量或者函数命名要尽可能包含更多含义,但不能太长。

C语言程序的设计特点

C语言程序在设计的时候,需要注意以下细节:

  • 以C语言由一个或者多个函数组成,但有且仅有一个主函数(main函数);main含是程序的执行入口,可置于程序的任意位置
  • 程序中可以有预处理命令(如:#include命令)预处理命令通常在程序的最前面。
  • 每个语句以分号结尾;预处理命令函数头和==花括号 {}==之后不能加分号。
  • 函数体由一对花括号 {} 括起来。
  • 包含在/…/内的文本为注释。
  • 一行可以写几个语句,一个语句也可以写在多行上。
  • 程序区分大小写字母。一般变量、语句等用小写字母书写;符号常量、宏名等用大写字母书写。
  • 标识符和保留字之间必须加空格分隔,如:int age。

C语言中的注释

在C语言中,注释一般分为两类,单行注释多行注释

注释的作用:给代码添加解释说明性文字,提升代码的可读性,注释本身是不会被执行的,同时也可以使用注释屏蔽掉代码。

单行注释

说明:单行注释使用双斜杠//..表示。我们一般用于常量、变量等的定义。

语法:

// 单行注释

示例:

//预处理指令,引入系统的标准输入输出库
#include <stdio.h>
int main()
{
	// 打印信息到控制台
    printf("hello world");
}

多行注释

说明:多行注释使用斜杠星号/*...*/表示。他可以占用多行代码,但不能嵌套。我们一般用于函数,文件头说明。
语法:

/*
要注释
的代码
*/

示例:

//预处理指令,引入系统的标准输入输出库
#include <stdio.h>
/*
主函数
*/
int main()
{
//打印信息到控制台
printf("hello world!");
}

注意:由多行注释衍生出一种更为细致的注释,我们称之为文档注释

示例:

 // 预处理指令,引入系统的标准输入输出库
#include <stdio.h>
 /**
 *  主函数
 *  @author 开发者
 *  @param 参数
 *  @return 返回值
 *  ..
 */
 int main()
 {
    // 打印信息到控制台
    printf("hello world!");
 }

C语言:数据类型

定义

数据类型其实是固定大小内存的别名,并且描述了一个变量存放什么类型的数据。简单来说,就是组织和操作数据

数据:计算机要处理的数据(数字、字符串、文字、符号、图片、音频、视频等)。

  • 数据类型不仅帮助我们组织和操作数据,还决定程序如何有效的利用内存。
  • 了解数据类型的内存需求是理解计算机管理和操作数据的关键。
小贴士:
简单来讲,程序的运行需要用到内存。

内存存储容量单位

字节(byte):计算机存储容量的一种单位,一般应用层最小存储单元的表示。

比特位(bit):二进制数(0和1)计算机是以二进制的方式进行存储的,我们应用层可以通过位运算进行位的操作。

1个字节(BYTE)= 8位(BIT)

1个千字节(KB)= 1024字节

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

数据类型的分类

image-20241125185200938
数据类型在内存中的大小
序号数据类型中文说明大小(字节)
short短整型2
int基本整型4
long(long int)长整形4(32位编译器)/8(64位编译器)
long long (long long int)长长整形8
fioat单精度浮点型4
double双精度浮点型8
char字符型1
bool(Bool)布尔型,真-ture,假-falsebool:1,true:4,false:4

注意:因为在C语言中没有Byte这个单位,所以我们一般使用char来表示字节,因为1个char == 1个byte


注意:

某个数据类型或者变量所占的字节数→sizeof(某个数据或者变量名)

printf("true size:%d\n",sizeof(ture));// ture size:4 占4个字节,boolean底层是0和非0
printf("false size:%d\n",sizeof(false));//false size:4 占4个字节
printf("bool size:%d\n",sizeof(bool));//bool size:占1个字节

总结:

①数据类型在内存中所占的字节数跟C语言的编译系统有关

②计算某个数据类型所占的字节数可以用sizeof

③布尔类型要添加 #incldue <stdbool.h>,大家也可以使用int类型的0表示假,非0表示真。

课堂练习

校验各个数据类型在内存的大小?

常量与变量

在C语言中,数据的基本变形形式是常量和变量。不管是常量还是变量,都是需要在内存中开辟一块空间,用于数据的存放。

常量

定义:在程序执行过程中其值不能被改变的量。

分类:int、float、double、char和符号常量。

整形常量(int)
  • 整形常量可用十进制、八进制、十六进制三种形式表示。
    • 十进制整形常量:由0~9的数字组成,没有前缀,不能以0开头(比如:0是可以的,但是09是不可以的)。

    • 八进制整形常量:以0为前缀,其中由0~7的数字组成,没有小数部分。(比如023)

    • 十六进行整形常量:以 0x或者 0X为前缀,其后由 0~9的数字和 A~F(大小写均可)字母组成,没有小数部分。(比如0x00FF0000)

      整型常量中的长整型数据可用 L作为后缀,(比如:123L)

  • 整型常量的分类
    • 有符号与无符号基本整型常量
    • 有符号与无符号长整型常量
    • 有符号与无符号短整型常量

在这里插入图片描述

  • 整形常量的表示
    • 十进制表示:可以使用10个数字符号0~9以及+-,如123-456
    • 八进制表示:以0开头,可以使用7个数字符号0~7以及+-,如0123-011
    • 十六进制表示:以0x开头,符号有0~9,A~F(a~f),如:0x12-0x11
  • 浮点型常量

    C语言中的浮点数就是平常所说的实数,有两种表现形式:

    • 十进制小数形式:如:0.123-17.8

    • 指数形式(科学计数法),如:1230.0可以表示为1.23e3或者1.23E3

      注意:

      ①在符号e的前面必须要有数字

      ②在符号e的后面必须为整数,不能是带有小数点的实数型。实型常量的后缀用F(或者f)表示单精度型。后缀用L(或者l)表示双精度型。

字符常量

用单引号 ''括起来的一个字符,如:'a''A''_'等,比如:'或'就不是字符,一个汉字所占的字节数超过1个。中文符号当成汉字理解。英文输入法下输入的字母、数字、符号都是单字符。

转义字符常量:

以反斜杠'\'开头的字符序列,表示控制及不可见的字符,如:

序号字符形式含义ASCII码
\n换行10
\r回车13
\0空字符0
\t水平制表9
字符串常量

说明:在C语言中,是支持字符串常量的,但是不支持字符串变量,字符串变量需要使用字符数组或者字符指针实现。

  • 用一对双引号 ""括起来的一个字符序列,如:"How do you do?""China""12""true""12.25"等。

  • 可以输出一个字符序列,如:printf(“hello world!”);

    注意:

    字符串常量"a"与字符常量’a’的区别

    在这里插入图片描述

    系统自动为字符串常量加上结尾的"\0",使所占的内存单元多一个,单字符常量的长度不变,可用sizeof()运算来测量。

1个中文字符 = 2英文字符,中文字符在内存中的实际占用空间 = 2个数据字节 + 空位字节(\0)= 3个字节。

符号常量

定义一个标识符来代表一个常量。

如:用PI代表圆周率π,即3.1415926

好处:

  • 增加可读性
  • 增强了可维护性

定义符号常量:

  • 用编译预处理命令 #define(宏定义)

    格式:

    #define 标识符 字符串
    
  • 标识符和字符串之间用空格隔开

  • 句末不用分号

  • 标识符的命名采用大写,如果有多个单词,使用下划线分隔,举例:MAX_VAL,MIN_VAL,AVG

#include <stdio.h>

// 定义了一个符号常量n
#define PI 3.14
// 定义了一个符号常量r
#define R 5

int main()
{
inta=PI*R*R;//预处理后:inta=3.14;*5*5
}

案例:

在程序中使用符号常量。

#define PRICE 30		     /*定义符号常量PRICE*/
#include <stdio.h>
void main()
{
	int num,total;			/*定义整型变量*/
    num =10;				/*给变量赋值*/
	total = num* PRICE;		 /*符号常量参加运算*/
	printf("total=%d\n",total);
}

说明:

  • 程序中⽤#define PRICE 30定义了符号常量PRICE的值为30,伺候程序中出现的PRICE都⽤30代替。

  • 符号常量不占内存单元。

  • 此后在本函数中不允许改变PRICE的值,也不允许再为其赋新的值。

  • 使⽤符号常量的好处:

  • 含义清楚

  • ⼀改全改

nta=PIRR;//预处理后:inta=3.14;55
}


**案例:**

在程序中使用符号常量。

```c
#define PRICE 30		     /*定义符号常量PRICE*/
#include <stdio.h>
void main()
{
	int num,total;			/*定义整型变量*/
    num =10;				/*给变量赋值*/
	total = num* PRICE;		 /*符号常量参加运算*/
	printf("total=%d\n",total);
}

说明:

  • 程序中⽤#define PRICE 30定义了符号常量PRICE的值为30,伺候程序中出现的PRICE都⽤30代替。

  • 符号常量不占内存单元。

  • 此后在本函数中不允许改变PRICE的值,也不允许再为其赋新的值。

  • 使⽤符号常量的好处:

  • 含义清楚

  • ⼀改全改

变分模态分解(Variational Mode Decomposition, VMD)是一种强大的非线性、无参数信号处理技术,专门用于复杂非平稳信号的分析与分解。它由Eckart Dietz和Herbert Krim于2011年提出,主要针对传统傅立叶变换在处理非平稳信号时的不足。VMD的核心思想是将复杂信号分解为一系列模态函数(即固有模态函数,IMFs),每个IMF具有独特的频率成分和局部特性。这一过程与小波分析或经验模态分解(EMD)类似,但VMD通过变分优化框架显著提升了分解的稳定性和准确性。 在MATLAB环境中实现VMD,可以帮助我们更好地理解和应用这一技术。其核心算法主要包括以下步骤:首先进行初始化,设定模态数并为每个模态分配初始频率估计;接着采用交替最小二乘法,通过交替最小化残差平方和以及模态频率的离散时间傅立叶变换(DTFT)约束,更新每个模态函数和中心频率;最后通过迭代优化,在每次迭代中优化所有IMF的幅度和相位,直至满足停止条件(如达到预设迭代次数或残差平方和小于阈值)。 MATLAB中的VMD实现通常包括以下部分:数据预处理,如对原始信号进行归一化或去除直流偏置,以简化后续处理;定义VMD结构,设置模态数、迭代次数和约束参数等;VMD算法主体,包含初始化、交替最小二乘法和迭代优化过程;以及后处理,对分解结果进行评估和可视化,例如计算每个模态的频谱特性,绘制IMF的时频分布图。如果提供了一个包含VMD算法的压缩包文件,其中的“VMD”可能是MATLAB代码文件或完整的项目文件夹,可能包含主程序、函数库、示例数据和结果可视化脚本。通过运行这些代码,可以直观地看到VMD如何将复杂信号分解为独立模态,并理解每个模态的物理意义。 VMD在多个领域具有广泛的应用,包括信号处理(如声学、振动、生物医学信号分析)、图像处理(如图像去噪、特征提取)、金融时间序列分析(识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值