之前介绍了Linux的相关知识,熟悉了Linux之后,我们还需深入学习嵌入式的其他工具。今天开始我们学习嵌入式系统开发的首选语言--C语言以及C语言的应用

C语言对于我们并不陌生,生活中的许多场景与事物中都有C语言的身影,例如家中的空调,洗衣机,游戏引擎的底层模块,人工智能等等,他们功能的实现都离不开C;再者说,许多大学专业仍将C语言作为重要的专业学科,那么C语言到底是什么,为什么它被称为嵌入式开发的首选语言?带着这样的疑问我们开启今天的学习

一. 什么是C 语言

C 语言是一种通用的、面向过程的高级编程语言,由美国贝尔实验室的丹尼斯·里奇(Dennis Ritchie)在 1972 年开发。最初用于重写 UNIX 操作系统,后来因其高效性和可移植性成为广泛使用的编程语言

C语言的特点

  • 高效性:编译为机器码,执行速度接近汇编语言
  • 可移植性:同一份代码经过重新编译可在不同硬件平台上运行
  • 功能强大:支持直接访问内存和硬件,适合系统级编程
  • 语法简洁:关键字少,结构清晰,学习门槛较低

C 语言的历史发展

  • 1972 年:丹尼斯·里奇在贝尔实验室开发 C 语言,用于 UNIX 操作系统
  • 1978 年:《The C Programming Language》(K&R C)出版,成为标准参考
  • 1989 年:ANSI 制定 C89 标准(ANSI C)
  • 1999 年:ISO 推出 C99 标准,引入 long long、单行注释 // 等特性
  • 2011 年:C11 标准发布,改进多线程支持和安全性

二. 为什么C 语言被称为嵌入式系统开发的首选语言

  1. 硬件访问能力强
    嵌入式开发经常需要直接操作寄存器、端口和外设,C语言可以通过指针直接操作寄存器、端口和外设,满足底层开发需求

  2. 运行效率高
    C语言是编译型语言,编译型语言可以生成高效的机器码,适合实时性要求高的嵌入式系统

  3. 可移植性好
    同一代码在不同平台重新编译即可运行,便于跨硬件迁移

  4. 资源占用低
    相比Java、Python等语言,C语言运行时无需庞大的虚拟机或运行时库,适合内存和存储有限的设备

  5. 成熟的生态
    拥有 GCC 等成熟编译器、调试工具和丰富的开源库支持

其中最重要的就是嵌入式是基于操作系统进行开发,操作系统最核心的部分就是内核,而操作系统的内核又均采用C语言,这也就是C语言成为嵌入式系统开发的首选语言的原因

补充一下,内核都用C语言作为开发语言的原因是因为嵌入式要与硬件打交道,而C语言刚好具有访问硬件的能力(同时也是C语言的特点),于是C语言在嵌入式中变得不可或缺


三、 C 语言基础之数据类型详解

作为C语言给学者的“第一印象”,数据类型既“重要”又“不重要”,为什么这么说呢?不重要是因为数据类型的理解与记忆较为容易,且在后续的编程练习中会经常用到,许多学者会形成肌肉记忆;重要则是因为数据类型的字节长度以及数据类型在地址跟指针中的应用在后续的章节中会经常出现且迷惑性极强

作为C语言的开端,我们就由浅入深,今天先来介绍数据类型“浅水区”的名称、大小以及取值范围

基本数据类型

数据类型 大小(字节) 取值范围 示例代码
char 1 -128 ~ 127(signed char)或 0 ~ 255(unsigned char char c = 'A';
unsigned char 1 0 ~ 255 unsigned char uc = 200;
short 2 -32768 ~ 32767 short s = 1000;
unsigned short 2 0 ~ 65535 unsigned short us = 50000;
int 4(多数系统) -2147483648 ~ 2147483647 int i = -12345;
unsigned int 4 0 ~ 4294967295 unsigned int ui = 4000000000;
long 4 或 8 视平台而定(32 位为 -2147483648 ~ 2147483647) long l = 123456789L;
unsigned long 4 或 8 视平台而定(32 位为 0 ~ 4294967295) unsigned long ul = 4000000000UL;
long long 8 -9223372036854775808 ~ 9223372036854775807 long long ll = 123456789012345LL;
unsigned long long 8 0 ~ 18446744073709551615 unsigned long long ull = 18446744073709551615ULL;
float 4 约 ±3.4e±38(6-7 位有效数字) float f = 3.14f;
double 8 约 ±1.7e±308(15 位有效数字) double d = 3.1415926535;
void 无值,用于函数无返回值或通用指针 void func();void* ptr;

这里的signed代表有符号,unsigned代表无符号,表中也有解释,这里再做一下说明

补充

表中提到的字节长度就是占内存的大小,计算机内存单位的最小单位是位(bit),基本单位是字节(byte),这里给出一些常用的计算机内存换算:

        1 byte(B) = 8 bit

        1 KB =  1024 B

        1 MB = 1024 KB

        1 GB = 1024 MB

复合数据类型

  • 数组:相同类型数据的集合

    int arr[5] = {1, 2, 3, 4, 5};
    

  • 结构体(struct):不同类型数据的组合

    struct Student { 
        char name[20]; 
        int age; 
    };
    

  • 共用体(union):成员共享内存

    union Data { 
        int i; 
        float f; 
    };
    

  • 枚举(enum):定义一组命名的整数常量

    enum Color { RED, GREEN, BLUE };
    

    以上就是常见的数据类型,大家可以花点时间记忆一下并理解一下,以便可以快速上手编写一些小的代码练练手


数据类型大小测量方法

表格中是已给定的数据类型大小,那么对于不认识或是想亲手得到数据类型大小的类型我们该怎么办呢?这里为大家介绍后续常用的一些方法

  1. 使用 sizeof 运算符

    printf("int size: %zu\n", sizeof(int));
    printf("char size: %zu\n", sizeof(char));
    

    (这个方法不光常用,而且经常在考试等考核中出现,主要是与strlen进行对比)

  2. 指针大小
    64 位系统中为 8 字节,32 位系统中为 4 字节。

  3. 数组长度计算
    元素个数 × 单个元素大小。


sizeofstrlen 的区别
  • sizeof:测量内存总大小(包括 \0)。
  • strlen:测量字符串有效长度(遇到 \0 停止)。

示例:

char *s1 = "hello world";
char s2[100] = "hello world";

sizeof(s1);  // 8(指针大小)
sizeof(s2);  // 100(数组总大小)
strlen(s1);  // 11
strlen(s2);  // 11

用的时候要注意对象以及应用场景,这两个后续的考核中会经常出现

四、总结

今天主要对C语言的简介与重要性做一下阐述,展开了C语言的基础之一------数据类型的认识与学习,希望大家通过以上内容学到一点知识,后续还会开展其他板块的学习

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐