工程师
互联网
软件架构
软件设计
工程师
工具链
推荐课程
average > 0 ? $model->average . '分' : '10.0分' ?>

嵌入式C高质量编程最佳实践

课程费用

5800.00 /人

课程时长

2

成为教练

课程简介

嵌入式系统在现实生活中随处可见,大到航天、汽车、通讯系统,小到手机、机顶盒等。嵌入式软件开发作为软件行业的一个分枝,也面临着其它软件领域所面临的各种挑战 —— 如何快速上市?如何保证交付软件的最终质量?如何帮助工程师在工作与生活间取得平衡?等等。由于嵌入式软件开发是一个软硬件结合非常紧密的领域,这也使得其面临更大的挑战 —— 软件的可开发性问题可能很突出、对开发人员的综合能力要求更高。
对于嵌入式软件开发工程师来说,需要对C语言的掌握更加透彻,才能最大程度地发挥编程语言的特性写出性能更好、内存更省的软件,背后是因为嵌入式系统的计算资源更为有限所致。然而,光这样还不够,还需对开发工具链(tool chain)、软件设计、软件架构、质量保证方法论和编程习惯等内容有很好的掌握和运用,才能成为一名工作效率和产出质量双高的人。总之,需要嵌入式软件开发工程师全方位地提升自己的专业技能,才能很好地应对日常工作所面临的各种挑战。本课程的特色之一是致力于全面提升嵌入式软件开发工程师的专业技能。

目标收益

 让学员对于职业发展和行业现状有更好的认识。
 掌握嵌入式软件开发所需的与处理器相关的通用知识。
 学会运用gcc、binutils和ld等开发工具去提升个体学习、解决和探究问题的效率。
 深入讲解ABI/EABI、栈、堆管理、二进制程序的结构等内容,让学员对C编程语言的理解实现质的飞跃。
 通过一些终身受用的编程好习惯,让学员理解工作习惯对软件质量的影响。
 理解软件质量保证需要系统性的方法论,需要重视并实践以单元测试为中心。对如何实施单元测试和度量实施效果有感性认识。
 使学员对软件架构的内涵有很好的掌握,了架常用的几个架构模式。
 对软件设计这一抽象的高级话题建立起思维框架,以具体实例帮助学员掌握放之四海皆适用的软件设计原则。通过介绍模块管理、错误管理和目录结构管理等内容,让学员对软件设计的“形”有更为清晰的认识。
 掌握如何实施嵌入式C面向对象编程。

培训对象

以C为编程语言的嵌入式和非嵌入式软件开发工程师。

课程大纲

对行业和职业发展的思考 1. 工程师要掌握的终极技术是什么
2. 我处于什么层次,又应向哪发展
3. 我应走技术线,还是技术管理线
4. 技术团队效能动力模型
处理器的基本概念 1. 如何区分微处理器与微控制器
2. 寄存器的分类和常用寄存器
3. 处理器是如何启动的
4. 什么是外设的输入与输出
5. 指令与数据分别是什么
6. 为什么要有中断
7. 字节序的原理
8. 数据边界对齐为何能提高程序的性能
9. 断点的实现原理和作用是什么
10. 内存管理单元有什么用处
11. 为什么要有缓存
通过更好了解 gcc 编译器
提高工作效率
1. 什么是交叉编译和交叉编译环境
2. Gcc 在幕后是如何工作的
3. 一些改善工作效率的 gcc 选项
掌握通过 bintuils 工具集
探究 C 语言背后的实现细节
1. addr2line,指令地址翻译器
2. ar,静态库生成器
3. nm,符号显示器
4. objdump,信息查看器
5. objcopy,段剪辑器
6. size,段大小观察器
7. strings,字符串窥视器
8. strip,程序文件瘦身器
链接器的关键概念 1. 什么是重定位
2. 从例子了解重定位
3. 通过一个工程实例加深理解
4. 符号决议
程序的结构 1. 什么是段
2. 栈的概念和用处是什么
3. 堆的作用
深入理解 C 语言 1. 变量的内存分配机制
2. 指针和函数指针
2. 关键字const
3. 关键字static
4. 关键字extern
5. 关键字restrict
6. 关键字volatile
7. 无符号类型转换
8. main()是如何被调用的
9. 数组局部变量的初始化
掌握必要的汇编知识 1. AT&T 和 Intel 汇编语法的区别
2. 如何在 C 程序中嵌入汇编
对 C 语言的理解
实现质的飞跃
1. 数据类型与 CPU 是如何映射的
2. 字节对齐的规范从哪来
3. 寄存器的功能如何定义
4. 栈帧的作用和生命周期是什么
5. 理解栈溢出攻击
6. 如何检测栈溢出
内存管理 1. 堆管理的原理与实现
2. 数据完整性保护
3. 内存泄漏及检测原理
4. 内存溢出检测与内存碎片
5. 内存池原理与实现
编码风格与编程好习惯 1. 以工具化实现风格统一
2. 使用空格增加可读性
2. 判断失败而非成功控制圈复杂度
3. 采用 sizeof 减少内存操作失误
4. 屏蔽编程语言特性
5. 合理运用数组
6. 利用编程语言特性提高效率
7. 借助隐式初始化简化程序逻辑
8. 精确包含头文件
9. 恰当使用 goto 语句
10. 引入中间变量
11. 青睐小粒度锁
12. 以逆序方式释放分配获得的资源
13. 永远将头文件作为桥梁
14. 使用 assert
通过单元测试保证代码质量 1. 警惕单元测试无用论
2. 一个简单但不完善的单元测试例子
3. 构建单元测试框架
4. 无缝整合单元测试提升工程效率
5. 几个实施问题
6. 桩函数和打桩
7. 通过错误注入提升软件的可测试性
8. 平台开发与单元测试如何结合
9. 什么是被测行为的确定性
10. 被测用例的有效性
11. 无缝整合代码覆盖提升工程效率
12. 代码覆盖有哪些度量指标
软件架构的内涵 1. 什么是软件架构
2. 软件架构的作用及涉众
3. 设备调试系统案例
3. 几个常用的软件架构
软件设计的内涵与设计原则 1. 软件设计是什么
2. 软件质量的概念
3. 阻碍改善软件设计的常见观念
4. 如何提高软件设计能力
5. 设计模式、设计原则和设计思想
6. 放之四海皆适用的设计原则
7. 对软件技术发展驱动力的思考
项目目录管理 1. 规划代码目录结构的意义
2. 出色代码目录结构的特点
3. 一个示例
模块管理 1. 为什么要模块管理参照系
2. 模块管理设计的一种思路
3. 一些思考
错误管理 1. 错误管理的现状与出路
2. 表达错误的一种通用方法
3. 优化错误日志提高查错效率
嵌入式C面向对象编程 1. 为什么要OOP
2. 封装
3. 继承
4. 多态
对行业和职业发展的思考
1. 工程师要掌握的终极技术是什么
2. 我处于什么层次,又应向哪发展
3. 我应走技术线,还是技术管理线
4. 技术团队效能动力模型
处理器的基本概念
1. 如何区分微处理器与微控制器
2. 寄存器的分类和常用寄存器
3. 处理器是如何启动的
4. 什么是外设的输入与输出
5. 指令与数据分别是什么
6. 为什么要有中断
7. 字节序的原理
8. 数据边界对齐为何能提高程序的性能
9. 断点的实现原理和作用是什么
10. 内存管理单元有什么用处
11. 为什么要有缓存
通过更好了解 gcc 编译器
提高工作效率

1. 什么是交叉编译和交叉编译环境
2. Gcc 在幕后是如何工作的
3. 一些改善工作效率的 gcc 选项
掌握通过 bintuils 工具集
探究 C 语言背后的实现细节

1. addr2line,指令地址翻译器
2. ar,静态库生成器
3. nm,符号显示器
4. objdump,信息查看器
5. objcopy,段剪辑器
6. size,段大小观察器
7. strings,字符串窥视器
8. strip,程序文件瘦身器
链接器的关键概念
1. 什么是重定位
2. 从例子了解重定位
3. 通过一个工程实例加深理解
4. 符号决议
程序的结构
1. 什么是段
2. 栈的概念和用处是什么
3. 堆的作用
深入理解 C 语言
1. 变量的内存分配机制
2. 指针和函数指针
2. 关键字const
3. 关键字static
4. 关键字extern
5. 关键字restrict
6. 关键字volatile
7. 无符号类型转换
8. main()是如何被调用的
9. 数组局部变量的初始化
掌握必要的汇编知识
1. AT&T 和 Intel 汇编语法的区别
2. 如何在 C 程序中嵌入汇编
对 C 语言的理解
实现质的飞跃

1. 数据类型与 CPU 是如何映射的
2. 字节对齐的规范从哪来
3. 寄存器的功能如何定义
4. 栈帧的作用和生命周期是什么
5. 理解栈溢出攻击
6. 如何检测栈溢出
内存管理
1. 堆管理的原理与实现
2. 数据完整性保护
3. 内存泄漏及检测原理
4. 内存溢出检测与内存碎片
5. 内存池原理与实现
编码风格与编程好习惯
1. 以工具化实现风格统一
2. 使用空格增加可读性
2. 判断失败而非成功控制圈复杂度
3. 采用 sizeof 减少内存操作失误
4. 屏蔽编程语言特性
5. 合理运用数组
6. 利用编程语言特性提高效率
7. 借助隐式初始化简化程序逻辑
8. 精确包含头文件
9. 恰当使用 goto 语句
10. 引入中间变量
11. 青睐小粒度锁
12. 以逆序方式释放分配获得的资源
13. 永远将头文件作为桥梁
14. 使用 assert
通过单元测试保证代码质量
1. 警惕单元测试无用论
2. 一个简单但不完善的单元测试例子
3. 构建单元测试框架
4. 无缝整合单元测试提升工程效率
5. 几个实施问题
6. 桩函数和打桩
7. 通过错误注入提升软件的可测试性
8. 平台开发与单元测试如何结合
9. 什么是被测行为的确定性
10. 被测用例的有效性
11. 无缝整合代码覆盖提升工程效率
12. 代码覆盖有哪些度量指标
软件架构的内涵
1. 什么是软件架构
2. 软件架构的作用及涉众
3. 设备调试系统案例
3. 几个常用的软件架构
软件设计的内涵与设计原则
1. 软件设计是什么
2. 软件质量的概念
3. 阻碍改善软件设计的常见观念
4. 如何提高软件设计能力
5. 设计模式、设计原则和设计思想
6. 放之四海皆适用的设计原则
7. 对软件技术发展驱动力的思考
项目目录管理
1. 规划代码目录结构的意义
2. 出色代码目录结构的特点
3. 一个示例
模块管理
1. 为什么要模块管理参照系
2. 模块管理设计的一种思路
3. 一些思考
错误管理
1. 错误管理的现状与出路
2. 表达错误的一种通用方法
3. 优化错误日志提高查错效率
嵌入式C面向对象编程
1. 为什么要OOP
2. 封装
3. 继承
4. 多态
提交需求