• 干货|如何编写优质的嵌入式C程序

    ▼点击下方名片,关注公众号▼摘要:本文旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序。首先分析了C语言的陷阱和缺陷,对容易犯错的地方进行归纳整理;分析了编译器语义检查的不足之处并给出防范措施,以Keil MDK编译器为例,介绍了该编译器的特性、对未定义行为的处理以及一些高级应用。本文思维导图(已上传至gitee)1. 简介市面上介绍C语言以及编程方法的书数目繁多,但对如何编写优质嵌入式C程序却鲜有介绍,特别是对应用于单片机、ARM7、Cortex-M3这类微控制器上的优质C程序编写方法几乎是个空白。本文面向的,正是使用单片机、ARM7、Cortex-M3这类微控制器的底层编程人员。编写优质嵌入式C程序绝非易事,它跟设计者的思维和经验积累关系密切。嵌入式C程序员不仅需要熟知硬件的特性、硬件的缺陷等,更要深入一门语言编程,不浮于表面。为了更方便的操作硬件,还需要对编译器进行深入的了解。2. C语言特性语言是编程的基石,C语言诡异且有种种陷阱和缺陷,需要程序员多年历练才能达到较为完善的地步。虽然有众多书籍、杂志、专题讨论过C语言的陷阱和缺陷,但这并不影响本节再次讨论它。总是有大批的初学者,前仆后继的倒在这些陷阱和缺陷上,民用设备、工业设备甚至是航天设备都不例外。本节将结合具体例子再次审视它们,希望引起足够重视。深入理解C语言特性,是编写优质嵌入式C程序的基础。2.1处处都是陷阱2.1.1 无心之过1、 =和==将比较运算符”==”误写成赋值运算符”=”,可能是绝大多数人都遇到过的,比如下面代码:if(x=5)   {       //其它代码   }代码的本意是比较变量x是否等于常量5,但是误将==写成了=,if语句恒为真。如果在逻辑判断表达式中出现赋值运算符,现在的大多数编译器会给出警告信息。比如keil MDK会给出警告提示:warning: #187-D: use of "=" where"==" may have been intended,但并非所有程序员都会注意到这类警告,因此有经验的程序员使用下面的代码来避免此类错误:if(5=x)   {       //其它代码   }将常量放在变量x的左边,即使程序员误将==写成了=,编译器会产生一个任谁也不能无视的语法错误信息:不可给常量赋值!2、复合赋值运算符复合赋值运算符( =、*=等等)虽然可以使表达式更加简洁并有可能产生更高效的机器代码,但某些复合赋值运算符也会给程序带来隐含Bug,比如 =容易误写成= ,代码如下:tmp= 1;代码本意是想表达tmp=tmp 1,但是将复合赋值运算符 =误写成= :将正整数常量1赋值给变量tmp。编译器会欣然接受这类代码,连警告都不会产生。如果你能在调试阶段就发现这个Bug,真应该庆祝一下,否则这很可能会成为一个重大隐含Bug,且不易被察觉。复合赋值运算符-=也有类似问题存在。3、  其它容易误写使用了中文标点头文件声明语句最后忘记结束分号逻辑与

    8号线攻城狮 编写 嵌入式C

  • 电子工程师常用电路符号整理大全

    ▼点击下方名片,关注公众号▼电路符号整理(很全)end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮 电路符号

  • 从0到1,带你写个操作系统!

    很多公众号的读者看到操作系统之类的课程会问:王工,我们做硬件设计的,为什么还要学习操作系统相关的知识呢?学它肯定有它的道理,我自己的理解是为了做大型复杂项目时和项目成员之间更有效的沟通。这里跟大家分享一下做项目常常会遇到的尴尬问题,正常情况下项目都需要硬件、驱动、应用软件这几类人员之间进行交流沟通,如果搞硬件的对系统一无所知,搞应用的对硬件一知半解,有些逻辑业务需要应用去开启相关的IO,让搞应用的对着原理图打开一个GPIO都搞不定,那这样项目如何高效进行?因此,我们有必要去加强自身专业技能,并学习其他一些附加技能。“操作系统”作为所有软件的基础,是计算机王国的掌舵者。我们常用“灵魂、大脑、内核、基石”等词来形容它,足以见得它对计算机而言有多么重要。 事实也确实如此,作为每个程序员必须好好修炼的“基本功”,它能直接解决我们在工作中的很多疑难杂症,比如做高性能服务端编程时,经常会用到内存、进程、线程、IO 等相关知识。 而且,我一直认为,花大量时间研究 OS 这些底层知识,是很有必要的,虽然短期看不到效果,但却是从 0 到 1 必然的过程。 学懂了这些基本功,再去琢磨那些被“追捧”的流行技术啊、demo 啊,都能轻松地理解背后高级的设计,理解系统中的性能瓶颈。 我也很喜欢研究操作系统,作为程序员的三大浪漫之一,它虽然枯燥无聊,却又存在无限可能。对技术人来说,即便为此消耗了大把时光,费尽心力,也是值得。 正如我的偶像“计算机鬼才”彭东所说:"生活可以一地鸡毛,但操作系统却是心中的光"。 彭东在操作系统上的成就,让我颇为佩服,他被称为“计算机鬼才”,是有原因的。非科班出身,却凭借惊人的意志与热爱,自学微机原理,编程语言,数据结构与算法,翻遍了操作系统和硬件书籍,独立开发了 x86 平台下的 LMOS 和 arm 平台下的 LMOSEM 两个操作系统。 LMOS 现在已经发布 8 个测试版本,是多进程、多线程、多 CPU、支持虚拟内存的全 64 位操作系统内核,代码量足足有 10 万多行。如此浩大的项目,没点“程序员的浪漫”精神,想必很难坚持下来。 他的书《深度探索嵌入式操作系统:从零开始设计、架构和开发》也曾给了我很多启发。  数十年深入研究操作系统,他对 Linux、BSD、SunOS 等开源操作系统,以及 Windows 的 NT 内核都非常熟悉,在编译器,数据库等基础架构方面也颇有研究。 可以说,在操作系统领域,他是当之无愧的 KOL,非常有发言权。这条路上,会有哪些难点和阻碍,会踩哪些坑,他都了如指掌。 所以,当我听说彭东在极客时间写了一个《操作系统实战45讲》专栏,非常意外,第一时间就订阅了。让我很惊喜的是,彭东把“学操作系统不要死看书”的主张贯穿到专栏里,通过配套实验带你完成一个 OS,当你真的动手写了一个 OS 的时候,对操作系统的理解会是质的飞跃。 下图是彭东梳理的「简化版操作系统知识体系」,图中的每一小块,都会随着课程的进行,逐一展开,建议先马后看。 操作系统简化知识体系图 他会带你从 0 到 1,一步步实现一个基于 x86 平台的 64 位多进程的操作系统—— Cosmos,你将拥有一个属于自己的操作系统内核,对 Linux 内核的理解也会更加透彻。 跟着学下来,操作系统架构设计能力会大幅提升,还可以学到系统级别的软件编程技巧,这对我们拓展技术深度和广度是大有裨益的。 最重要的是,求职面试也会成为加分项,自己动手写过操作系统,真有“飘”的资本,简历自然脱颖而出。 这个结果其实并不意外,毕竟,业界大牛手把手带着写 OS 的机会实在太难得。 我在追更的同时,也不禁佩服,彭东海量的知识储备和极佳的表达能力。要知道,越是底层的知识越不好讲透:要用通俗易懂的语言,把复杂的操作系统“讲”出来;要注意细节与重点的把握和梳理;要把复杂的内容,交付给各个不同思想层次,不同思维方式的人。 随便截了几个评价,供参考:  不得不说,彭东太会讲了,不仅把枯燥的原理讲得明明白白,讲述中还充满魔力,吸引我深挖下去,这门课还有几个不得不提的特色。 1.“保姆级”图示 代码解析,小白也适用 为了方便“计算机小白”理解,快速上手实操,课程中加入了大量的图示和详细的代码注释,足以看出彭东的用心,也能感受到他的“内功深厚”。 比如下面的虚拟内存数据结构设计图,计算机结构示意图,文件系统框架图和进程状态切换流程图等,篇幅限制,这里仅是冰山一角,专栏中还有大量图示和知识导图。  再比如,课程中的代码示例,这个详细程度的代码注释,是比较少见的。 摘自《操作系统实战 45讲》第9讲瞧一瞧-Linux的自旋锁和信号量如何实现? 2. 边学边练,对比分析,强化理解 Linux  在介绍每个内核组件实现时,都会先讲清原理,再带你基于设计理解去动手实现;然后与 Linux内核的实现做前后对比。既能边学边练,又能帮你从“上帝视角”审视 Linux 内核。   3. 配套源码,真正动手“run”起来 专栏中的每一讲,都会匹配可以工作的代码,传在 gitee 上;可以跟着课程一步步实现,也可以直接使用每节课提供的代码进行调试,直到最终实现一个操作系统。 实际上,动手“run”起来,哪怕只是读和 clone 老师的代码,也会对操作系统有更深一层的理解。 Cosmos系统运行演示 4. 开源计划,新的挑战 为了把课程内容实践得更好,最近彭东还整了个“大计划” —— 筹备建立一个开源社区,把 Cosmos 运作成一个开源项目,专栏的读者都有望优先成为第一批 contributer。 为抛弃历史包袱,未来完整的 Cosmos 会同时开源系统和 CPU 源码,还会考虑根据需求定制芯片。据彭东透露,他邀请到了非常优秀的芯片架构师,来根据操作系统架构特点设计 CPU,想想就很“浪漫”了! 此外,专栏读者都可以免费加入彭东的「操作系统交流群」,他经常在群里答疑解惑,这里还有很多技术内功深厚的大佬,相互交流探讨,光看聊天记录,都能学到不少。  订阅后在课程详情页,点击链接即可入群 编辑小姐姐也经常在群里出没,鼓励督促,可以说是伴随式的学习了,我加过的交流群不少,这个群确实非常难得,大佬云集,知识密度高,气氛活跃,学习体验也很好。 说了这么多,来看看课程各章节的知识点和精彩看点吧。  再强调一点:秒杀  口令「ososos666」现到手仅需 ¥89,即将涨价至 ¥199如果你是新人,只需 ¥59.9 

    8号线攻城狮 操作系统

  • 很多人对结构体对齐有误解

    正文大家好,我是bug菌!最近看到一些朋友在交流结构体对齐方面的一些问题,从他们的交谈中隐隐约感觉有几个朋友对结构体成员的对齐理解上有点偏差,不能说完全不对吧,毕竟这是老生常谈的问题了~所以bug菌今天跟大家好好谈谈对齐这个话题~1变量与内存首先我们要明确,在嵌入式C语言中变量是什么?其实所谓的变量就是一小段内存。当你随心所欲的在C程序中定义着各种变量,有没有想过他们是如何被安排到相应内存上的?好吧,其实他们是怎么安排的,并不需要程序员太多的操心,这个映射过程都是编译器自动给大家分配的,(可以借助动态内存的角度去看待这个分配问题),因为大部分变量在一定内存区域上是可以任意选择地址的,比如你定义一个全局的int gVar 变量,在不进行特殊指定内存位置的情况下,其编译后所分配的内存地址并不一定每次都是相同的;当然,每次编译完成便会确定下来,并且程序中对该变量的访问,均会使用所确定下来的内存地址。既然变量的地址分配过程由编译器自动完成,但有时候我们想把一些或者某个变量放在固定的内存地址处等,此时就需要通过一些语法来告诉编译器该如何分配这些指定变量内存的分配,比如要做复位数据恢复等。然而内存的对齐问题也是对这些变量分配位置处理的一种方式,通常我们看到的align或者pack等就是来干预编译器的这块处理的。2结构体对齐理解了上面的一个思路,那么我们来分析分析结构体对齐问题。参考demo: 1#include  2#include  3 4/*默认对齐方式*/  5typedef struct _tag_ContrlObj1 6{ 7    char member1; 8    int member2; 910}sContrl1;1112/*1字节对齐*/ 13#pragma pack(1) 14typedef struct _tag_ContrlObj215{16    char member1;17    int member2;1819}sContrl2;20#pragma pack()2122/*2字节对齐*/ 23#pragma pack(2)24typedef struct _tag_ContrlObj325{26    char member1;27    int member2;2829}sContrl3;30#pragma pack()3132/*4字节对齐*/ 33#pragma pack(4)34typedef struct _tag_ContrlObj435{36    char member1;37    int member2;3839}sContrl4;40#pragma pack()4142/*8字节对齐*/  43#pragma pack(8)44typedef struct _tag_ContrlObj545{46    char member1;47    int member2;4849}sContrl5;50#pragma pack()5152int main(int argc, char *argv[]) {5354    printf("default:%d\n",sizeof(sContrl1));55    printf("pack(1):%d\n",sizeof(sContrl2)); 56    printf("pack(2):%d\n",sizeof(sContrl3));57    printf("pack(4):%d\n",sizeof(sContrl4));58    printf("pack(5):%d\n",sizeof(sContrl5));5960    return 0;61}运行结果:以上编译结果采用的是32位编译器,默认对齐方式是4个字节,char类型占据1个字节,int占据4个字节,下面简单分析一下结果:1、默认方式,采用4个字节对齐,那么char后面需要填充3个字节,然后存放int类型,所以结构体大小输出为8。2、1字节对齐方式,直接紧凑排列,很多人也叫不进行对齐处理,所以输出结果是5。3、2字节对齐方式,其实和4个字节对齐是类似的,char按照2字节对齐,所以后面需要填充一个字节,这样int才能以两字节对齐排布,此时整个结构体占据6个字节。4、4字节对齐方式与默认对齐方式一致,最后看看8字节对齐,此时char类型与int类型完全能够被8个字节容纳,而该结构体最大数据类型是4个字节,所以char后面会预留3个字节,进行4字节对齐,然后放置int类型,此时与4字节对齐是一致的。那么一些朋友会问,是不是在上面的8字节例子中再加入一个char类型的成员,整个结构体就会占据16个字节了呢?1/*8字节对齐*/  2#pragma pack(8)3typedef struct _tag_ContrlObj54{5    char  member1;6    int   member2;7    char  member3;8}sContrl5;9#pragma pack()其输出结果如下:结构体所占据的字节是12个,那是不是认为8字节对齐没有意义呢?我们再看一个实验:1/*8字节对齐*/  2#pragma pack(8)3typedef struct _tag_ContrlObj54{5    char     member1;6    double   member2;7    char     member3;8}sContrl5;9#pragma pack()此时double占据了8个字节,按照前面的思路应该是4 8 4,应该最终结构体的大小是16个字节,而结果显示:输出结果显示24=8 8 8的形式,大家也可以直接采用打印结构体成员地址的办法查看是几个字节对齐,有点晕,到底编译器这一块是怎么处理的呢?结论是:对齐字节数 = min。很多朋友其实研究到这个阶段基本上就没有再继续探究了~嵌入式C语言一定要跟硬件结合理解~3内存对齐其实所谓的结构体对齐,并不是简单的1个字节、两个字节等多个字节的排列组合,而是在对应对齐地址上分布。首先对齐需要解决的问题是什么 ? 即为啥需要对齐?提高内存的访问效率,也可以说是受CPU等硬件方面的限制,按照特定的对齐地址进行数据的访问要快于跨非对齐地址的内存访问;并且有些平台仅支持对齐方式访问,非对齐方式会直接运行错误。为了加快相关数据的正确访问,编译器会把相关的变量尽量的放到对齐的地址上,也就是默认的对齐方式,比如CPU在偶数地址上访问比较快,那么就会采用2个字节对齐的方式。所以结构体内部成员并不是简单成员字节个数的对齐拼凑,而是让结构体成员落在对齐的地址上以便访问。如下图所示,当进行2字节对齐,如果只是简单的拼凑,两种分布都是可以的,但是左侧才是正确的2字节对齐方式,char成员变量的地址是2,int变量的地址是4,均为2字节的倍数。总结一下: 结构体对齐不再是简单的字节个数的拼凑,而是要与内存地址进行挂钩~一般我们也可以理解为内存地址分配是多少字节的倍数,就是多少直接对齐~enjoy~最后    今天的内容就到这里了,觉得有所收获,记得点个赞哦~~

    嵌入式客栈

  • 玩编程,开源协议不懂可不行!

    今天和大家分享一些开源协议的知识。这些协议缩写词在各种代码、文档中随处可见,比如GPL、BSD、MIT、Mozilla、Apache和LGPL等等。github新建仓库时协议选择这么多协议,我们了解的有多少呢?作为一名专业的嵌入式系统开发人员,了解这些开源协议是一种基本素养,特别是当你自己要开源一些东西的时候该如何选择开源协议就变得非常重要了!下面,对常见的几种做一下简单的介绍。开源协议的作用开源协议规定了你在使用开源软件时的权利和责任,也就是规定了你可以做什么,不可以做什么。开源协议虽然不一定具备法律效力,但是当涉及软件版权纠纷时,开源协议也是非常重要的证据之一。对于准备编写一款开源软件的开发人员,也非常建议先了解一下当前最热门的开源许可协议,选择一个合适的开源许可协议来最大限度保护自己的软件权益。如何选择开源协议世界上的开源许可证(Open Source License)大概有上百种,今天我们来介绍下几种我们常见的开源协议。大致有GPL、BSD、MIT、Mozilla、Apache和LGPL这6种。点击放大下面通过这几张图,大家可以一目了然的选择合适的开源协议:点击放大乌克兰程序员 Paul Bagwell 画了一张分析图单击放大单击放大详细介绍常用开源协议GNU GPL协议GNU GPL具体为(GNU General Public License,GNU通用公共许可证)。只要软件中包含了遵循 GPL 协议的产品或代码,该软件就必须也遵循 GPL 许可协议,也就是必须开源免费,不能闭源收费,因此这个协议并不适合商用软件。遵循 GPL 协议的开源软件数量极其庞大,包括 Linux 系统在内的大多数的开源软件都是基于这个协议的。BSD协议BSD协议具体为(Berkeley Software Distribution,伯克利软件发布版)协议。BSD 协议给予用户极大的权利,用户可以使用、修改和重新发布遵循该许可的软件,并且可以将软件作为商业软件发布和销售,前提是需要满足下面三个条件:如果再发布的软件中包含源代码,则源代码必须继续遵循 BSD 许可协议。如果再发布的软件中只有二进制程序,则需要在相关文档或版权文件中声明原始代码遵循了 BSD 协议。不允许用原始软件的名字、作者名字或机构名称等进行市场推广。BSD 对商业比较友好,很多公司在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,甚至在必要的时候可以修改或者二次开发。Apache 协议Apache 协议具体为许可证版本(Apache License Version)协议,Apache 和 BSD 类似,都适用于商业软件。Apache 协议在为开发人员提供版权及专利许可的同时,允许用户拥有修改代码及再发布的自由。Hadoop、Apache HTTP Server、MongoDB 等项目都是基于该许可协议研发的,程序开发人员在开发遵循该协议的软件时,要严格遵守下面的四个条件:该软件及其衍生品必须继续使用 Apache 许可协议。如果修改了程序源代码,需要在文档中进行声明。若软件是基于他人的源代码编写而成的,则需要保留原始代码的协议、商标、专利声明及其他原作者声明的内容信息。如果再发布的软件中有声明文件,则需在此文件中标注 Apache 许可协议及其他许可协议。Apache 协议还有以下需要说明的地方: 永久权利: 一旦被授权,永久拥有。全球范围的权利: 在一个国家获得授权,适用于所有国家。授权免费,且无版税: 前期,后期均无任何费用。授权无排他性: 任何人都可以获得授权授权不可撤消: 一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码。MIT协议MIT协议具体为(Massachusetts Institute of Technology)协议,又称「X条款」或「X11条款」。目前限制最少的开源许可协议之一(比 BSD 和 Apache 的限制都少),只要程序的开发者在修改后的源代码中保留原作者的许可信息即可,因此普遍被商业软件所使用。使用 MIT 协议的软件有 PuTTY、X Window System、Ruby on Rails、Lua 5.0 onwards、Mono 等。GUN LGPL协议GUN LGPL协议具体是(GNU Lesser General Public License,GNU 宽通用公共许可证)。LGPL 是 GPL 的一个衍生版本,也被称为 GPL V2,该协议主要是为类库设计的开源协议。LGPL 允许商业软件通过类库引用(link)的方式使用 LGPL 类库,而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。但是如果修改 LGPL 协议的代码或者衍生品,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。END来源:玩转嵌入式版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 开源

  • 最新数据库流行度排行榜出炉!

    每个月 DB-Engines 网站都会根据“数据库管理系统的受欢迎程度”对其进行排名,近日该网站给出了2021年9月份数据库排名情况。榜单显示,本月排名前九位依旧保持不变,按顺序依次是:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、MongoDB、Redis、IBM Db2、Elasticsearch 和 SQLite。相比8月份,排名前列的数据库中只有 Microsoft Access 和 Cassandra 出现了名次上的互换。在8月份的榜单中,Microsoft Access 将 Cassandra 挤出了前十,而在9月份 Cassandra 又重新夺回了这个位置。虽然两者的分数在本月都有上升,但 Cassandra 上升幅度更大。目前 Microsoft SQL Server 位列第三,但截至目前为止,Microsoft SQL Server 在 2021 年一直处于下滑状态,每月下滑幅度不一,本月对比上个月下降 2.5 分,相比去年同期分数低了 91.91 分。由于第四名与它的差距还非常大,因此短时间内还不会影响到它的排名。本月下滑幅度最大的当属 MySQL,相比上个月下降 25.69 分,相比去年同期下降 51.72 分。MySQL 目前领先 Microsoft SQL Server 的幅度还比较大,再加上后者也在持续下滑,因此短期内并不会影响 MySQL 的排名。流行度趋势如果查看一下这些数据库近些年的变化趋势,就能发现 PostgreSQL、MongoDB 和 Azure SQL Database 是上升最为明显的。如果按照这个趋势继续发展下去,PostgreSQL 和 MongoDB 完全有机会在未来 2 年左右的时间超越 Microsoft SQL Server。最后,咱们再来看看各类型数据库的排名情况。关系数据库前十名:Key-Value数据库前十名:文档数据库前十名:时序数据库前十名:图数据库前十名:据悉,DB-Engines 根据流行度对数据库管理系统进行排名,排名每月更新一次,而排名的数据则依据 5 个不同的指标:Google 以及 Bing 搜索引擎的关键字搜索数量Google Trends 的搜索数量Indeed 网站中的职位搜索量LinkedIn 中提到关键字的个人资料数Stackoverflow 上相关的问题和关注者数量这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术才是最重要的!END作者:Travis来源:OSC开源社区(ID:oschina2013)版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 数据库

  • 有了它,我在bug面前一点也不慌~

    大家好,我是bug菌!最近看到一个小伙子调bug,那简直是苦不堪言,断点是打了无数个,日志是打印了一大堆。可想而知,这样调试bug的过程是痛苦的,特别是一些莫名其妙的bug。而更可恼的是,有时候项目、客户、boss还要在旁边催,估计大部分工程师都想一鼠标键盘砸过去了……不过,非常时刻还是要有非常手段,毕竟有些bug是毁灭性的,动不动一个小时损失几W的场面那是多么可怕的。我觉得解决bug主要是两个方面:1、解决bug过程的思路一定要清晰,不要全凭感觉,东打一枪,西轰一炮,调试过程要有步骤有依据,更不要在代码中注释类似于"把这行代码屏蔽就可以正常运行这样的注释了~~"2、理论知识要完备,包括问题的专业知识和高效的调试技巧知识,对这一块功能设计理解都不透彻怎么根除问题呢?今天主要是跟大家介绍一下条件断点(统称,下面类似)如何使用,可以说有一半以上的软件工程师很少、甚至没有用过条件断点,这可是调试bug的神器,为何不好好利用起来呢?难道一定要一个个普通断点的调试才更带感吗?1Keil中的调试断点我们可以找到Debug调试中的Breakpoints选项进入该工程中所有设置断点的具体信息:上图展示了03和04两个断点,分时标注了用户所设置断点的位置。其实你完全可以把这种普通断点看成是条件断点的一种,其条件就是当程序运行到如上所设置的地址处就会终止运行,只是说这样的普通断点可以直接在所编写的程序中点击设置。然而面对更加复杂的条件断点,似乎Keil并不能为用户更好的提供展示,也是就有了上图的断点设置对话框,但又担心我们不知道怎么用,于是就有了一个help跳转到帮助文档供我们查阅。可以说在help里面几乎把每一项的功能都说得很清楚了,并且蓝色部分可以点击进入进一步详细说明,所谓“授人以鱼不如授人以渔”,bug就不啰嗦了,下面是help里面的实例,照着来即可~不过,这里还是简单介绍一下Keil中为用户提供了三类断点:访问断点(A)此类断点是设置了读或写标志,或同时设置了这两个标志的时候使用的。当指定的内存访问发生时触发断点,这就非常有用了,有了它你调试程序的害怕数组越界吗?变量被篡改吗?可以选择指定内存访问窗口的大小(以字节为单位)或作为表达式的对象大小。对于此断点类型,表达式必须解析为内存地址和内存类型,允许的操作符 (

    嵌入式ARM

  • 推荐几个优质的软硬件公众号

    不定期给大家推荐行业内相关的公众号,也是比较用心在维护的公众号。每一个号都有自己的特点,如果有你喜欢的公众号,不妨扫码关注一下。记得诚学电子,且看记得诚,号主诚哥,CSDN博客专家,博客之星TOP30,就职于某知名大厂,资深硬件工程师,乐于分享电路设计、PCB设计、电子元器件、电子电路等知识。 写了一些还不错的专栏,值得关注:「专辑」电子元器件「专辑」电路设计「专辑」PCB设计「专辑」通信总线关注记得诚,查看更多精彩内容,一起学电子,不枯燥。裸机思维号主傻孩子,具有十多年的嵌入式研发经验,在amobbs论坛和野火论坛(firebbs.cn)开设有专栏。该公众号着重于介绍和讨论嵌入式开发中所涉及到的思维训练、C语言以及编译器相关的关键知识、裸机环境下的开发者模型等等……与其他嵌入式公众号不同:『裸机思维』的文章彼此互为补充,知识体系较为完整;通常会围绕某一专题深入浅出地连载多篇文章——最终对知识点实现完整和全面的覆盖。【实时性迷思】系列【真刀真枪模块化】系列【大话嵌入式安全】系列【为宏正名】系列【漫谈C变量】系列【从零开始的状态机漫谈】系列【编译器玄学报告】系列【嵌入式秘术】系列鱼鹰谈单片机一个将单片机与C语言知识结合的公众号,不仅分享单片机知识,同时介绍C语言的博大精深。挖坑、填坑、思考、分享,这就是人称“被嵌入式耽误的畅销书作家”鱼鹰所做的事了。鱼鹰公众号进阶笔记汇总如果你想得到更多代码调试经验,单片机使用经验,C语言运用经验,获得技术的进阶,不如就来关注鱼鹰吧,我在公众号等你。巧学模电数电单片机『巧学模电数电单片机』致力于为中国的设计、研发、测试工程师提供精选的软、硬件技术知识,这里所有的内容跟你有关,对你有用!模数视频教程 | 持续更新中...既讲原创深度技术,又不失通俗易懂,欢迎关注。

    技术让梦想更伟大

  • 伟大源于精神的传承:梅耶.马斯克《人生由我》

     在过去的一周,我阅读了由梅耶马斯克写的自传性书籍----《人生由我》。如果不是因为作者是钢铁侠--埃隆马斯克的母亲,我不知道自己是否保持如此浓烈的兴趣在短时间内读完它。读完之后,觉得即便没有埃隆马斯克的耀眼光芒,梅耶作为一名女性,即便遭遇种种人生困境,仍然通过自己的积极乐观,坚韧努力,善于学习,不断战胜困难,把人生掌握在自己的手里,度过了自己精彩而充实的一生。在这本书里,梅耶用五个部分来展现自己的人生的方方面面和生活感悟。第一部分:关于美丽梅耶遗传了父母的优秀基因,包括美丽的容貌和身高优势,在年少时参加了南非的选美比赛并获得了第一名的成绩,从此踏入了模特行业。但是令人没有想到的是,这份职业生涯如此短暂的工作,却让梅耶一直工作到了71岁;并以如此高龄登上时代杂志封面,参加巴黎时装周走秀,迎来自己事业的巅峰期。有人说,是因为她是埃隆马斯克的母亲;有人说,是因为她太过幸运。然而,命运垂青的是每一个有准备的人。在此之前,梅耶马斯克已经在模特行业兢兢业业奋斗了50多年,从南方到加拿大,再到美国,她从未放弃过,而是抓住每一个机会不断尝试,探索和进步。与其说她幸运,不如说她够努力。因为她的父亲从小告诫她的人生信条是:越努力越幸运!第二部分:关于冒险梅耶成长于一个痴迷于探险旅行的家庭。她的父母曾在十九世纪五十年代,开着一架没有GPS和无线电,只用帆布覆盖的小型螺旋桨飞机,穿越加拿大,美国,非洲,欧洲,亚洲,和澳大利亚。当她还是孩子的时候,她的父母每年冬天带他们去卡拉哈里沙漠,去寻找一座失落的古城。她的父亲总是说:“没有什么是霍尔德满家的人做不到的!”这也成为了梅耶和她兄弟姐妹的人生信条。父亲的无所畏惧和冒险精神深深的影响了她;一直以来,她尽己所能,让自己成为榜样,向孩子们展示出这一点。并告诉他们:“没有什么是马斯克家的人做不到的!”她用行动完成了这个家族冒险精神的传递。每每惊叹于于埃隆马斯克为什么有如此伟大的想象力和冒险精神:创建第一家支付公司PayPal,创建电动汽车公司特斯拉,创建SpaceX发射火箭,执行火星移民计划.....我想没有什么无缘无故,一切都源于这个家族的精神底色,冒险已经浸入他们的血液了。第三部分:关于家庭梅耶在感情和婚姻中并没有如人所愿的获得幸福,恰恰相反,她曾经整整九年饱受家庭暴力之苦,曾经身陷黑暗而不能自拔,找不到光明的出路。然而,经过痛苦的挣扎,她终于解救了自己,带着三个孩子,自力更生,重新出发。因此,她也教导孩子们要学会独立生存的能力,认清现实,敢于承担责任,从未对孩子过度保护和溺爱.她提到一个十二岁魔法,也是她教育孩子的理念。“教给孩子良好的习惯,但是你无法帮他们决定未来能做什么!”让他们学会对自己的未来负责,而父母只要给予支持就可以了。因此,她鼓励自己的三个孩子,发挥自己的特长,做自己热爱的工作和事业。她的三个孩子也非常成功:埃隆马斯克的成功众所周知;她的小儿子和女儿分别在绿色食品和影视方面也有颇多建树,取得了各自领域的成功。所以最好的教育,就是以身作则,让自己努力成为孩子的榜样。第四部分:关于成功与其说梅耶是明星,或者网红,不如说她是一个普通而坚韧的励志人物。她并非传统意义上的成功人士,她的感情和婚姻都很不幸,还曾经历过长期家暴,不得已经历三个国家9个城市的搬迁生活,经济并不富裕,模特工作时常被拒,不得不一次次重新开始。常常如你我,不得不面对生活的一地鸡毛。而她真正成功的是:面对困难,保持积极乐观的态度,坚韧不拔,勇于争取,勇于探索,勇于从新开始。而且在70多岁,依然优雅做自己,不惧衰老。她说衰老的伟大之处在于:你会经历许多次打击,你也会穿过看似无尽的黑暗。最后,你会恢复的越来越快。第五部分:关于健康梅耶除了模特工作外,自己的本职工作是一名出色的营养师。因此她也几十年如一日的执行良好的饮食计划和健身,让自己保持充沛的精力和敏锐的头脑。除了健康的饮食习惯,另一个重要的健康法则是:保持乐观的精神,对生活怀有希望,专注于此,并为此感到兴奋。如果冒险精神来源于父亲,那么乐观和不抱怨的精神特质则更大的来源于母亲。她的父母婚姻美满幸福,然而在父亲七十三的时候,在一起飞机事故中去世,这场巨大的灾难降临在这个家庭,她们无法想象失去父亲的母亲,该如何继续生活下去。然而,六十一岁的母亲开始学习木雕,陶艺和绘画等等艺术课,开始周游南非,有油画颜料和水彩描绘她看到的风景和建筑。现在,她的作品会被定期展览。同时,她的母亲也是一名摄影师,作品获得过多个奖项。并在七十多岁的时候,开始学习蚀刻版画,这是一个极其艰难的过程,但是母亲却夜以继日的投入自己的事业,一干就是二十二年。直到她九十四岁的时候,她的手已经颤抖到没法儿再拿笔画画。但她并未放慢脚步,开始研究数码艺术。直到九十六岁高龄,手颤抖到极其严重的地步,才正式退休。随后开始如饥似渴的阅读书籍。在地图上标识他们曾经去过的地方。她的母亲说:九十多岁是她一生中最快乐的时光。梅耶有一个如此智慧的母亲做榜样,她自然对未来充满期待!对衰老没有恐惧,而且从未放慢追求的脚步。在看完一个人70多年的人生历程后发现,每一个人的一生里,让人烦恼的问题总会一次次出现。当你遇到了某件可怕的事情,或者某人对你暴露恶意时,你可以说,排个号吧!希望在人生的每个阶段,都能坦然面对生命中的难题,积极乐观,努力探索,并对未来满怀热情,翘首期待。希望在夜深人静时,在回首过往时,可以欣慰的说:我正在度过有史以来最好的时光。

    Linux阅码场 马斯克

  • 喧嚣过后,是时候理性聊聊操作系统和生态了

    编者按:本文根据魏永明在知乎上的几个有关操作系统的问答整理而来。如何评价“操作系统不难做,难在生态建设”这一观点?(这个回答,笔者试着将操作系统看成是生产工具,将生态看成是生产关系。如此一来,貌似很多概念和关系都变清晰了。)持这个观点的人,通常在评价国产操作系统时说这句话。比如说到桌面操作系统,国产基于 Linux 的操作系统对阵 Windows,说到手机操作系统,国产的鸿蒙对阵 Android。他们摆出这个观点,潜台词无外乎如下两条:我们有能力开发出自主的国产操作系统。友商不配合,国人不支持,生态难建立。你看,如果将来他们失败了,不是他们自己的问题,而是友商的问题,国人的问题!为了防止将来被甩锅,我们应该坚决反对这个观点。当然,反对这个观点的根本原因,是因为这个观点站不住脚。从历史唯物主义的角度看,操作系统作为工具性的产品,属于生产工具,好的操作系统代表生产力的提高,而我们常说的围绕操作系统的生态,其实就是指围绕操作系统的上下游配合关系,也就是生产关系。我们知道,新型生产工具的出现,会导致生产关系发生巨大的改变,在原有生产关系里边的富人,可能会成新的生产关系里边的穷人,反之亦然。这种改变,有时候会自然而然发生,但更多的时候,旧的生产关系(往往代表既得利益者)会阻碍新型生产工具的普及。这种情况下,需要打破旧的生产关系,才能让好的生产工具得到普及,整个社会或者某个领域的生产力才能得以提高。也就是说,我们可以利用主观能动性来构建一个新的生产关系,也就是建设一个新的生态(打土豪、分田地也算)。但前提是,新型的生产工具必须足够好,必须足够支撑一个全新的生产关系,也就是说,拿着一个不代表先进生产力的生产工具,想通过外力来改变已有的生产关系是很难的,几乎不可能的。芯片以及操作系统,就是信息社会中非常重要的两项生产工具。操作系统的重要性在于,在一个恰当的节点,利用一个好的操作系统作为工具,可以相对容易地新建或重构一个生产关系。本次不谈芯片,单谈操作系统。我们从操作系统的发展历史,可以清晰地看到围绕操作系统的生产关系(也就是所谓生态)的演变过程:桌面电脑时代,微软等公司以 DOS/Windows/Office 等产品为依托,成功建立了围绕软件副本许可的商业模式,从而促进了桌面电脑软硬件的大发展。处理器公司、整机公司、操作系统公司、数据库公司、办公软件公司和消费者共同造就了这一前所未有的生产关系。互联网时代,Linux 为代表的开源软件基础软件,创造了一个新的围绕开源软件的生产关系,这个生产关系促进了云服务等新型生产工具的发展,全社会的生产力得到进一步提升。移动互联网时代,iOS/Android 为代表的移动操作系统,创造了一个围绕 App Store 和内容分发为主的新型生产关系,这个生产关系促进了人工智能、大数据处理等新型生产工具的发展,全社会的生产力得到进一步提升。显然,你首先需要一个代表先进生产力的全新操作系统,才能让这个操作系统成为构建全新生产关系(生态)的基础。需要指出的是,所有尝试复制已有操作系统的努力,大都失败了。典型的如 OS/2、Meego,前者复制的是 Windows,后者复制的是 Android。另外一种失败的复制方式,以微软的 Windows Mobile/Phone 操作系统为代表。这次失败,是微软在谷歌及其合作伙伴围绕开源的 Android 构建新的生产关系之时,试图将其在个人电脑操作系统上建立的生产关系(生态),复制到移动互联网时代的一个尝试。结果大家都看到了,微软在移动互联网操作系统的竞争中惨败。Windows Mobile/Phone 的失败,在于微软未意识到移动互联网时代需要一个新的生产关系。利用旧的生产工具(闭源且收取高昂许可费)来服务新的生产关系,结果自然是惨败。从这些历史中,我们大致可以总结出一些操作系统发展的规律出来:在信息社会,操作系统是构建一个全新生产关系的最重要、最基础的生产工具。但没有成功案例证明一个新的操作系统可以重构一个已有的生产关系。新的操作系统往往和重大的产业重构时机一并出现,如 Windows 之于个人电脑,Linux 之于互联网,Android/iOS 之于移动互联网。大家都说下一个新的产业重构机会是物联网,但看起来又不像,我们只能拭目以待。成功的操作系统具有赢家通吃的属性。世界上市值最高的几个高科技公司,苹果、谷歌、微软,都有自己的操作系统,而且还在不停地演进。发展操作系统需要长期、大量的技术积累。举个例子,前个阶段华为发布了鸿蒙 2.0,大批国人正在为多屏共享这个功能欢呼之时,没过几天苹果就发布了 iOS 15,其中展示了苹果各种设备之间迁移应用的效果。时间如此之短,这说明苹果早就有了相关技术,只是没有拿出来展示而已。现在看看我们的国产操作系统,是否代表了最先进的生产力?国产桌面系统,内核是 Linux、GUI 是 Qt,浏览器核心是 Chromium,没几个核心技术是我们自己发展出来的。大家呼声最高的鸿蒙,以开源的 OpenHarmony 2.0 为例,总代码行数据说达到了 200 万行。要知道,200 万行代码真不算什么,笔者维护的开源窗口系统 MiniGUI 及其组件,总代码行数都已超过 200 万行了,而一个成熟的浏览器引擎,代码行数都要上千万行的。就这样的国产操作系统,有能力作为构建全新生产关系的基石?我是不信的。回到“操作系统不难做,难在生态建设”这个观点上。持这个观点的人,要么是缺乏深度思考,要么只是在为自己将来的失败找说辞找退路。不要说不过别人就开始道德绑架,说什么“友商不配合,国人不支持”的话了。为什么那么多国人认为开发个操作系统不是难事?的确,国内外有好几个个人维护和开发的操作系统,Linux 不也最初是 Linus 一个人写的嘛。所以,有此想法再正常不过了。我们之所以认为开发一个操作系统不是难事,就是因为在我们的潜意识当中,操作系统的长相已经固定了,我们所谓的开发一个操作系统,就是按照已有操作系统的模样,重写一遍就算是国产自主了。这个操作系统的模样,说到内核,指的是符合 POSIX 标准,有 Linux 为模板;说到除了裸的内核之外,还要包含现代的应用开发和运行框架,对桌面操作系统就是 Linux Gtk/Qt,对手机操作系统就是 Android 那个样子,服务器嘛,CentOS 这样的就行。为什么会这样?因为以上所说的全是开源的!既然有开源的,重写一遍就是浪费时间,拿过来,维护起来,再取个牛逼的名字就可以标榜为国产自主的操作系统。这么多年过去了,国人的操作系统开发实践,就是不停地按照一个已有的设计做一些重复的模仿工作或者是修修补补的工作。懒惰点的,或模仿或抄袭,勤快点的,掺点自己的料进去,美其名曰“集成创新”,其实就是攒系统。按照这个搞法,当然不是难事!写到这里算是回答完了吗?并没有,因为这个问题本身并没有触及问题的本质。如果把这个问题换个提法,我相信读者一下子就会恍然大悟:“为什么设计一个全新的操作系统如此之难?”因此,这个问题的正确答案是:持此说法的国人,他们从来没有尝试过设计一个全新的操作系统,所以他们认为开发个操作系统并非难事。

    Linux阅码场 操作系统

  • 图文并茂 | 例说ELF文件

    ELF文件(Executable Linkable Format)是一种文件存储格式。Linux下的目标文件和可执行文件都按照该格式进行存储,有必要做个总结。1. 链接举例2. ELF文件类型2.1 可重定位目标文件(.o文件)2.2 可执行目标文件(a.out文件)2.3 共享对象文件(.so文件)3. ELF文件作用4. ELF文件格式4.1 从编译和链接角度看ELF文件(可重定位目标文件)4.2 从程序执行角度看ELF文件(可执行文件)5.总结1. 链接举例   在介绍ELF文件之前,我们先看下,一个.c程序是如何变成可执行目标文件的。下面举个例子。  该程序由main.c和sum.c两个模块组成。sum.c接收数组和数组长度两个参数,最后将数组求和的结果返回。main.c调用sum函数,并传递一个两元素的int数组array,将计算结果保存在val中。//main.cint sum(int *a, int n);int array[2] = {1, 2};int main(int argc, char** argv){    int val = sum(array, 2);    return val;}//sum.cint sum(int *a, int n){    int i, s = 0;    for (i = 0; i < n; i ) {        s  = a[i];    }    return s;}  让我们来看看如果我们使用GCC编译两个模块会发生什么?  main.c和sum.c将分别通过翻译器将源文件处理为可重定位的目标文件main.o和sum.o。翻译器处理的过程包括了预处理(ccp)、编译(ccl)、汇编(as) 三个过程。最后,链接器(ld) 将可重定位的目标文件main.o和sum.o以及一些必要的系统文件组合起来,创建一个可执行目标文件prog。具体过程如下图所示。链接过程  由上面的过程,我们可以看出在经过汇编器后会输出一个.o文件,这个叫做可重定位的目标文件。将main.o和sum.o输入链接器后,链接器输出的prog文件叫做可执行目标文件。那这两个目标文件有什么样的区别呢?2. ELF文件类型 2.1 可重定位目标文件(.o文件)  包含二进制代码和数据,其形式可以和其他目标文件进行合并,创建一个可执行目标文件。例如lib*.o文件。2.2 可执行目标文件(a.out文件)  包含二进制代码和数据,可直接被加载器加载执行。例如编译好的可执行文件a.out。2.3 共享对象文件(.so文件)  用于和其他共享目标文件或者可重定位文件一起生成ELF目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。3. ELF文件作用   ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待ELF格式的文件:  1.如果用于编译和链接(可重定位文件),则编译器和链接器将把ELF文件看作是节头表描述的节的集合,程序头表可选。  2.如果用于加载执行(可执行文件),则加载器则将把ELF文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。4. ELF文件格式 4.1 从编译和链接角度看ELF文件(可重定位目标文件)从编译和链接角度看ELF文件ELF头  每个ELF文件都必须存在一个ELF_Header,这里存放了很多重要的信息用来描述整个文件的组织,如: 版本信息,入口信息,偏移信息等。程序执行也必须依靠其提供的信息。段头表  段头表。存放的是所有不同段将在内存中的位置。.text section  代码段。存放已编译程序的机器代码,一般是只读的。.rodata section  只读数据段。此段的数据不可修改,存放常量。比如,printf中的格式化语句。.data section  数据段。存放已初始化的全局变量、常量。.bss section  bss段。未初始化全局变量,仅是占位符,不占据任何实际磁盘空间。目标文件格式区分初始化和非初始化是为了空间效率。从编译和链接角度看ELF文件.symtab section  符号表,它存放在程序中定义和引用的函数和全局变量的信息。.rel.txt section  .text节的重定位信息,用于重新修改代码段的指令中的地址信息。.rel.data section  .data节的重定位信息,用于对被模块使用或定义的全局变量进行重定位的信息。.debug section  调试用的符号表。.strtab section  包含 symtab和 debug节中符号及节名。节头部表  每个节的节名、偏移和大小。  以下是32位系统对应的节头表数据结构,说明了每个节的节名、在文件中的偏移、大小、访问属性、对齐方式等。typedef struct {    Elf32_Word sh_name;   //节名字符串在.strtab节(字符串表)中的偏移    Elf32_Word sh_type;   //节类型:无效/代码或数据/符号/字符串/...    Elf32_Word sh_flags;  //节标志:该节在虚拟空间中的访问属性    Elf32_Addr sh_addr;   //虚拟地址:若可被加载,则对应虚拟地址    Elf32_Off  sh_offset; //在文件中的偏移地址,对.bss节而言则无意义    Elf32_Word sh_size;   //节在文件中所占的长度    Elf32_Word sh_link;   //sh_link和sh_info用于与链接相关的节(如 .rel.text节、.rel.data节、.symtab节等)    Elf32_Word sh_info;    Elf32_Word sh_addralign; //节的对齐要求    Elf32_Word sh_entsize;   //节中每个表项的长度,0表示无固定长度表项} Elf32_Shdr;  使用readelf命令命令查看节头表内容[ubuntu@localhost interpositioning]$ readelf -S main.oThere are 13 section headers, starting at offset 0x3f8:Section Headers:  [Nr] Name              Type             Address           Offset       Size              EntSize          Flags  Link  Info  Align  [ 0]                   NULL             0000000000000000  00000000       0000000000000000  0000000000000000           0     0     0  [ 1] .text             PROGBITS         0000000000000000  00000040       0000000000000071  0000000000000000  AX       0     0     1  [ 2] .rela.text        RELA             0000000000000000  000002d0       0000000000000090  0000000000000018   I      11     1     8  [ 3] .data             PROGBITS         0000000000000000  000000b1       0000000000000049  0000000000000000  WA       0     0     1  [ 4] .bss              NOBITS           0000000000000000  000000b1       000000000000000c  0000000000000000  WA       0     0     1  [ 5] .rodata           PROGBITS         0000000000000000  000000b1       0000000000000019  0000000000000000   A       0     0     1  [ 6] .comment          PROGBITS         0000000000000000  000000ca       0000000000000035  0000000000000001  MS       0     0     1  [ 7] .note.GNU-stack   PROGBITS         0000000000000000  000000ff       0000000000000000  0000000000000000           0     0     1  [ 8] .eh_frame         PROGBITS         0000000000000000  00000100       0000000000000058  0000000000000000   A       0     0     8  [ 9] .rela.eh_frame    RELA             0000000000000000  00000360       0000000000000030  0000000000000018   I      11     8     8  [10] .shstrtab         STRTAB           0000000000000000  00000390       0000000000000061  0000000000000000           0     0     1  [11] .symtab           SYMTAB           0000000000000000  00000158       0000000000000150  0000000000000018          12     9     8  [12] .strtab           STRTAB           0000000000000000  000002a8       0000000000000023  0000000000000000           0     0     1Key to Flags:  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)  O (extra OS processing required) o (OS specific), p (processor specific)  可重定位目标文件中,每个可装入节的起始地址总是0。  .bss节应占0x0c大小,但只有装入内存时才会分配。4.2 从程序执行角度看ELF文件(可执行文件)从程序执行角度看ELF文件  与可重定位目标文件不同:  1.ELF头中,字段 e_entry给出执行程序时第一条指令的地址,而在可重定位文件中,此字段为0。  2.多一个init节,用于定义init函数,该函数用来进行可执行目标文件开始执行时的初始化工作。  3.少两个.rel节(无需重定位)。  4.多一个程序头表,也称段头表,是一个结构数组。  使用readelf命令查看ELF头的内容:[ubuntu@localhost interpositioning]$readelf -h main.oELF Header:  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  Class:                             ELF64  Data:                              2's complement, little endian  Version:                           1 (current)  OS/ABI:                            UNIX - System V  ABI Version:                       0  Type:                              REL (Relocatable file)  Machine:                           Advanced Micro Devices X86-64  Version:                           0x1  Entry point address:               0x0  Start of program headers:          0 (bytes into file)  Start of section headers:          1064 (bytes into file)  Flags:                             0x0  Size of this header:               64 (bytes)  Size of program headers:           32 (bytes)         //程序头表每项32B  Number of program headers:         8                  //程序头表共8项  Size of section headers:           64 (bytes)  Number of section headers:         13  Section header string table index: 10                //.strtab在节头表中的索引  装入内存时,ELF头、程序头表、.init节、.rodata节会被装入只读代码段。.data节和.bss节会被装入读写数据段。  段头表能够描述可执行文件中的节与虚拟空间中的存储段之间的映射关系。一个表项32B,说明虚拟地址空间中一个连续的片段或一个特殊的节。以下是32位系统对应的段头表数据结构:typedef struct {    Elf32_Word p_type;   //此数组元素描述的段的类型,或者如何解释此数组元素的信息。    Elf32_Off p_offset;  //此成员给出从文件头到该段第一个字节的偏移    Elf32_Addr p_vaddr;  //此成员给出段的第一个字节将被放到内存中的虚拟地址    Elf32_Addr p_paddr;  //此成员仅用于与物理地址相关的系统中。System V忽略所有应用程序的物理地址信息。    Elf32_Word p_filesz; //此成员给出段在文件映像中所占的字节数。可以为0。    Elf32_Word p_memsz;  //此成员给出段在内存映像中占用的字节数。可以为0。    Elf32_Word p_flags;  //此成员给出与段相关的标志。    Elf32_Word p_align;  //此成员给出段在文件中和内存中如何对齐。} Elf32_phdr;  使用readelf命令查看某可执行目标文件的程序头表。[ubuntu@localhost interpositioning]$readelf -l mainElf file type is EXEC (Executable file)Entry point 0x400550There are 9 program headers, starting at offset 64Program Headers:  Type           Offset             VirtAddr           PhysAddr                 FileSiz            MemSiz              Flags  Align  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040                 0x00000000000001f8 0x00000000000001f8  R E    8  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238                 0x000000000000001c 0x000000000000001c  R      1      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000                 0x00000000000008ac 0x00000000000008ac  R E    200000  LOAD           0x0000000000000e10 0x0000000000600e10 0x0000000000600e10                 0x0000000000000240 0x0000000000000248  RW     200000  DYNAMIC        0x0000000000000e28 0x0000000000600e28 0x0000000000600e28                 0x00000000000001d0 0x00000000000001d0  RW     8  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254                 0x0000000000000044 0x0000000000000044  R      4  GNU_EH_FRAME   0x0000000000000780 0x0000000000400780 0x0000000000400780                 0x0000000000000034 0x0000000000000034  R      4  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000                 0x0000000000000000 0x0000000000000000  RW     10  GNU_RELRO      0x0000000000000e10 0x0000000000600e10 0x0000000000600e10                 0x00000000000001f0 0x00000000000001f0  R      1  程序头表信息有9个表项,其中两个为可装入段(即Type=LOAD):  第一可装入段:第0x00000~0x0x8ab的长度为0x8ac字节的ELF头、程序头表、.init、.text和.rodata节,映射到虚拟地址0x400000开始长度为0x8ac字节的区域 ,按0x200000=2MB对齐,具有只读/执行权限(Flg=RE),是只读代码段。  第二可装入段:第0xe10~0x104f的长度为0x240字节的.data节和磁盘中不占存储空间的.bss节,映射到虚拟地址0x600e10开始长度为0x248字节的存储区域,在0x248=584B存储区中,前0x240=576B用.data节内容初始化,后面584-576=8B对应.bss节,初始化为0 ,按0x200000=2MB对齐,具有可读可写权限(Flg=RW),是可读写数据段。  由此看出.bss节在文件中不占用磁盘空间,但在存储器中需要给它分配相应大小的空间。5.总结   1.链接处理涉及到三种目标文件格式:可重定位目标文件、可执行目标文件和共享目标文件。共享库文件是一种特殊的可重定位目标。  2.ELF目标文件格式可以从编译链接角度和程序执行角度两个角度看,前者是可重定位目标格式,后者是可执行目标格式。从编译链接角度看,可重定位目标文件中包含ELF头、各个节以及节头表。可执行目标文件中包含ELF头、程序头表(段头表)以及各种节组成的段。  3.bss段在可执行目标文件中不会有它的空间,只有当可执行目标文件装载运行时,才会被分配内存(并且位于data段内存块之后),并且初始化为0。本文参考《深入理解计算机系统》

    嵌入式大杂烩

  • 串口通信 | 简单明了的基础知识

    关注「嵌入式大杂烩」,选择「星标公众号」一起进步!一、什么是串口通讯?串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。图1:串行通讯示数据传输意图二、串口通讯的通讯协议?最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。三、串口通讯的物理层串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。下图为DB9标准串口通讯接口:DB9引脚说明:上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。四、波特率波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示;比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的。收发波特率一致可以实现通讯:收发波特率不一致,导致RX端不能正常接收:五、串口通讯的数据结构起始位: 起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。数据位: 数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。奇偶校验位: 奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。停止位: 停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。空闲位: 空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。六、单双工通讯单工: 数据传输只支持数据在一个方向上传输;半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。七、STM32中的串口通讯STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。TXD:数据发送引脚;RXD:数据输入引脚对于两芯片的间的连接,两个芯片GND共地,同时TXD和RXD交叉连接,这样两个芯片间可进行TTL电平通信。但如果对于芯片和PC机相连,除了共地条件外,不能使用如上的直接交叉连接,虽然两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针),通常是TXC和RXD经过电平转换得到,故如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接,二者的电平标准不同:单片机的点评标准(TTL电平): 5V表示1,0V表示0;RS232电平标准: 15/ 13V表示0,-15/-13表示1。因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换.如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示STM32串口通讯代码STM32中串口通讯已经给大家建好了相应的库函数,大家在使用和配置串口的时候直接进行调用库函数和配置就行了,请大家参照一下代码:1、初始化结构体代码typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 字长 uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校验位 uint16_t USART_Mode; // USART 模式 uint16_t USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;2、NVIC配置中断优先级NVIC_Configuration(void){  NVIC_InitTypeDef NVIC_InitStructure;    /* 嵌套向量中断控制器组选择 */  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    /* 配置USART为中断源 */  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;  /* 抢断优先级*/  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  /* 子优先级 */  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  /* 使能中断 */  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  /* 初始化配置NVIC */  NVIC_Init(

    嵌入式大杂烩 串口通信

  • 从零开始开发一款嵌入式产品的一些经验(长文,收藏细读)

    来源 | CSDN大家好,我是ZhengN。本次给大家分享一位前辈的一些产品开发经验,我读过之后受益匪浅,分享给大家:首先,如果你有幸看到这篇文章,千万不要试图在2个小时内阅读完,就算你2个小时阅读完,我相信你也不会理解里面讲解的精华之处,我相信,你应该将此文章,慢慢品尝。这绝对是一篇需要品尝2~3天,再结合自己过往的经验,加上自己的思考,我相信会对你不仅仅是技术能力,甚至包括整体的思维方式都会有一个 非常大的提高。我写这篇文章的目的,是用本人20年的嵌入式经验呈现给大家一副完整的产品,项目开发蓝图,用本人多年经的历总结了一些教训无私的分享给各位,希望各位今后能站在本人的肩膀之上,少走弯路,多为公司,为个人多做贡献,那我的愿望就达到了,也同时希望能看到大家反馈和回复,留个脚印,留下你的见解和智慧,为后人乘凉打点基础,先在这谢谢各位了。那么由此开始我们充满知识的旅程吧,最重要的一点,就是在一个产品或项目的开发过程中,如果没有明确的目标,那么成功将无从谈起,做任何事的第一步必须明确目标。与日常生活中的大多数事务一样,设计一个嵌入式产品的过程也必须从确定目标开始,对生产的产品进行明确定义。对产品进行定义主要是对产品是什么和能有什么功能进行描述,其次是在我们的整个开发过程中,应该要撰写一些开发文档,大概的框架的如下:1)产品需求文档:描述产品的特性2)功能需求文档:描述产品必须具备的功能3)工程说明文档:描述系统实现的方法和满足需求的手段4)硬件说明文档:对有关硬件进行描述5)软件或固件说明文档:描述特定处理器下设计微程序以及固件的方法6)测试说明文档:描述必须测试的项目和验证系统正常运行的方法1.需求定义需求定义用来描述产品的基本功能,对于公司来说,需求一般由该公司的市场销售部门或该公司的主要客户来制定;而对小公司或爱好者(就像armjishu.com里的爱好者一样),技术人员可以自己负责定义需求,并撰写成文档。通常需求定义是围绕以下几个因素而来:1)系统的用途(定义需要系统实现的各种功能)2)实际输入输出是何种方式实现的(为元器件的选型做参考)3)系统是否需要操作界面(涉及软件层操作系统的选型)其实对小型的嵌入式产品来说,定义需求是非常关键的,因为需求清楚了,就可以避免后续开发过程中出现的诸如随机存储器(RAM)容量不足或所选的CPU速度不能满足处理的需要等一系列问题。下面举个简单的实际例子,供大家来参考:系统描述:用于从化温泉的水泵换水系统 电源输入:使用来自于变压器的9V~12V直流电 水泵功率:375W1)使用单相交流电机,由机械电气进行控制2)如果温泉池处于低水位,则输入开关闭合信号,以禁止水泵继续运行3)用户可以自由设置水泵运行或关闭的时间长度4)除了自动设置控制外,还需要提供一种人工装置来允许维护人员灵活控制水泵进行维修5)水泵开启/关闭/人工干预的时间可以30分钟为单位,在30分钟到23小时的范围内进行调节6)显示设备可以指示水泵的开关状态,剩余时间,以及水泵是否处于人工干预模式7)具备监视低水位的功能,并显示在屏幕上如果需要商用,那么除了上面给出的功能要求外,其设计文档中还要包括电磁干扰(EMI)和电磁兼容性(EMC)认证、安全认证以及使用环境(包括环境温度、湿度、盐雾腐蚀等)等方面的需求。实际上,以上的需求确定之后,接下来就是要考虑选择一款合适的CPU来满足和实现系统的功能,那么我们就要将上述7点用户能够理解的需求转化成我们专业领域的需求,转化如下,大家可以参考一下:a.处理或更新输入输出信号的速率究竟需要多快?解释:目前嵌入式处理器的主频一般都在几十兆到几百兆不等,单片机的主频一般是几十兆,ARM处理器可以到几百兆;我们主要看这个产品是否需要对大量数据进 行处理,或是否需要对缓冲区进行频繁操作,是否有类似的占用CPU资料的工作要做,这就决定我们要选择一款合适的处理器来让该产品得到最佳的性能。b.是否可使用单片集成电路(专用IC)或FPGA来完成数据处理?解释:如果可以的话,就不一定要选择处理器来做,用这些专业芯片就能替代c.系统是否有大量的用户输入输出操作(如对开关和显示设备进行频繁操作)?解释:如果有的话,要在处理器选型的时候考虑这些因素,选择一款能够满足以上要求的CPUd.系统与其他外部设备之间需要使用何种接口?解释:这也是需要评估处理器的一个关键问题,选择具备这些接口功能的处理器会方便于我们的电路设计以及软件编程e.设计完成后是否有可能需要进行改动,或在设计过程中系统需求是否可能出现变化?我们的设计是否能适应系统需求的变化?解释:要避免选择的处理器刚好满足当前要求,这样当以后事务要求逐渐提高,处理器性能如果还有一定空间的话,那么就可以重用目前的产品;第二个就是要选择不会即将停产的芯片,很多处理器用得很广乏,可以借鉴的资料也很多,但是很可能这款芯片已经在市场上流行很长时间了。芯片厂商已经推出更新换代的替代品了, 如果你选择了这款芯片,很可能1,2年后就买不到这款处理器芯片了,导致不得不重新选择新的处理器,重新设计产品,这样的既耗费时间,金钱,更消耗人力, 延误市场的战机。2.处理器的选择2.1.需要使用的I/O管脚数量多数处理器都是使用内存和外部管脚来控制输入输出设备的,通常处理器都会有内置ROM和RAM的,如果内置的内存就已经满足需要,那么处理器就可以节省产生引用外部存储器信号的引脚。这样处理器可为输入输出提供较多的设备管脚(某些处理器支持外部RAM或ROM的使用,但对外部存储器进行访问时,处理器一般 需要占用8条到10条I/O管脚)。还有,有些处理器带有专用的内部定时时钟,这类时钟也需要使用一个端口管脚来实现某些定时功能;某些处理器中还具有漏极输出和高电流输出能力,可以方便的直接驱动继电器或电磁铁线圈,而不再需要额外驱动硬件的支持。当对处理器I/O管脚进行计数时,我们一定要把使用处理器内部功能(如串行接口和定时器等)时限制使用的某些管脚考虑在内。2.2.需要使用的接口数量嵌入式处理器的主要功能是与应用环境中的硬件进行交互操作,这不仅需要外部硬件对接口具有实时处理能力,而且还要求处理器必须以足够快的速度对接口数据进行有效处理。举例来说,AT91RM9200是ATMEL公司出品的一款工业级ARM9微处理器,它基于ARM920T核心,处理速度可达200MIPS,同时处理器内 部配置了USB、Ethernet 、支持RS485的红外串口、IIC、SPI、SSC等输出接口,其目的是更方便的利用这些接口开发出嵌入式产品。需要注意的是,由于许多处理器具有的局限性没有在处理器技术资料中给予足够的说明,因此一定要仔细阅读处理器的指标说明。例如,在阅读资料的过程中发现,该资料可能会说明其串行接口可以在最高波特率下工作,但仔细研究该处理器的指标数据时,可能会发现并非该串口接口的所有操作模式都可以在最大波特率下运行。深入了解并明确接口要求的方法:可以自己动手编写一些程序来对接口进行实际测试,以确认某种处理器是否可以满足应用的要求;因为,确认某个处理器是否可以满足接口要求并非是一件简单的任务。2.3.需要使用的内存容量决定内存容量的大小是嵌入式产品设计过程中的一个基本步骤,如果对所需内存容量估计过高,那么我们就有可能会选择成本较高的解决方案;反之,如果低估了所需内存容量,就有可能因系统需要重新设计而导致项目不能按时完工。a.RAM 和ROM的区别:存储器分为随机存储器(RAM)和只读存储器(ROM)两种。其中ROM通常用来固化存储一些生产厂家写入的程序或数据,用于启动电脑和控制电脑的工作方式。而RAM则用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,RAM中存储的数据就会丢失。b.随即存储器(RAM)的选择:RAM容量的预测是比较直观的,我们只需把所有变量数目与所有内部缓冲区的容量以及先入先出(FIFO)队列长度和堆栈长度直接相加,就能得到所需RAM容量的总数。如果所需内存容量超出这类处理器的寻址范围,那么只能通过增加外部RAM来满足需求;然而,增加外部RAM的同时将会占用一定数量的I/O管脚来对扩展内存进行寻址,这种扩展往往会影响到处理器来实现应用的初衷。需要注意的一个问题是,某些微处理器限制RAM的使用,这种限制的目的是为了借用部分内存存储器作为内部寄存器组使用。除了以上因素外,所使用的开发语言也对所需RAM容量有一定的影响,某些效率较低的编译程序可能会占用大量宝贵的RAM空间。c.只读存储器(ROM)的选择:系统所需ROM的大小应该是系统程序代码与所有基于ROM的数据表容量之和。预测所需ROM空间容量比较困难的部分是预测程序代码的长度,解决这类问题的方法只能是随着经验的逐步积累来提高预测精度。然而,最重要的并不是精确计算程序的代码长度,而是要清楚地估算代码长度的上限。根据经验,如果80%的ROM空间被代码占用的话,那么就太拥挤了,除非能确保系统需求不会有任何变化,否则至少要为可能发生的变化保留足够的备用ROM空间。在多数情况下,我们可以试着在ROM中写入一部分程序代码,以便观察代码占用空间的情况,对于带有内部ROM的微处理器系统来说,系统程序都只能占用有限的程序存储器空间。d.经验之谈:ROM与RAM使用情况相类似,程序代码长度与所选用的开发语言有关。举例来说,使用汇编语言编制的程序要比使用C语言编制的程序占用少得多的空间。对于追求低成本的小型系统来说,一般不提倡使用高级程序设计语言;这是因为虽然高级语言在使用、调试以及维护方面来的比较容易,但同时这类语言需要占用更多的内存空间和大量的处理器时钟周期。如果开发语言选择不当,其后果可能是把一个简单、低成本的单片机系统变为一个需要使用配置若干兆字节RAM空间的64位嵌入式处理器系统。2.4.需要使用的中断数量中断的主要用途是向中央处理器通报当前发生的某类特殊事件,这类事件包括诸如定时器超时事件、硬件引发的事件等。需要强调的是,多数系统设计师经常过多地使用中断功能,实际上,中断的主要作用只是中断现行程序的执行,中断最适用于必须要求中央处理器立即提供服务的事件。在需要设计和使用中断的情况下,一定要首先确认实际需要的中断数量,然后必须考虑到系统内部占用的中断资源,如果需要使用的中断资源超出了处理器可以接收的中断数量,我们就应借助于某些特殊手段来减少所需中断信号的数量。2.5.实时处理方面的考虑实时处理是一个涉及范围很广的题目,其主要内容与系统的处理速度有密切联系,实时事件是嵌入式微处理器需要关注的主要任务。例如:处理器跟串口进行通信时,通常通过上层软件(为了保证实时性,进行任务切换的时间足够短),然后再占用处理器去执行从串口拿数据的任务,并且要保证处理器的速率比串口速率快,那么处理器可以以最快的速度反应并处理串口的相关的任务,这样就可以达到最大的实时性;另一方面,如果处理器本身就内置了串口控制器、或DMA、或LCD的控制器等,那么它就可以保证直接使用这些处理器内置的接口去控制串口、液晶屏等对象,以达到最大的实时性能。2.6.该厂商是否提供好的开发工具和环境选择一款新的处理器,很可能就要使用一个新的开发工具和开发环境,包括软件的编译环境等;对于开发日程安排比较紧张的项目来说,开发人员往往无法抽出专门的时间来研究,熟悉新的开发工具,从而也无法全面掌握开发工具的使用技巧。并且,有的开发工具价格也比较昂贵,而且很可能只能从制造商那里购买,还有仿真工具也是需要付费的,这些对我们在选择一款处理器的时候,是都应该考虑进去的成本因素。2.7.处理器速度方面的考虑主要考虑几个细节问题:1)处理器速度与处理器时钟之间的关系例:单片机8031为例,由该处理器可以适应12MHz频率的输入时钟,因此就可以认为它是一个速度为12MHz的处理器了吗?不是,实际上,由于该处理 器内部逻辑电路执行每条指令需要多种不同频率的时钟脉冲,因此该处理器内部时钟电路要对输入的12MHz时钟12分频处理;最终为处理器提供的只是 1MHz主频。有的时候,80MHz主频的处理器(80MHz输入时钟,80MHz执行速度)要比200MHz主频的处理器(200MHz输入时钟,50MHz执行速度)执行速度要快得多。2)处理器指令系统如果不需要执行复杂数学运算的应用,那么RISC指令集的处理器要快;如果执行比较复杂的操作,则CISC指令集的处理器速度要更快。3)芯片结构体系现在有的芯片是将多个不同功能的核封装到一个芯片IC中,定制某种特定的功能,比如DSP,其中包括用于实现数字解码、乘法运算的硬件乘法器和移相器等。然而,这类处理器也由其自身局限,往往在执行某些普通操作之前必须要使用额外的指令来把RAM中的数据放入内部寄存器,相比之下,一般处理器只允许对 RAM中的数据进行直接访问。2.8.只读存储器(ROM)的选择多数工程项目在其开发阶段一般使用可擦写可编程只读存储器(EPROM)或快速存储器(Flash Memory);这类可擦写可重复写入存储器的主要优点是可多次使用。一旦产品研制完毕,就可以用一次写入设备(OTP)来取代EPROM存储器,一次性 写入器件的外观与封装几乎与EPROM完全一样,惟一不同之处就是其表面没有擦出窗口,并且价格要比EPROM低很多。但是,另外一种情况,如果该产品今后需要升级固件,或在线编程,那么我们还是应该选择可擦写可编程的存储器。还有一种是非易失的存储器,例如制造一台电视机,就有可能需要该设备具有记忆上次观看最后一个频道的功能,即使在切断电源后,该频道信息也不会丢失。总结:所以,根据不同的产品选择不同的存储器也是一门很讲究的学问。2.9.电源的要求在某些设计中方案中,电源根本不存在问题,对电源唯一的要求就是可以为电路正常供电;实际上,选择电源主要要考虑三个方面的问题:1)要注意设计方案中是否对电源的供电方式有所限制,例如,是否像大多数家用电器那样需要使用屋内墙上的电源插座供电,或是是使用USB接口供电2)看系统是否需要使用电池供电方式,如果这样,我们就要考虑选择那种对驱动电流要求不高的处理器,然后再为其选择合适的电池。3) 休眠电流:许多微处理器都支持低功率运行模式,在这种模式下,系统的CPU处理器将处于休眠状态,同时所有外部设备的电源供电都被暂时切断,以便减少系统的电能消耗。某些微处理器在这种方式下需要的维持电流极小,但也有一些微处理器在这种方式下并不能节省多少功率;不管怎样,我们都要对系统在节点模式下的 工作时间有一个估测,以便对具体情况选择使用的电池。总之,无论哪种情况,我们都要对系统需要的供电总功率做到心中有数。2.10.设备工作环境的要求环境要求主要内容是考虑温度,湿度等;如果系统必须在温度范围较大的环境下运行,诸如用于军事设备或汽车的控制系统,那么处理器可选择的范围就要小得多;并且由于大范围温度变化的设备通常比较昂贵,因此在设计过程中就不能再根据一般工业级器件的价格来制定预算。2.11.使用周期成本如果我们的产品是mp3,在一般情况下,可以不必考虑在用户现场对mp3程序进行修改的问题,也不用为是否可以得到设备备件而着急,这是因为mp3是一种消费产品;换句话说,如果我们的产品是价值几万块的工业设备并且需要常年不断地运行,那么我们在产品设计过程中就必须从长计议了:a.首先,我们需要选择一种处理器或存储体系结构都可以升级的器件b.考虑到程序升级的可能,我们还要选择较大容量的内存c.最后要注意的则是所选处理器是否可以长期供货,这一点的重要性远远大于处理器的价格除了上面的考虑之外,使用周期成本也是在设计之初要考虑的因素。总的来说,生产的部件越多,则可以接受的前期开发成本也就越大。如果产品是mp3,我们可能会选择一个低价微处理器,同时投入一大笔钱来开发控制mp3的软件。但 如果我们的产品是价格昂贵的工业用设备,那么在产品的使用期内,该设备的销售量将只有几百台,毫无疑问,开发这种产品最重要的就是降低开发成本(降低开发成本而不是硬件成本!!!);除此之外,工业产品的成本也不像家用电器或消费电子产品那么敏感。综上所述,开发工业产品当然要选择一种便于进行开发并且有 助于缩短开发过程的处理器。2.12.处理器相关资料是否丰富如果该款处理器在市场上已经用得很广了,那么我们可以获取更多的相关资料,观察人家的产品是如何使用处理器的,也能在网络上找到不少的相关的设计资料以及相关技术主题,这样就进一步降低了技术门槛,确保了使用该处理器做产品可行性,减低了风险;反之,如果是厂商全新推出的处理器,因为市场上还没有可以借鉴的产品,我们就只能从全英文的芯片手册开始阅读,了解这款芯片,这样开发周期不仅变长,而且不可预知的风险也很大。3.开发成本的预测和估计大多数项目或产品都有专人负责预测整个过程的开发成本,对于任何项目来说,其开发成本主要包括人力和材料开销。预测开发成本在很大程度上需要根据经验,这也是为什么大型公司一般指定有经验的高级工程师来完成这一任务的原因,除了人力和材料的开销之外,总结下来,还有以下的开销:1)人力成本(开发人员、管理人员、销售人员、其他行政等辅助人员)的开销2)材料(硬件物料和损耗,有时候需要投几次PCB版才把产品稳定下来)的开销3)开发系统和开发工具软件的开销4)硬件工具的开销(例如示波器、仿真器等)对于整个项目来说,上述的开销将直接可能导致产品成本增加,其中人力成本最为关键,尤其是在中国,呵呵4.产品开发设计文档(需要包括硬件和软件两个方面)4.1 硬件文档撰写思路1)首先是需求定义或产品规格:如果这些是产品最终目标的话,那么产品对硬件和软件的要求就是技术方案的最终目标;对硬件和软件的要求是从定义用户界面和系统功能开始的。2)其次,根据需求,系统整体定义文档中给出硬件接口的具体定义:定义硬件最有效的方法是从需求开始描述,由于硬件必须支持系统定义的所有功能,因此硬件定义是与系统说明不可分割的;例如,我们设计一个定时器(事先需求说明定时器不能与个人电脑连接,故无法使用CRT显示时间),我们只有两种选择:一种是使用发光二极管(LED),另 一种是使用液晶显示器件(LCD)。尽管LCD的显示效果比较好,但考虑到定时器要常年位于户外,并且早期LCD显示器不能在低温下工作,最终还是选择 LED设备(这整个过程描述了我们硬件选型时的一个思路,这个是密切跟需求挂钩的 )3)一旦完成了系统整体说明文档,就开始进行系统设计:首先要对硬件说明的内容进行细化,包括添加能让工程师理解的设计意图,以及软件工程师围绕硬件进行程序设计时需要使用的硬件信息等。完成硬件电路板说明文档后,我们还要在该文档中增加一个用来描述系统的原始要求的前言部分,包括说明方案的设计思路和方法,除此之外,还要附上软件工程师用来对硬件进行控制所需的各类信息,这类信息主要包括如下内容(软件工程所需信息):内存和I/O端口地址(如果需要,还可以提供内存映射图)可用内存容量状态寄存器每一位的定义每个端口管脚的用途外部设备的驱动方法(例如,说明输入定时器电路的时钟频率等)其他有管软件人员设计程序需要了解的信息对于比较复杂的系统来说,硬件文档中经常使用两个独立的部分来进行说明;其第一部分用来描述硬件指标和工作原理,第二部分则主要为软件人员提供程序设计需要的信息。4.2 软件文档撰写思路(1) 软件文档与硬件文档的组织方法类似,软件要求文档的主要内容则是定义软件要实现的功能;一种是在简单项目设计过程中,软件定义也可以只对一种电路板使用的软件给予描述;对较复杂的项目来说。由于参与这种项目的软件人员分别负责设计驱动不同硬件部分的代码(同一电路板),因此每个软件人员可能会为自己的设计 代码指定不同的定义,这类软件说明需要提供下列的内容:论述包括需求定义、工程指标、硬件参数等实施项目需要的内容说明软件之间、处理器之间或处理器与其内部器件之间使用的通信协议:其内容应包括对缓冲区接口机制、命令/应答协议、信号控制等协议的具体说明。借助流程图、伪代码或者其他可能的方法来描述软件的实现方法和过程(2)软件与硬件所考虑的不同之处(此经验方便技术总监或其他相关管理者参考,因为无论是多高深的技术管理者,要么是硬件出身,要么是软件出身,要么就是非技术出身 )a. 软件的灵活性远远大于硬件,要让软件人员搞清楚某个软件的内部格式是非常困难的任务,解决的办法:详细定义其他程序员需要了解的编程接口具体内容,以及其他工程人员在实施开发项目过程中需要使用的技术细节信息。b. 软件工程师只有在收到硬件说明文档后,才有可能知道如何对系统硬件进行操作;而硬件人员一般不需要了解软件程序的技术细节。c. 由于软件易于更改,因此程序内容经常会按销售人员提供的要求发生变更,在某些情况下,软件文档的内容无法及时反映程序的最新变化。d. 软件经常是工程项目最后完成的部分,因此其文档也经常因时间不够而欠缺完整。实际上,软件文档是否详细、完整,在某种程度上是与公司或客户的要求有关的。例如,军事或国家工程一般要求开发商就其所有软件实现的功能提供全面详细的文档e. 有个潜规则,对软件的要求越复杂,则需求的正确可能性就越小,这个是经验之谈了,我们需要把准需求这个准绳来做文章,而不是陷入个人主义以及对软件要求而凭空发挥自己不切实际的想象。f. 我们可以先硬件设计,接着围绕该硬件编制软件。虽然实际系统的实现过程可能是软硬件并行开发,但软件人员基本上也是围绕着已经实现的硬件来进行程序设计的;对于更为复杂的系统来说,开发过程可能会出现重复。例如,某个项目的硬件工程师和软件工程师可能会坐下来开会,共同决定使用哪种硬件来实现某种功能;软件人员可能提出需要为数据缓冲区口冲内存容量,也可能要求提供某种外部设备接口,以便充分利用现成接口程序提供的各种驱动代码。总的来说,必须在提高软件开发效率与硬件系统的复杂性与成本之间进行权衡.5.嵌入式高手对技术的理解(含辛茹苦这么多年的精华体验)有很多人认为:嵌入式系统性能的核心因素是软件功能,其实,如果按照这种逻辑,系统设计中存在的问题就应由软件人员来负责。其实这个观点实际上反映了设计嵌入式产品时如何考虑划分硬件和软件各自应实现的功能,也就是这个功能是软件实现,还是考虑用硬件来实现(硬件实现:需要购买处理该功能的硬件芯片,从而增加成本;软件实现:无需增加硬件成本,但会占用处理器以及内存的资源)。例如:我们在这里设计的基于ARM的mp3嵌入式产品,我们可以使用专业的解码芯片来负责mp3音乐文件的解码和播放功能,也可以使用另一种方法来解码mp3语音文件,让ARM处理器利用软件控制寄存器来驱动耳机或音响,处理器通过对mp3语音文件解码之后再将解码后的数据流按照一定协议格式送给音频输出的硬件接口进行播放。优点:这种方案在硬件方面节省了一个器件,降低了成本,并且该功能还方便调试(因为是软件实现的)。缺点:从另一个角度来看,虽然节省了一块语音解码芯片,但同时要在三个方面增加成本。首先,要在程序中增加语音协议解码的代码;其次,可能要把增加ROM来存放语音解码的协议,这样可以增加速度;最后,运行该程序将占用处理器的时间和资源。其实,话又说回来,对于本案例来说,上述成本的节约并不会引发任何问题,包括驱动程序增加也只需少量的,我们讨论这个mp3产品的案例的目的在于说明如何对软件硬件的功能进行合理划分。总的来说,交给软件实现的功能越多,则产品的成本就越低,当然这就要处理器必须有足够的处理速度和内存空间来实现设计指定的功能;常言说得好,天下没有免费的午餐。把功能分配给软件来实现,会增加软件的复杂性、开发时间、以及程序的调试时间;然而,随着处理器的处理能力的不断提高,可以预见,越来越多的功能 将会由软件来实现。虽然在软件中实现各种功能会增加开发成本,但如果把功能移植到硬件中实现,则会增加产品的成本,这类开销是在构造每个系统组件时不可避免的。在低成本设计方案中,增加任何额外的硬件都会对产品成本产生显著的影响,因此软硬件功能划分就是一个决定产品成本的大问题。在诸如大众消费产品这一类对成本非常敏感的设计方案中,一般都会把无法通过软件实现的功能排除在外的。来源:http://www.armjishu.com/bbs/viewtopic.php?id=1312本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

    嵌入式大杂烩 嵌入式

  • 经验分享 | 大家是怎么来选择技术书籍?选书和看书的经验分享!

    大家好,我是ZhengN。我们今天不分享技术文章,给大家分享一篇关于选书与看书的经验分享的文章。我们每个人的精力都很有限,不可能把所有相关书籍都学过一遍,选择适合自己的书籍可以让我们的学习达到事半功倍的效果。下面我们一起来看道哥是怎么来选书与读书的:一、前言 前几天有同事过来,让我推荐一本 Linux 系统的书籍。我就问他 2 个问题:你想学习 Linux 哪一个层次:内核层?驱动层?应用层?你的目标是什么:是学习 Linux 系统的设计架构?某个模块的驱动开发?还是仅仅想系统学习一下应用程序编程?最后,给他推荐了下面这本书:后来我又想了一下自己的选书、读书过程,索性总结一下,给需要的小伙伴参考一下。目的是抛砖引玉,如果您有更好的实践方法,还请多多分享!二、选书 1. 重视选书的过程在现在的市场上,无论是哪个领域的技术书籍,都是一抓一大把,其中就一定存在质量、讲解水平参差不齐的情况。我们作为学习者来说,一定要擦亮眼睛,多花一点时间来选书,要重视选书这个过程。如果随便选了一本书,学习到一半的时候才发现内容不对自己的胃口,那就是在浪费时间、浪费生命。如果在刚开始就能够花点心思和时间,学习起来能进入心流的状态,对于个人的知识理解绝对是事半功倍的效果。换句话说,选书的时间绝对不能节省。2. 如何选书我一般选书的途径有三个步骤:Step1:广撒网根据想看的技术主题,在 google 搜索引擎中,搜索相关的关键字。有时候我会特意加上 CSDN、知乎等关键字,这两个平台中,推荐的技术性书籍质量都是比较高的。另外,需要注意推荐者的一些背景资料,你可以浏览一下他的一些文章,从文章内容中如果能判断出作者的专业深度、广度都比较厉害,那么他的推荐权重就比较高。基本上看了十几篇推荐文章,就可以梳理出这个技术主题排名靠前的几本书了。Step2:看评价针对梳理出来的几本书,到豆瓣、当当网上找一下对这几本书的评价。咱们都知道,现在的购物网站上刷好评的比较多,但是好在对于书籍这样的商品,我感觉刷单的很少,也就是说别人对一本书的评价,基本上可以认为是客观的、基于事实的。大家一般都会从书籍的覆盖范围、难易程度、自己从中的收获,这几个角度来对一本书进行评价。在这个步骤中,我们就可以对基本候选的书籍在心中有个分数的排序。注意这个排序不是绝对的按照内容的深浅,而是根据自己的专业水平,来确定哪一本书与目前的自己最匹配。这个时候千万不要高估自己,选择最难的那一本,如果这么做了,不仅仅是浪费时间的问题,更重要的是会导致自己一知半解、严重打击自信心。经过这个步骤之后,其实已经能够决定要买哪一本书了。如果排在第一和第二位置的这两本书,在我的心中评分差距比较大,我会直接选择评分最高的第一本书。如果它俩感觉差不多,那么我会继续下一个步骤,翻一翻样张,看哪一本书的风格更适合自己的胃口。我之前在学习 C 的时候,下面这两本书最后作为候选:后来在搜索对它俩的评价时发现,第一本书的理论性更强一些,而当时我的主要目的就是系统的把 C 11 版本的语法掌握好,因为脑袋里理解的 C 已经快变成老古董了,11 版本中的很多语言让 C 几乎快变成一门新的语言了。第一本书与我的目的更匹配,所以我就选择了这一本。Step3:对胃口在很多卖书的网站上,都会提供目录以及一些样张;如果找不到,那就搜索一下是否可以找到 PDF 文件来浏览一下。主要的目的就是看作者的写作风格是否对自己的胃口。两本难分伯仲的书籍中,选择自己喜欢的风格,学习起来也会更带劲一些,因为情绪的力量是无法估计的。注意:不要贪多,只要以其中的一本作为精读的教程就可以了。如果两本你都喜欢,可以都买回来,以其中的一本为主要学习目标,其他作为交叉参考。另外,我个人还有一个感觉比较不错的选书途径,那就是 B 站的视频评论区。现在的 B 站,真的是如日中天,从中年油腻大叔到各种二次元,都可以在这里找到自己感兴趣的视频内容。而且 B 站也是我们技术开发人员的福地:越来越多的高质量视频课程都可以找得到,例如:李治军老师的操作系统,侯捷老师的 C ...在看这些视频的时候,你不妨多看一眼后面的评论,与这个视频相关的其他视频、书籍、博客等等,都有可能被推荐,而且推荐的内容质量一般都比较高。3. 电子书 or 纸质书每个人的看书习惯都是不同的,有些人喜欢看视频教程,有些人喜欢看 PDF 电子书,有些人喜欢看纸质书籍,每一种都各有优缺点。我看书比较喜欢做笔记,如果是 PDF,就在学习过程中画思维导图;如果是纸质书籍,我就会在书上写写画画、记录自己的理解。根据个人的经验,如果是很厚的书籍(超过 500 页),我会尽量选择纸质书。因为在学习的过程中,难免会回过头去参考前面的内容,用纸质书籍就比较方便了,只要记住页号,或者放一些书签,很快就可以找到。如果是 PDF 的话,那么得用鼠标下拉、滚动多次才能定位到前面的内容,很不方便,特别是需要多次来回参考的时候。如果只能选择 PDF 的话,那么就推荐你多用一些屏幕截图工具来帮助你阅读,例如:Snipast、Quicker,我之前推荐过第一款软件,的确很好用,特别是在看文章、写代码的时候。三、读书 1. 不要怕弄脏书我是比较喜欢买二手书籍的,有的时候买回来一看,除了前几张有少许的划线和笔记之外,其他部分就跟新书一样,真的是糟蹋了一本好书。但是到了我手里之后,如果是作为精读教材的,我大概率会把这本书弄得“满目疮痍”。这不是说不爱惜书本,只有做了大量笔记之后,才能记录下自己的学习过程。如果认为某一本书是经典想收藏,那完全可以买 2 本,一本用来学习,另一本用来收藏。下面这张图是 C Primer 里的涂鸦,这算是很整洁的了(请忽略丑陋的字体):2. 消灭模糊性、不确定性在学习的过程中,如果是已经理解的部分就快速读过去;如果是经过自己的思考之后,才理解的部分,就把思考过程中的关键节点信息记录下来;如果自己思考之后还是不理解,这时候千万不要放过自己,除了这本书之外,还可以求助谷歌、求助其他相关书籍。我个人的经验是这样子:如果某一个知识点总是模棱两可,没有一个确定的理解,总是感觉如鲠在喉。如果经过查找其他资料之后,仍然不能得到让自己信服的理解,那么我就会按照其中可能性最大的那个方向去理解。随着学习的深入,当发现这个强加给大脑的理解,与其他的知识点矛盾的时候,再回过头来对各种可能性进行再次梳理。经过这样的几个来回,就可以把那些模糊性彻底消灭掉。3. 一定要做笔记不知道你是否有这样的体验,在看书的时候,眼睛对大脑说:嗯,这部分内容我掌握了。但是如果让你立刻离开书本,你的手可能又会对大脑说:我写不出来。做笔记就是强化自己的理解过程,某些知识点现在可能理解了,但是过一段时间极有可能又忘记了。有些人说书要越读越薄,也有人说书要越读越厚,这其实是从不同的角度来看的。对于我来说,做笔记就是一个让书越来越薄的过程。在第一遍看书的时候,可能有 50% 的内容是已经理解的,剩下 40% 的内容是经过自己思考之后理解的(这部分的笔记是重点),余下的 10% 是仍然没有理解的。那么在第二遍看书的时候,就可以重点看自己的笔记了,把 40% 经过思考后理解的部分再次复习一遍,加深印象,这样就相当于书本变薄了一半。如果以后还想看第三遍,很可能就只剩下 1/3 -- 1/4 的内容是需要看的,这个时候,你就可以明显的感觉到自己在进步,有很强的成就感。下面是在学习 Linux 内核内容时做的笔记,以后当我想再复习的时候,只要看这些小卡片就可以了。4. 怎么确认自己真的懂了首先,你可以参照解 bug 时的“小黄鸭调试法”,把书本上的内容讲给自己听。注意:是用嘴巴说出声音来给自己听,而不是在大脑里自言自语。其次,把自己理解的过程总结成文章,这应该是更好的方式。别人通过阅读你的文章,从不理解变成理解了,那就说明你自己是真的懂了。以上就是我个人的一些学习心得,希望能够对您有一丝丝的帮助。最后还有一句话送给你:欲速则不达!

    嵌入式大杂烩

  • 包邮免费领EMC畅销书!88个案例不要太够用!

    EMC设计的第一道门槛就是EMC测试,EMC测试的标准中给出了明确的干扰源、接收源等模型,因此,谈论EMC设计技术与方法,需要建立在EMC测试原理的基础上。但是目前在国内市场上,大部分的EMC书籍存在的一个共同缺陷就是设计与测试脱节。所以本次免费送书活动,给大家推荐一本业界口碑甚好的工具书——《EMC电磁兼容设计与测试案例分析(第3版)》这本书紧密结合EMC测试实质、EMC设计原理及具体产品设计,来讲述EMC设计方法,实践性与理论性高度结合。价值¥98,2800 好评下拉可查看相关书籍介绍扫描下方海报二维码,回复 电磁兼容 免费领书!(顺丰包邮)网友书评    案例与时俱进适合初学者  深入浅出  经典内容简介    本书以分析EMC案例分析为主线,通过案例描述分析,介绍产品设计中的EMC技术,向读者介绍产品设计有关EMC的实用设计技术与诊断技术,减少设计人员在产品的设计与EMC问题诊断中的误区。所描述的EMC案例涉及结构、屏蔽与接地、滤波与抑制、电缆、布线、连接器与接口电路、旁路、去耦与储能、PCB layout还有器件、软件与频率抖动技术各个方面。作者简介    郑军奇,知名EMC专家,长期从事EMC理论与工程研究,具备丰富的EMC实践和工程经验。他是“EMC设计风险评估法”的创始人,多项国家EMC标准的主要起草人,“EMC设计风险评估法”将产品的EMC设计提升到了方法论阶段,被广大企业的研发部门所采纳。他又是专业的EMC讲师及高校特聘教授,具有数百场EMC培训经验,受到企业与学员的高度评价,是中国EMC工程应用领域培训领跑者。同时,他也是:·CISPR(国际无线电干扰特别委员会)副主席;·全国无线电干扰与标准化技术委员会秘书长;·工信部国家信息技术紧缺人才认证(NITE)讲师。目录    第1 章 EMC 基础知识及EMC 测试实质 (1)1 1 什么是EMC  (1)1 2 传导、辐射与瞬态 (2)1 3 理论基础 (3)1 3 1 时域与频域 (3)1 3 2 电磁骚扰单位分贝(dB) 的概念 (4)1 3 3 正确理解分贝真正的含义 (5)1 3 4 电场、磁场与天线 (8)1 3 5 RLC 电路的谐振 (14)1 4 EMC 意义上的共模和差模 (17)1 5 EMC 测试实质 (18)1 5 1 辐射发射测试实质 (18)1 5 2 传导骚扰测试实质 (21)1 5 3 ESD 抗扰度测试实质 (22)1 5 4 辐射抗扰度测试实质 (23)1 5 5 共模传导性抗扰度测试实质 (25)1 5 6 差模传导性抗扰度测试实质 (27)1 5 7 差模共模混合的传导性抗扰度测试实质 (27)第2 章 产品的结构构架、屏蔽、接地与EMC  (28)2 1 概论 (28)2 1 1 产品的结构、构架与EMC  (28)2 1 2 产品的屏蔽与EMC  (29)2 1 3 产品的接地与EMC  (30)2 2 相关案例分析 (31)2 2 1 案例1:PCB 工作地与金属壳体到底应该关系如何 (31)2 2 2 案例2:接地方式如此重要 (33)2 2 3 案例3:传导骚扰与接地 (37)2 2 4 案例4:传导骚扰测试中应该注意的接地环路 (41)2 2 5 案例5:屏蔽体外的辐射从哪里来 (44)2 2 6 案例6:“悬空” 金属与辐射 (46)2 2 7 案例7:伸出屏蔽体的“悬空” 螺柱造成的辐射 (49)2 2 8 案例8:屏蔽材料的压缩量与屏蔽性能 (52)2 2 9 案例9:开关电源中变压器初、次级线圈之间的屏蔽层对EMI 作用有多大 (55)2 2 10 案例10:金属外壳接触不良与系统复位 (60)2 2 11 案例11:静电放电与螺钉 (61)·Ⅸ·2 2 12 案例12:怎样接地才有利于EMC  (62)2 2 13 案例13:散热器形状影响电源端口传导发射 (66)2 2 14 案例14:金属外壳屏蔽反而导致EMI 测试失败 (70)2 2 15 案例15:PCB 工作地与金属外壳直接相连是否会导致ESD 干扰进入电路 (75)2 2 16 案例16:是地上有干扰吗? (81)第3 章 产品中电缆、连接器、接口电路与EMC  833 1 概论 833 1 1 电缆是系统的薄弱环节 833 1 2 接口电路是解决电缆辐射问题的重要手段 833 1 3 连接器是接口电路与电缆之间的通道 843 1 4 PCB 之间的互连是产品EMC 的薄弱环节 853 2 相关案例 873 2 1 案例17:由电缆布线造成的辐射超标 873 2 2 案例18:屏蔽电缆的“Pigtail” 有多大影响 893 2 3 案例19:屏蔽电缆屏蔽层是双端接地还是单端接地? 923 2 4 案例20:为何屏蔽电缆接地就会导致测试无法通过? 943 2 5 案例21:接地线接出来的辐射 973 2 6 案例22:使用屏蔽线一定优于非屏蔽线吗 993 2 7 案例23:塑料外壳连接器与金属外壳连接器对ESD 的影响 1053 2 8 案例24:塑料外壳连接器选型与ESD  1073 2 9 案例25:当屏蔽电缆的屏蔽层不接地时 1083 2 10 案例26:数码相机辐射骚扰问题引发的两个EMC 设计问题 (110)3 2 11 案例27:为什么PCB 互连排线对EMC 那么重要 (116)3 2 12 案例28:PCB 板间的信号互联是产品EMC 薄弱的环节 (123)3 2 13 案例29:环路引起的辐射发射超标 (125)3 2 14 案例30:注意产品内部的互连和布线 (128)3 2 15 案例31:信号线与电源线混合布线的结果 (129)3 2 16 案例32:电源滤波器安装要注意什么 (132)第4 章 通过滤波与抑制提高产品EMC 性能 (136)4 1 概论 (136)4 1 1 滤波器及滤波器件 (136)4 1 2 防浪涌电路中的元器件 (140)4 2 相关案例 (145)4 2 1 案例33:由Hub 引起的辐射发射超标 (145)4 2 2 案例30:电源滤波器的安装与传导骚扰 (149)4 2 3 案例35:输出端口的滤波影响输入端口的传导骚扰 (152)4 2 4 案例36:共模电感应用得当, 辐射、传导抗扰度测试问题解决决 (156)4 2 5 案例37:电源差模滤波的设计 (158)4 2 6 案例38:电源共模滤波的设计 (162)4 2 7 案例39:滤波器件是否越多越好 (168)·Ⅹ·4 2 8 案例40:滤波器件布置时应该注意的事件 (172)4 2 9 案例41:信号上升沿对EMI 的影响 (175)4 2 10 案例42:如何解决电源谐波电流超标 (177)4 2 11 案例43:接口电路中电阻和TVS 对防护性能的影响 (179)4 2 12 案例44:防浪涌器件能随意并联吗 (186)4 2 13 案例45:浪涌保护设计要注意“协调”  (188)4 2 14 案例46:防雷电路的设计及其元件的选择应慎重 (190)4 2 15 案例47:防雷器安装很有讲究 (191)4 2 16 案例48:如何选择TVS 管的钳位电芯, 峰值功率 (193)4 2 17 案例49:选择二极管钳位还是选用TVS 保护 (196)4 2 18 案例50:单向TVS 取得更好的负向防护效果 (198)4 2 19 案例51:注意气体放电管的弧光电压参数 (201)4 2 20 案例52:用半导体放电管做保护电路时并联电容对浪涌测试结果的影响 (207)4 2 21 案例53:浪涌保护电路设计的“盲点” 不可忽略 (210)4 2 22 案例54:浪涌保护器件钳位电压不够低怎么办? (212)4 2 23 案例55:如何防止交流电源端口防雷电路产生的起火隐患 (214)4 2 24 案例56:铁氧体磁环与EFT/ B 抗扰度 (220)4 2 25 案例57:磁珠如何降低开关电源的辐射发射 (222)第5 章 旁路和去耦 (226)5 1 概论 (226)5 1 1 去耦、旁路与储能的概念 (226)5 1 2 谐振 (227)5 1 3 阻抗 (230)5 1 4 去耦和旁路电容的选择 (231)5 1 5 并联电容 (232)5 2 相关案例 (233)5 2 1 案例58:电容值大小对电源去耦效果的影响 (233)5 2 2 案例59:芯片电流引脚上磁珠与去耦电容的位置 (237)5 2 3 案例60:静电放电干扰是如何引起的 (241)5 2 4 案例61:小电容解决困扰多时的辐射抗扰度问题 (244)5 2 5 案例62:金属外壳产品中空气放电点该如何处理 (245)5 2 6 案例63:ESD 与敏感信号的电容旁路 (247)5 2 7 案例64:磁珠位置不当引起的浪涌测试问题 (249)5 2 8 案例65:旁路电容的作用 (251)5 2 9 案例66:光耦两端的数字地与模拟地如何接 (253)5 2 10 案例67:二极管与储能、电压跌落、中断抗扰度 (256)第6 章 PCB 设计与EMC  (262)6 1 概论 (262)6 1 1 PCB 是一个完整产品的缩影 (262)6 1 2 PCB 中的环路无处不在 (262)·Ⅺ·6 1 3 PCB 中必须防止串扰的存在 (263)6 1 4 PCB 中不但存在大量的天线而且也是驱动源 (263)6 1 5 PCB 中的地平面阻抗与瞬态抗干扰能力有直接影响 (264)6 2 相关案例 (265)6 2 1 案例68:“静地” 的作用 (265)6 2 2 案例69:PCB 布线形成的环路造成ESD 测试时复位 (270)6 2 3 案例70:PCB 布线不合理造成网口雷击损坏 (274)6 2 4 案例71:共模电感两边的“地” 如何处理 (275)6 2 5 案例72:PCB 中铺“地” 和“电源” 要避免耦合 (278)6 2 6 案例73:数/模混合器件数字地与模拟地如何接 (283)6 2 7 案例74:PCB 布线宽度与浪涌测试电流大小的关系 (286)6 2 8 案例75:如何避免晶振的噪声带到电缆口 (289)6 2 9 案例76:地址线噪声引起的辐射发射 (291)6 2 10 案例77:环路引起的干扰 (294)6 2 11 案例78:PCB 层间距设置与EMI  (299)6 2 12 案例79:布置在PCB 边缘的敏感线为何容易受ESD 干扰 (303)6 2 13 案例80:减小串联在信号线上的电阻可通过测试 (306)6 2 14 案例81:数模混合电路的PCB 设计详细解析案例 (308)6 2 15 案例82:晶振为什么不能放置在PCB 边缘 (321)6 2 16 案例83:强辐射器中下方为何要布置局部地平面 (325)6 2 17 案例84:接口电路布线与抗ESD 干扰能力 (327)第7 章 器件、软件与频率抖动技术 (330)7 1 器件、软件与EMC  (330)7 2 频率抖动技术与EMC  (331)7 3 相关案例 (331)7 3 1 案例85:器件EMC 特性和软件对系统EMC 性能的影响不可小视 (331)7 3 2 案例86:软件与ESD 抗扰度 (333)7 3 3 案例87:频率抖动技术带来的传导骚扰问题 (334)7 3 4 案例88:电压跌落与中断测试引出电路设计与软件问题 (340)附录A EMC 术语 (341)附录B 民用、工科医、铁路等产品相关标准中的EMC 测试 (343)附录C 汽车电子、电气零部件的EMC 测试 (359)附录D 军用标准中的常用EMC 测试 (377)附录E EMC 标准与认证 (398)·Ⅻ赶紧扫下方海报的二维码,回复 电磁兼容 免费领书吧!【顺丰包邮】活动真实有效,如有疑问,欢迎联系图图咨询哦~↓↓↓↓给图图发送关键字“电磁兼容”可入电子电器工程师交流群哦!END  中国电研丨CVC威凯

    8号线攻城狮 EMC

发布文章