各有关单位: 
中国科学院计算技术研究所是国家专门的计算技术研究机构,同时也是中国信息化建设的重要支撑单位,中科院计算所培训中心是致力于高端IT类人才培养及企业内训的专业培训、咨询机构。中心凭借科学院的强大师资力量,在总结多年大型软件开发和组织经验的基础上,先后为国家培养了数万名计算机专业人员,并先后为数十家大型国内外企业进行过专门的定制培训、咨询服务。 
嵌入式系统在现实生活中随处可见,大到航天、汽车、通讯系统,小到手机、机顶盒等等。嵌入式软件开发作为软件行业的一个分枝,也面临着其它软件领域所面临的各种挑战 — 如何快速上市?如何保证交付软件的最终质量?如何帮助工程师在工作与生活间取得平衡?等等。由于嵌入式软件开发是一个软硬件结合非常紧密的领域,这也使得其面临更大的挑战 — 软件的可开发性问题可能很突出、对开发人员的综合能力要求更高。为了帮助大家获得一些实用的设计原则、最佳实践和一套有效的质量保证方法论,培训中心特举办“高质高效嵌入式软件开发”培训班。具体事宜通知如下: 
一、授课教师 
杨老师:中科院计算所培训中心 高级讲师  
曾在UT斯达康研发中心、摩托罗拉研发中心、诺基亚西门子网络技术有限公司担任软件工程师、项目负责人和软件架构师等职,工作内容内容主要包括:操作系统内核、文件系统和IP协议栈的移植,IDE硬盘、以太网芯片和PCI总线等外设的驱动开发。熟悉x86、PowerPC、XScale处理器,以及TIDSP源码级。熟悉uC/OS、RTEMS和VxWorks实时操作系统的实现,并在这些操作系统和Linux操作系统上有着丰富的软件开发经验。 
二、培训对象 
以C为编程语言的嵌入式和非嵌入式软件开发工程师、项目管理师、架构师等。 
三、课程设计及授课思路 
从事嵌入式软件开发,最困难的莫过于学习操作系统原理和处理器方面的知识。讲解操作系统原理如果以Linux、Windows CE、VxWorks等成熟的操作系统为素材并不好,因为它们太大,很容易让人“只见森林不见树木”,也容易让人望而生畏而失去学习的兴趣和信心。从软件开发的角度来看,操作系统的概念和实现原理一旦掌握,不论基于哪一个操作系统做开发都只是调用不同的函数而已。为了让学员获得最好的学习体验,本课程以讲师自己设计的一个实现简洁、完整的“实时”操作系统 — ClearRTOS为基础,通过渐进式的方式细致讲解操作系统的概念和实现原理。至于处理器方面的知识,本课程没有针对某一具体处理器,而是就编程方面所需的通用知识进行了讲解。对这些通用知识的掌握,将使得处理器对于学员不再那么神秘。 
与非嵌入式软件开发采用集成开发环境不同,嵌入式软件开发大多是基于命令行的。软件开发工程师除了进行编码工作,还得能驾驭自己的编译环境并运用其他的开发工具辅助开发工作。本课程以来自GNU的工具为例帮助学员战胜这一挑战。值得强调的是,其中花了较大的篇幅帮助学员成为Makefile方面的专家。 
要实现高质高效地从事软件开发工作,项目人员还必须理解软件设计的重要性,并借助一定的质量保证方法论来提高工作质量和效率。软件设计和质量保证方法论是业内比较抽象和高级的话题,为此本课程通过带领实践的方式逐步展开讲解,以帮助学员获得一些实用的设计原则、最佳实践和一套有效的质量保证方法论。 
总而言之,本课程从知识、工具、方法和思想这四大方面全面讲解如何专业地从事嵌入式软件开发,致力于帮助学员全面走向高质高效编程。 
四、培训目标 
1、掌握嵌入式软件开发所需的与处理器相关的通用知识。 
2、明白信号完整性对嵌入式软件开发的影响。 
3、掌握嵌入式软件开发所需掌握的GNU工具。包括make、gcc、binutils、ld和gdb。 
4、更加深入地理解C编程语言。 
5、了解引导加载器的大致工作原理和功能。 
6、掌握实时操作系统的设计和实现原理。包括多任务、任务同步通讯、内存管理、设备管理和定时器管理。 
7、理解设计是软件质量之本,并掌握一种有效的模块管理、错误管理和目录结构管理方法。 
8、理解什么是可开发性问题和了解一种解决方法。 
9、理解平台与框架开发是打造高质量软件之路。 
10、理解软件开发的困难和质量保证需要系统性的方法论。 
11、理解软件工程的工作习惯对软件质量的影响,掌握一些终身受用的编程好习惯。 
12、理解单元测试的重要性,并掌握一种简单有效的部署方法。 
13、理解代码覆盖、静态分析和动态分析对构建高质软件的重要性。 
五、培训内容 
| 
 时间  | 
 内容  | 
 大纲  |  
| 
 第1天  | 
 学习导引  | 
 1.   学什么?怎么学? 
2.   工程师技术能力层次模型 
3.   高质高效软件开发团队效能模型  |  
| 
 [硬件篇] 处理器的基本概念  | 
 1.   微处理器与微控制器 
2.   寄存器 
3.   处理器的启动 
4.   输入与输出 
5.   指令与数据 
6.   中断 
7.   字节序 
8.   边界对齐 
9.   断点 
10.内存管理单元 
11.缓存  |  
| 
 [硬件篇] 开发活动中的硬件问题  | 
 1.   两个软件异常案例 
2.   异常的背后 — 信号完整性 
3.   应对信号完整性问题的方法  |  
| 
 [工具篇] make,开发环境全能管家  | 
 1.   从最简单的Makefile中了解规则 
2.   创建基本的编译环境 
3.   提高编程环境的实用性 
4.   打造更专业的编译环境 
5.   理解make的解析行为 
6.   Makefile的调试 
7.   make的常用选项 
8.   活用make  |  
| 
 [工具篇] gcc,C语言编译器  | 
 1.   交叉编译用其环境 
2.   gcc幕后工作原理 
3.   实用的gcc选项  |  
| 
 [工具篇] bintuils工具集,软件开发利器  | 
 1.   addr2line,指令地址翻译器 
2.   ar,静态库生成器 
3.   nm,符号显示器 
4.   objdump,信息查看器 
5.   objcopy,段剪辑器 
6.   size,段大小观察器 
7.   strings,字符串窥视器 
8.   strip,程序文件瘦身器  |  
| 
 [工具篇] ld,链接器  | 
 1.   重定位的概念 
2.   链接脚本  |  
| 
 [编程语言篇] 掌握必要的汇编知识  | 
 1.   AT&T和Intel语法格式 
2.   as的语法 
3.   嵌入汇编的语法  |  
| 
 [编程语言篇] 深入理解程序的结构  | 
 段、栈、堆  | 
    |  
| 
 [编程语言篇] ABI/EABI规范,缔造程序兼容合约  | 
 1.   定义基本数据结构 
2.   规范字节对齐处理 
3.   分配寄存器的功能 
4.   规定栈帧结构  | 
    |  
| 
 第2天  | 
 [编程语言篇] 混淆指针与数组所导致的问题  | 
 1.   问题示例 
2.   问题分析 
3.   问题成因 
4.   预防措施  | 
    |  
| 
 [编程语言篇] volatile,让我保持原样  | 
 1.   从例子理解volatile  | 
    |  
| 
 [设计篇] 设计,软件质量之本  | 
 1.   软件设计是什么 
2.   软件质量的概念 
3.   阻碍改善设计的常见观念 
4.   如何提高设计能力 
5.   设计模式、设计原则和设计思想 
6.   放之四海皆适用的设计原则  | 
    |  
| 
 [设计篇] 模块管理,保障系统有序运行  | 
 1.   模块管理参照系 
2.   设计思路 
3.   程序实现 
4.   模块管理的一些思考  | 
    |  
| 
 [设计篇] 错误管理,不可获缺的用户需求  | 
 1.   现状与出路 
2.   表达错误的通用方法 
3.   优化错误日志  | 
    |  
| 
 [设计篇] 目录结构管理,使项目进展更顺利  | 
 1.   规划目录结构的意义 
2.   出色目录结构的特点 
3.   一个示例  | 
    |  
| 
 [设计篇] 平台与框架开发,高质量软件打造之路  | 
 1.   系统库、平台和框架 
2.   本质和优点 
3.   架构模型 
4.   困境与生命周期理论  | 
    |  
| 
 [设计篇] 可开发性设计,一种高效且经济的开发模式  | 
 1.   可开发性问题一瞥 
2.   可开发性设计的内涵 
3.   设备抽象层 
4.   更复杂的设备抽象层 
5.   图形界面的可开发性设计 
6.   其他可开发性设计  | 
    |  
| 
 [操作系统篇] 引导加载器,系统启航者  | 
 1.   功能 
2.   文件存储布局 
3.   程序加载原理 
4.   优点  | 
    |  
| 
 第2天  | 
 [操作系统篇] 任务,软件基本调度单元  | 
 1.   任务情景 
2.   任务调度 
3.   任务的生命周期 
4.   任务控制 
5.   竞争问题与中断控制 
6.   任务与中断状态 
7.   任务栈溢出检测 
8.   滴答与空闲任务 
9.   多任务环境控制 
10.任务模块管理 
11.task1示例程序 
12.任务钩子函数 
13.任务变量 
14.其它概念与思考  | 
    |  
| 
 [操作系统篇] 任务同步与通信,实现协同工作  | 
 1.   信号量 
2.   互斥锁 
3.   事件 
4.   消息队列 
5.   死锁及预防  | 
    |  
| 
 [操作系统篇] 内存管理,协调动态内存的使用  | 
 1.   堆管理(含内存溢出和泄漏检测) 
2.   内存池管理  | 
    |  
| 
 第3天  | 
 [操作系统篇] 设备管理,方便与外设交互  | 
 1.   字符设备管理 
2.   中断管理 
3.   设备管理的主要程序实现 
4.   设备驱动程序实现 
5.   驱动安装与设备注册  | 
    |  
| 
 [操作系统篇] 定时器,程序闹钟  | 
 1.   软件定时器分类 
2.   设计思路 
3.   中断回调定时器 
4.   定时误差 
5.   提高遍历效率 
6.   改善实时性 
7.   任务回调定时器  | 
    |  
| 
 [质量保证篇] 质量保证导言  | 
 1.   软件开发的特点 
2.   保证质量的关键要素 
3.   质量保证需要系统性的方法论 
4.   走出质量困境的指导性思想  | 
    |  
| 
 [质量保证篇] 编程好习惯,质量保证的基本条件  | 
 1.   一些终生受用的编程好习惯  | 
    |  
| 
 [质量保证篇] 单元测试,被忽视的质量保证方法  | 
 1.   警惕单元测试无用论 
2.   一个简单但不完善的单元测试例子 
3.   构建单元测试框架 
4.   无缝整合单元测试 
5.   几个实施问题 
6.   桩函数和打桩 
7.   错误注入,一种可测试性设计 
8.   平台开发与单元测试 
9.   被测行为的确定性 
10.被测用例的有效性  | 
    |  
| 
 [质量保证篇] 代码覆盖,单元测试效果的衡量指标  | 
 1.   了解代码覆盖工具 
2.   无缝整合代码覆盖 
3.   三个代码覆盖度量指标  | 
    |  
| 
 [质量保证篇] 静态分析,防止将失误带给用户  | 
 1.   认识静态分析工具 
2.   无缝整合静态分析工具  | 
    |  
| 
 [质量保证篇] 动态分析,使程序更健壮  | 
 1.   结识动态分析工具 
2.   无缝整合动态分析工具  | 
    |  
| 
 [质量保证篇] 性能分析,让优化程序有的放矢  | 
 1. 初探性能分析工具 
2. 无缝整合性能分析工具  | 
    |  
| 
 [质量保证篇] qBench,一个开发高质软件的工作台  | 
    | 
    |  
 | 
 | 
 | 
 | 
 | 
 |    
六、费用 
培训费:5000元/人(含教材、证书、午餐等),住宿统一安排,费用自理。 
七、培训时间、地点: 
时间:2013年3月29日--3月31日 地点:北京 
八、证 书 
中科院计算所职业培训中心“高质高效嵌入式软件开发”结业证书。  |