开发者社区> 技术小美> 正文

嵌入式软件工作中的C知识要点

简介:
+关注继续查看
陈国栋 (sinojelly@163.com)
2008/08/08 初稿
2009/10/6 内容整理,重新排版
   很多朋友可能在学习C,但是没有实际参与过嵌入式软件项目,对工业上实际应用的C相关知识并不了解。这篇文章本来是用来指导新员工的,现在分享出来,希望能对准备进入嵌入式软件领域的学习者有所帮助。这主要是一篇学习提纲,只是对部分重要知识点进行了讲解,还有很多章节并没有具体内容,需要读者去查阅资料/搜索了解,如果有兴趣完善它的可以联系我,把您觉得要补充的内容发给我。阅读过程中有任何感想/疑问也欢迎与我交流,谢谢!
1. 基础篇 
1.1. 数据类型、运算符与表达式
推荐:C语言算法优先级口诀
重点:运算中的类型隐式转换。
1.2. C语言程序结构(顺序、分支、循环) 
1.3. 数组、函数的使用 
1.4. 指针的使用 
1.5. 预处理命令 
1.6. 位运算 
1.7. 文件操作 
2. 提高篇 
2.1. vxWorks基础知识
任务互斥与同步
任务死锁的产生原因与解决办法
优先级翻转问题
二进制信号量与互斥信号量
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语言程序设计》 谭浩强
《数据结构》
3.2. 进阶
《C和指针》
《C陷阱与缺陷》
《C专家编程》
《Head.First设计模式》
















本文转sinojelly51CTO博客,原文链接:http://blog.51cto.com/sinojelly/209752,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
软件工程个人作业02
题目:可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:   可以控制下列参数:   是否有乘除法;  是否有括号(最多可以支持十个数参与计算);  数值范围;  加减有无负数;  除法有无余数! 思路和关键步骤:   1.是否有乘除法;加减有无负数;除法有无余数!,依据输入的不同年级判断是否需要,例如一年级没有乘除法,只有六年级有负数,除法在三年级开始有余数。
699 0
软件工程个人作业03
一、题目:四则运算3 老师提出了新的要求:数据定义:  自然数:0, 1, 2, …。  真分数:1/2, 1/3, 2/3, 1/4, 1’1/2, …。  运算符:+, −, ×, ÷。  括号:(, )。
753 0
设计一条简单的等待工作队列之软件模型设计与实现(二)
上节实现了一条最简单的线程等待工作队列。 http://blog.csdn.net/morixinguan/article/details/77758206 但设计还有诸多因素需要考虑和改进,例如以下: void print(queue_list *header) { int count =...
863 0
设计一条简单的等待工作队列之软件模型设计与实现(三)
http://blog.csdn.net/morixinguan/article/details/77758206 http://blog.csdn.net/morixinguan/article/details/77783311 在前面两篇文章中,可能考虑到后面需要设计复杂的工作队列,所以加入了线程机制。
1010 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27723 0
+关注
6819
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载