嵌入式软件工作中的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 ,如需转载请自行联系原作者
相关文章
|
7月前
|
图形学
每天分享5款软件,让大家工作学习更顺心
快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具,让大家工作办公更顺心就是我最大的快乐。
66 0
【负责指导、培训普通开发工程师工作经验之谈】
【负责指导、培训普通开发工程师工作经验之谈】
|
2月前
|
敏捷开发 安全 测试技术
软件开发的要点有哪些?
软件开发过程包括需求分析、设计、编码、测试、上线与维护五大阶段。每个阶段需注重团队合作、文档编写、安全性和性能优化。建议采用敏捷开发、CI/CD、建立用户反馈机制及持续培训,以确保开发高效、产品质量高且能快速响应市场变化。
|
3月前
|
存储 安全 数据可视化
日常工作必备的5款实用软件推荐
本文推荐了几款实用软件,旨在提升日常工作生活的效率与安全性。包括数据可视化工具Keyviz、提升办公效率的Office Tab Enterprise、微信空号检测工具燃精灵、专注工作的时间管理软件Cold Turkey,以及密码管理工具KeeWeb。通过这些工具,可更好地管理工作、提升生产力并保障数字安全。
65 3
|
项目管理
【项目开发计划制定工作经验之谈】
【项目开发计划制定工作经验之谈】
121 1
分享5款工作和学习中,经常用到的软件
如今,工作和学习都离不开电脑,所以电脑里的软件自然也是必不可少的,但是电脑软件那么多,不可能每个都装上吧,所以我们要装好用的、实用的,下面给大家分享5款好用到爆的软件,很多懂电脑的人都在用。
78 0
|
存储 数据可视化 安全
分享5款让你工作事半功倍的软件
无论你是一位职业人士、学生还是创业者,以下这些工具都可能对你的工作和生活有所帮助。下面推荐五款实用的软件工具,它们不仅功能强大,而且易于使用。
168 1
分享5款让你工作事半功倍的软件
|
自然语言处理 测试技术
嵌入式软件测试笔记11 | 测试设计技术简单说明
嵌入式软件测试笔记11 | 测试设计技术简单说明
149 0
|
测试技术
嵌入式软件测试笔记9 | 嵌入式软件测试中如何做好评审工作?
嵌入式软件测试笔记9 | 嵌入式软件测试中如何做好评审工作?
143 0
|
存储 安全 搜索推荐
详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼
详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼