一、课程目标

  1. 巩固嵌入式C语言基础语法,适配嵌入式开发实战场景

  2. 掌握C语言核心数据类型、运算符及表达式的实战用法

  3. 熟练运用分支、循环语句,解决嵌入式简单逻辑问题

  4. 理解函数的定义、调用及参数传递,适配嵌入式函数编程规范

  5. 掌握数组的基本操作,为后续嵌入式数据处理打下基础

  6. 培养嵌入式C语言编程思维,规避基础编程错误


二、嵌入式C语言基础回顾与实战适配

1. C语言与嵌入式开发的关联

嵌入式开发的核心编程语言为C语言,其高效、简洁、可直接操作硬件的特性,完美适配嵌入式设备(资源有限、实时性要求)的需求。本模块聚焦实战,所有示例、练习均贴合嵌入式场景(如硬件状态判断、简单数据采集)。

2. 基本程序结构

嵌入式C语言标准程序结构
#include <stdio.h>  // 标准输入输出头文件(嵌入式常用)
#include <stdlib.h> // 通用工具函数头文件

// 主函数:嵌入式程序入口(唯一)
int main(void) {
    // 函数体:嵌入式逻辑实现
    printf("Embedded C Advanced - Module 1\n"); // 调试打印(实战常用)

    return 0; // 程序正常退出(嵌入式中可用于状态反馈)
}

说明:嵌入式程序中,主函数是唯一入口,printf常用于调试信息输出,后续将结合开发板串口打印实战。


三、核心基础:数据类型与变量

1. 嵌入式常用数据类型

嵌入式设备资源有限,需优先使用占用内存小、效率高的数据类型,避免冗余。

嵌入式常用数据类型示例
#include <stdio.h>

int main(void) {
    // 基础数据类型(实战高频)
    char led_state = 0;        // 字符型:存储硬件状态(0=熄灭,1=点亮),占用1字节
    short temp = 25;           // 短整型:存储温度等小范围数据,占用2字节
    int count = 100;           // 整型:通用计数,占用4字节(嵌入式主流)
    unsigned int timer = 500;  // 无符号整型:仅存正数,适合计时、计数
    float voltage = 3.3;       // 单精度浮点型:存储电压、电流等小数(嵌入式够用)

    // 打印验证(实战调试常用)
    printf("LED状态:%d\n", led_state);
    printf("当前温度:%d℃\n", temp);
    printf("供电电压:%.1fV\n", voltage);

    return 0;
}

2. 变量定义与初始化

  • 变量命名:遵循“功能+类型”,如 led_state(LED状态)、temp_sensor(温度传感器数据)

  • 必须初始化:嵌入式中未初始化变量会导致随机值,引发硬件操作异常

变量初始化错误与正确示例
// 错误示例(嵌入式禁止)
int data; // 未初始化,值随机,可能导致硬件误操作

// 正确示例(实战规范)
int data = 0; // 初始化為0,避免随机值
unsigned char uart_data = 0x00; // 十六进制初始化(嵌入式硬件操作常用)

四、运算符与表达式

1. 常用运算符(实战高频)

重点掌握算术运算符、关系运算符、逻辑运算符,适配硬件状态判断、数据计算场景。

运算符实战示例(硬件状态判断)
#include <stdio.h>

int main(void) {
    // 模拟硬件数据
    int temp = 30;          // 温度数据
    int temp_threshold = 28;// 温度阈值(超过则报警)
    char led_state = 1;     // LED状态(1=亮)

    // 算术运算符:计算温度差值
    int temp_diff = temp - temp_threshold;

    // 关系运算符:判断温度是否超标
    int is_over_temp = temp > temp_threshold;

    // 逻辑运算符:判断LED是否亮且温度超标
    int is_alert = (led_state == 1) && (temp > temp_threshold);

    // 输出结果(调试用)
    printf("温度差值:%d℃\n", temp_diff);
    printf("温度是否超标:%d(1=是,0=否)\n", is_over_temp);
    printf("是否触发报警:%d(1=是,0=否)\n", is_alert);

    return 0;
}

2. 表达式优先级

嵌入式编程中,优先级错误会导致逻辑异常,重点记住:括号 > 算术 > 关系 > 逻辑 > 赋值。

优先级避坑示例
// 错误示例:逻辑判断优先级低于赋值,导致结果错误
int flag = 1 && 0; // 正确结果0,若误写为int flag = 1 && 0; 无问题,重点看复杂场景

// 正确示例:用括号明确优先级(嵌入式推荐)
int flag = (1 && (temp > 28)) || (led_state == 0);

五、分支语句-嵌入式逻辑控制核心

1. if-else语句

if-else实战(LED状态控制)
#include <stdio.h>

int main(void) {
    // 模拟LED状态:0=熄灭,1=点亮,2=闪烁
    char led_state = 1;

    if (led_state == 0) {
        printf("LED状态:熄灭\n");
        // 实战中可添加硬件控制代码:GPIO输出低电平
    } else if (led_state == 1) {
        printf("LED状态:点亮\n");
        // 实战中可添加硬件控制代码:GPIO输出高电平
    } else {
        printf("LED状态:闪烁\n");
        // 实战中可添加硬件控制代码:GPIO高低电平切换
    }

    return 0;
}

2. switch-case语句

适合多状态判断(如传感器多种反馈、设备工作模式切换),比if-else更简洁。

switch-case实战(设备工作模式)
#include <stdio.h>

int main(void) {
    // 模拟设备工作模式:1=待机,2=运行,3=调试,4=休眠
    int work_mode = 2;

    switch (work_mode) {
        case 1:
            printf("设备模式:待机\n");
            break; // 必须加break,避免穿透(嵌入式高频坑)
        case 2:
            printf("设备模式:运行\n");
            break;
        case 3:
            printf("设备模式:调试\n");
            break;
        case 4:
            printf("设备模式:休眠\n");
            break;
        default:
            printf("设备模式:异常\n"); // 异常处理(嵌入式必备)
            break;
    }

    return 0;
}

注意:switch-case中必须加break,否则会出现“case穿透”,导致逻辑错误,嵌入式开发中需重点规避。


六、循环语句

1. for循环

for循环实战(模拟数据采集)
#include <stdio.h>

int main(void) {
    // 模拟采集5次温度数据
    int i;
    int temp_array[5]; // 存储采集到的温度数据

    // 循环采集(实战中可替换为传感器读取代码)
    for (i = 0; i < 5; i++) {
        temp_array[i] = 25 + i; // 模拟温度递增
        printf("第%d次采集,温度:%d℃\n", i+1, temp_array[i]);
    }

    return 0;
}

2. while循环

while循环实战(等待硬件就绪)
#include <stdio.h>

int main(void) {
    // 模拟硬件就绪标志:0=未就绪,1=就绪
    char hardware_ready = 0;
    int wait_count = 0; // 等待计数,避免死循环(嵌入式必备)

    // 等待硬件就绪,最多等待10次
    while (hardware_ready == 0 && wait_count < 10) {
        printf("等待硬件就绪... 第%d次\n", wait_count+1);
        wait_count++;
        // 实战中可添加延时函数,模拟等待
    }

    if (hardware_ready == 1) {
        printf("硬件就绪,开始工作\n");
    } else {
        printf("硬件超时未就绪,报错\n"); // 异常处理
    }

    return 0;
}

注意:嵌入式开发中,while循环需避免死循环,需添加计数、超时判断,防止设备卡死。


七、函数基础

1. 函数定义与调用

嵌入式编程需模块化,将硬件操作、数据处理等功能封装为函数,提高可读性和复用性。

函数实战(LED控制函数)
#include <stdio.h>

// 函数定义:控制LED状态(嵌入式函数命名规范)
void led_control(char state) {
    switch (state) {
        case 0:
            printf("LED:熄灭\n");
            break;
        case 1:
            printf("LED:点亮\n");
            break;
        default:
            printf("LED:状态异常\n");
            break;
    }
}

int main(void) {
    // 函数调用:控制LED状态
    led_control(1); // 点亮LED
    led_control(0); // 熄灭LED

    return 0;
}

2. 参数传递

参数传递实战(温度判断函数)
#include <stdio.h>

// 函数:判断温度是否超标,返回1=超标,0=正常
int temp_check(int temp, int threshold) {
    if (temp > threshold) {
        return 1;
    } else {
        return 0;
    }
}

int main(void) {
    int temp = 32;
    int threshold = 30;
    // 调用函数,接收返回值
    int is_over = temp_check(temp, threshold);

    if (is_over == 1) {
        printf("温度超标,触发报警\n");
    } else {
        printf("温度正常\n");
    }

    return 0;
}

八、数组基础

1. 数组定义与初始化

数组实战(存储传感器数据)
#include <stdio.h>

int main(void) {
    // 定义数组:存储8次传感器采集的数据(嵌入式常用)
    int sensor_data[8] = {25, 26, 27, 25, 28, 26, 27, 29};
    int i;

    // 循环遍历数组,打印数据(实战调试常用)
    printf("传感器采集数据:\n");
    for (i = 0; i < 8; i++) {
        printf("第%d次:%d\n", i+1, sensor_data[i]);
    }

    return 0;
}

2. 数组实战注意事项

  • 数组下标从0开始,避免下标越界(嵌入式高频错误,会导致程序崩溃)

  • 嵌入式中数组大小固定,需根据硬件资源合理定义,避免浪费内存

数组下标越界避坑示例
// 错误示例:数组大小为5,下标最大为4,访问下标5会越界
int data[5] = {1,2,3,4,5};
printf("%d", data[5]); // 越界,嵌入式中会导致程序异常

// 正确示例:循环遍历,避免越界
int i;
for (i = 0; i < 5; i++) {
    printf("%d ", data[i]);
}

九、课堂练习

  1. 定义3个变量,分别存储LED状态(char)、温度(short)、计数(unsigned int),并初始化、打印。

  2. 用if-else语句判断温度是否在20~30℃之间,输出“温度正常”或“温度异常”。

  3. 用for循环实现10次数据采集,将数据存入数组,最后打印所有采集到的数据。

  4. 封装一个函数,实现“传入LED状态,输出对应的状态描述”,在主函数中调用3次。

  5. 用while循环模拟“等待硬件就绪”,最多等待8次,超时输出报错信息。


十、课后作业

  1. 写出嵌入式C语言中5种常用数据类型,说明其占用内存、实战用途。

  2. 编写程序,用switch-case语句实现“设备3种工作模式(待机、运行、休眠)”的控制。

  3. 封装一个温度转换函数,将摄氏温度转换为华氏温度(公式:华氏=摄氏×1.8+32),并调用验证。

  4. 定义一个长度为10的数组,存储10次模拟电压数据(0~5V),用循环计算平均值并打印。

  5. 编写程序,结合分支、循环、函数,模拟“LED闪烁3次后熄灭”的逻辑(每次闪烁间隔1秒,用printf模拟)。

  6. 查找并记录3个嵌入式C语言基础编程错误(如未初始化变量、数组越界),说明错误原因及解决方法。


十一、本章总结

本章作为嵌入式C语言进阶的基础模块,聚焦实战适配,巩固了C语言核心基础。重点掌握嵌入式常用数据类型、运算符及表达式,熟练运用分支、循环语句解决硬件状态判断、数据采集等实战场景问题,理解函数模块化编程的思路,掌握数组的基本操作及避坑要点。

嵌入式C语言与通用C语言的核心区别的是“适配硬件、资源优先、注重异常处理”,需牢记变量初始化、避免死循环、数组不越界等实战规范。本章知识是后续指针、结构体、硬件操作等进阶内容的基础,必须熟练掌握,培养严谨的嵌入式编程思维。


十二、核心关键词

嵌入式C语言、数据类型、分支语句、循环语句、函数、数组、实战编程、变量初始化、模块化


第6课 课程回顾总结

本课作为嵌入式C语言进阶的基础入门模块,紧密贴合嵌入式实战场景,系统巩固了C语言核心基础,为后续进阶学习和硬件开发奠定了坚实基础。课程从嵌入式C语言的应用场景出发,重点讲解了适配嵌入式开发的核心知识点,包括常用数据类型的选择与使用,强调了变量初始化的重要性,避免因未初始化导致的硬件操作异常;详细讲解了算术、关系、逻辑运算符的实战应用,结合硬件状态判断场景,帮助掌握表达式优先级的使用技巧。分支语句部分,重点讲解了if-else和switch-case在硬件状态控制中的应用,强调switch-case中break的使用,规避case穿透错误。循环语句部分,结合数据采集、硬件等待等实战场景,讲解了for和while循环的用法,提醒避免死循环,添加超时判断。函数与数组部分,引导建立模块化编程思维,将硬件操作封装为函数,利用数组存储批量传感器数据,同时重点强调数组下标越界的规避方法。通过课堂练习和课后作业,强化了知识点的应用,培养了严谨的嵌入式编程习惯。本课所有内容均围绕嵌入式实战展开,规避通用C语言中的冗余用法,聚焦资源优化和异常处理,为后续指针、结构体及硬件GPIO操作等进阶内容做好了充分准备。


上一节课答案: Linux基础命令与文件系统入门 —— 实战作业代码

一、实战代码

Linux命令实战作业代码(文件操作与权限配置)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    // 1. 模拟创建目录结构(对应课后作业3)
    system("mkdir -p project/src project/doc project/bin");
    printf("目录结构创建完成:project/src、project/doc、project/bin\n");

    // 2. 在src目录下创建main.c并写入代码(对应课后作业4)
    FILE *fp = fopen("project/src/main.c", "w");
    if (fp == NULL) {
        printf("创建main.c失败,请检查权限!\n");
        return -1;
    }
    const char *code = "#include <stdio.h>\nint main(){printf(\"Embedded Linux Test\\n\");return 0;}\n";
    fputs(code, fp);
    fclose(fp);
    printf("main.c创建完成,已写入测试代码\n");

    // 3. 模拟查找main.c文件(对应课后作业5)
    printf("查找main.c文件:\n");
    system("find ./project -name \"main.c\"");

    // 4. 修改main.c权限为rwxr-xr--(对应课后作业6)
    system("chmod 754 project/src/main.c");
    printf("main.c权限修改完成,当前权限:\n");
    system("ls -l project/src/main.c");

    return 0;
}

二、代码功能说明

该代码适配第5课Linux基础命令课后作业,通过C语言调用Linux系统命令,自动完成目录创建、文件编写、查找及权限配置。代码首先创建project/src、project/doc、project/bin三级目录结构;随后在src目录下创建main.c文件并写入简单测试代码;接着调用find命令查找创建的main.c文件;最后将main.c权限修改为rwxr-xr–,完成课后作业核心要求。代码整合了Linux目录、文件、权限相关命令,可直接在Ubuntu中编译运行,直观验证Linux命令的使用效果,同时衔接嵌入式C语言与Linux操作,为后续嵌入式开发环境搭建及文件操作打下基础。

三、注意事项

  1. 编译命令:gcc linux_homework.c -o linux_homework,需在Ubuntu环境中执行。

  2. 运行时需保证当前用户有目录创建、文件写入权限,否则会提示创建失败。

  3. 代码中system函数用于调用Linux命令,执行前需确认命令格式正确(如mkdir -p参数不可省略)。

  4. 权限修改为754,对应rwxr-xr–,需牢记权限数字与符号的对应关系(r=4、w=2、x=1)。

  5. 运行完成后,可通过ls、cd等命令手动验证目录、文件及权限是否符合要求。

  6. 若提示“权限不足”,可在命令前加sudo(如sudo ./linux_homework),谨慎使用sudo避免误操作。

从零到壹嵌入式Linux编程实战教程课:第1课:嵌入式Linux概述

Logo

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

更多推荐