陈国栋 (sinojelly@163.com)
2008/08/08 初稿
2009/10/6 内容整理,重新排版
很多朋友可能在学习C,但是没有实际参与过嵌入式软件项目,对工业上实际应用的C相关知识并不了解。这篇文章本来是用来指导新员工的,现在分享出来,希望能对准备进入嵌入式软件领域的学习者有所帮助。这主要是一篇学习提纲,只是对部分重要知识点进行了讲解,还有很多章节并没有具体内容,需要读者去查阅资料/搜索了解,如果有兴趣完善它的可以联系我,把您觉得要补充的内容发给我。阅读过程中有任何感想/疑问也欢迎与我交流,谢谢!
1. 基础篇
1.1. 数据类型、运算符与表达式
1.2. C语言程序结构(顺序、分支、循环)
推荐:C语言算法优先级口诀
重点:运算中的类型隐式转换。
1.3. 数组、函数的使用
1.4. 指针的使用
1.5. 预处理命令
1.6. 位运算
1.7. 文件操作
2. 提高篇
2.1. vxWorks基础知识
2.3. VC的使用与调试技巧
2.4. Makefile基础知识
任务互斥与同步
任务死锁的产生原因与解决办法
优先级翻转问题
二进制信号量与互斥信号量
2.2. Tornado的使用与调试技巧 2.3. VC的使用与调试技巧
2.4. Makefile基础知识
2.5. PC-lint基础知识
推荐:SmartLint帮助文件中的文章《PC-lint入门与提高》,该文章由0基础开始对PC-lint相关知识做了较全面的介绍。
2.6. 基本算法及实现
排序算法的实现与复杂度分析(快速排序、冒泡排序)
qsort函数的使用
2.7. 了解TCP/IP基本原理
2.8. 程序结构设计原则
避免重复
了解封装的好处
了解面向对象设计的基本思想及其在C语言中的应用
面向对象的基本特征:封装、继承、多态
面向对象与面向过程的区别:面向过程的设计中关注的是算法,面向对象的设计中关注的是对象及对象之间的关系。
面向对象的设计原则:封装变化。对修改关闭,对扩展开放。依赖倒置。依赖抽象,而不是依赖具体。
C语言中使用面向对象的方法:
1、借鉴面向对象的思想设计更好的程序结构,比如封装变化就很有用。
2、简单的说,类就是把成员变量和成员方法封装到了一起,所以也可以利用结构体封装成员变量和函数指针的方法来模拟类的行为。(国内一个模拟嵌入式系统运行的软件skyeye便是这样开发的。)
2.9. 编译、运行环境相关的知识
程序编译、链接的基本原理
PPC/ARM的寄存器使用、栈结构
2.10.指针概念的深入理解
2.11.结构体内存布局的理解
2.12.大端、小端CPU
2.13.字节对齐
2.14.宏定义的使用技巧
2.14.1. 常用宏定义
__FILE__ 表示文件路径
__LINE__ 表示行号
2.14.2. 宏定义使用禁忌
宏定义的参数不能是自加、自减表达式。
2.14.3. 宏定义中“#”的用法
1、'#'是`stringize'的意思。
其后的变量将被用双引号包括的字符串替代。例:
#define display(x) show((long)(x), #x)
则display(abs(-5)); 将被替换为:show((long)(abs(-5)), "abs(-5)"); 注意有引号。
2、'##'是'token-paste'操作符。
其后的变量将被与之前的字符串合并在一起形成一个新的token.例:
#define printvar(x) printf("%d\n", variable##x)
则printvar(3);将被替换为printf("%d\n", variable3);
##仅仅合并字符串,而形成一个token,没有引号.
问题:
定义一个宏UNREF,使得UNREF(Var)展开后是(void)Var。
2.14.4. Makefile中的宏定义
2.14.5. PC-lint选项中的宏定义
2.14.6. 宏展开规则
问题:
可以把软件版本定义为Makefile中的宏定义,然后在代码中使用该版本号。代码中需要一个字符串类型的版本号,如何实现?
2.15.参数个数可变的函数
2.16.局部变量不能取地址
被编译器优化后,局部变量很可能存放在寄存器,而不是内存,寄存器是不能取地址的。
2.17.sprintf/strcpy函数的缺陷及解决办法
2.18.位域的使用方法
2.19.防止头文件重复包含的方法
2.20.C语言的局限与软件业界的发展
C语言操作灵活,但是C语言构建的程序内存泄露、指针非法访问、栈越界等问题层出不穷,而且C语言不支持面向对象,面向过程方式构建的系统普遍存在的问题“复杂”、“脆弱”、“模块间强耦合”、“修改困难,牵一发而动全身”用C语言构建的系统一般都有,软件最根本的规律便是不断变化,这样的软件系统便在变化中不断修改,不断变得更加脆弱,直到最后无法再维护。
微软推出的C#是在C++基础上吸收了其它语言的精华创造出来的一种新的语言,在很多方面,它改进了C语言的缺陷和不足,把很多问题的发现都提前到编译阶段,比如C语言中if后面的表达式可以是赋值,这往往在编译的时候不能发现,运行的时候却是致命错误,C#语言本身的设计避免了这样的问题,它规定if后面只能是bool表达式。
当然,目前嵌入式开发用得最多的还是C/C++,但我们可以多了解业界的新技术,拓宽视野、提高软件水平、避免C语言陷阱开发出更优质的软件。
3. 书籍推荐
3.1. 入门
《C经典教程.chm》 语音电子书
《C经典教程.chm》 语音电子书
《C语言程序设计》 谭浩强
《数据结构》
3.2. 进阶
《C和指针》
《C陷阱与缺陷》
《C专家编程》
《Head.First设计模式》
本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/sinojelly/209752
,如需转载请自行联系原作者