文章目录
- 一、课程目标
- 二、嵌入式C语言基础回顾与实战适配
- 1. C语言与嵌入式开发的关联
- 2. 基本程序结构
- 三、核心基础:数据类型与变量
- 1. 嵌入式常用数据类型
- 2. 变量定义与初始化
- 四、运算符与表达式
- 1. 常用运算符(实战高频)
- 2. 表达式优先级
- 五、分支语句-嵌入式逻辑控制核心
- 1. if-else语句
- 2. switch-case语句
- 六、循环语句
- 1. for循环
- 2. while循环
- 七、函数基础
- 1. 函数定义与调用
- 2. 参数传递
- 八、数组基础
- 1. 数组定义与初始化
- 2. 数组实战注意事项
- 九、课堂练习
- 十、课后作业
- 十一、本章总结
- 十二、核心关键词
- 第6课 课程回顾总结
- 上一节课答案: Linux基础命令与文件系统入门 —— 实战作业代码
- 一、实战代码
- 二、代码功能说明
- 三、注意事项
一、课程目标
巩固嵌入式C语言基础语法,适配嵌入式开发实战场景
掌握C语言核心数据类型、运算符及表达式的实战用法
熟练运用分支、循环语句,解决嵌入式简单逻辑问题
理解函数的定义、调用及参数传递,适配嵌入式函数编程规范
掌握数组的基本操作,为后续嵌入式数据处理打下基础
培养嵌入式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]); }九、课堂练习
定义3个变量,分别存储LED状态(char)、温度(short)、计数(unsigned int),并初始化、打印。
用if-else语句判断温度是否在20~30℃之间,输出“温度正常”或“温度异常”。
用for循环实现10次数据采集,将数据存入数组,最后打印所有采集到的数据。
封装一个函数,实现“传入LED状态,输出对应的状态描述”,在主函数中调用3次。
用while循环模拟“等待硬件就绪”,最多等待8次,超时输出报错信息。
十、课后作业
写出嵌入式C语言中5种常用数据类型,说明其占用内存、实战用途。
编写程序,用switch-case语句实现“设备3种工作模式(待机、运行、休眠)”的控制。
封装一个温度转换函数,将摄氏温度转换为华氏温度(公式:华氏=摄氏×1.8+32),并调用验证。
定义一个长度为10的数组,存储10次模拟电压数据(0~5V),用循环计算平均值并打印。
编写程序,结合分支、循环、函数,模拟“LED闪烁3次后熄灭”的逻辑(每次闪烁间隔1秒,用printf模拟)。
查找并记录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操作,为后续嵌入式开发环境搭建及文件操作打下基础。
三、注意事项
编译命令:
gcc linux_homework.c -o linux_homework,需在Ubuntu环境中执行。运行时需保证当前用户有目录创建、文件写入权限,否则会提示创建失败。
代码中system函数用于调用Linux命令,执行前需确认命令格式正确(如mkdir -p参数不可省略)。
权限修改为754,对应rwxr-xr–,需牢记权限数字与符号的对应关系(r=4、w=2、x=1)。
运行完成后,可通过ls、cd等命令手动验证目录、文件及权限是否符合要求。
若提示“权限不足”,可在命令前加sudo(如sudo ./linux_homework),谨慎使用sudo避免误操作。