您当前的位置:网站首页>少儿街舞,放下成见,本来嵌入式程序员如此“妖娆”!,北京景点

少儿街舞,放下成见,本来嵌入式程序员如此“妖娆”!,北京景点

2019-04-17 15:11:34 投稿作者:admin 围观人数:311 评论人数:0次

你不知道的入式程序员!

作者 | Per Knytt

译者 | 弯月

责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:

寄存器!示波器!胡子! 串口! C! 循环剃须!胡子!中止!汇编!等等,我刚刚说到胡子了吗?

假如我说到“嵌入式程序员”一词,咱们职业中的大多数人都会马上想起一个英豪人物的形象。

一个具有奥秘技能的巨大开发人员,有着广博的奥秘学的常识,对个人卫生的概念持半信半疑的情绪,面部胡子拉碴,像神相同的形象。

可是,在秘密地研讨了几年这个主题之后,我在这里通知你,你们的幻想通通不正确。

大多数嵌入式程序员都没有胡子,做嵌入式程序员也不必连做梦都要运用汇编言语,而且嵌入式程序员也会洗澡。

我还能够通知你嵌入式编程十分风趣,收成颇丰,且赋有挑战性。假如你对本文感兴趣,那么有或许将来你也会从事这一行。

请留意,以下内容或许有点雄心壮志。我会介绍嵌入式程序应有的姿态,而不是大多数嵌入式程序实践的姿态。

这或许是一种抱负的状况。忽然偶遇嵌入式代码,你或许觉得十分吓人,觉得这些代码都是一些聪明的家伙写的高端代码。

但我想要通知你,你会对Spotify的嵌入式编程感兴趣,而优异的代码正是咱们的奋斗目标。

所以,假如你也是一个嵌入式程序员,那么或许本文中介绍的代码与你每天运用的有收支,我了解你的心境,实践的确如此,但日子能够愈加夸姣。

首要,咱们来介绍一下嵌入式体系编程与嵌入式运用程锡纸序编程之间的差异。

嵌入式体系编程:或许便是你幻想中的嵌入式编程。

包括让嵌入式硬件渠道正常运转所触及的全部作业:编写设备驱动程序,引导少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点加载程序,移植或编写操作体系,各种位操作,还要考虑到时钟周期问题。调试丢掉的中止。

一连盯着示波器几个小时,抱怨编译器,厌烦中止操控器,就似乎它是一个人相同。时常在午夜吵醒,盗汗淋漓,尽力压服自己是猫偷走了中止信号的正面。不好意思,我跑题了。嵌入式体系编程的确涉空间美食之秀丽餐厅及十分底层的东西。

嵌入式运用莲花争霸程序编程:指的是为资源有限的体系编写运用程序的技能。这种开发更简略,开发环境很好。

还能够在台式核算机上编写、测验和调试代码。尽管有些束缚或许很具挑战性,可是你无需考gv在线虑汇编、GPIO引脚或DMA描述符。

可是,你有必要考虑内存的运用状况,运转环境,代码的巨细和可移植性。但说真的,莫非有姐姐妹妹站起来电影人不喜爱这些作业吗?

本文评论的是嵌入式运用程序编程,在Spotify咱们大部分时刻从事的都是这种类型的嵌入式编程。

精约之美

束缚让咱们的日子变得愈加风趣。

与完好的管弦乐队录制的专辑比较,只用两根柱子和一杯水录制的音乐专辑需求更多的创造力。

尽管我对创造力或对“音乐”一词有着十分规的了解。可是,我想表达的是嵌入式编程很风趣,可是风趣在哪儿呢?

大多数嵌入式程序的首要束缚要素是巨细,代码有必要紧凑,常见的编程习气(代码需求模块化,易于保护和测验,还要经过测验)依然适用于嵌入式程序,除此之外还需求将代码量降到最低,而且还需求确保自给自足。

用一个归纳便是:高雅。杰出的嵌入式代码十分高雅。

那么什么是嵌入式编程呢?什么是嵌入式程序员?让咱们持续往下看……

内存的运用率——躲藏的杀手

嵌入式程序员需求避开现代内存办理的概念。你简直不或许完结废物搜集。一个废物搜集器或许就耗尽了代码容量的约束。

而且废物搜集器还需求不时地运转实践的废物搜集,这会损坏嵌入式程序的实时效果。

你乃至还需求防止惯例的malloc(),调用malloc()或许会花费许多时刻,因为分配器或许有必要对分配区域进行碎片收拾,才干释放出足够大的内存块来呼应恳求。

嵌入式程序员很乐意直接办理内存,编写自定义分配器,乃至经过静态分配的内存块来根绝内存分配失利的发作。

大多数嵌入式体系和一般核算机之间的一个严重差异就在于内存的安排方法。

干流的台式机和效劳器的处理器架构装饰新房(如Intel x86)运用的编程模型中,代码和数据存储在同一个地址空间中。

这意味着假如你的机器有64MB的RAM(好大啊,太难以想象了!),而你的程序是40MB(令人难以置信!),那么你的数据就只剩余24MB(这么多,底子用不完啊!)。

在家的时分,咱们称之为冯诺伊曼架构,但在酒吧咱们就不敢这么说,因为这会引发唇枪舌战。

因为RAM是处理器中功耗最大的一部分,而且因为RAM占用许多芯片面积,因而在许多嵌入式体系运用的模型中,代码和数据别离存储顾彦深在不同的存储器中。

代码和静态数据存储在ROM(一般是闪存或EEPROM)中;而动态数据存储在RAM中。 ROM比RAM廉价许多,因而一般运用的也较多(一般是5-10倍)。

RAM和ROM能够具有独自的地址空间(哈佛架构),也能够映射到一致的单个地址3a街拍空间(改良版的大豆哈佛架构,惋惜的是从未被称为小丑架构)。

除非你需求编写引导加载程序或体系内晋级的功用(在这些状况下,你少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点需求向代码的存储空间中写入),不然一般你不会留意到这两者之间的差异。

但这的确意味着代码的巨细和RAM的运用率需求独自核算。换句话说:在嵌入式体系中,代码巨细的约束不同于RAM运用的约束。请记住,一般RAM的运用是最要害的参数。

你所看到的便是全部

嵌入式精心的近义词程序员的确是软件国际的佼佼者。他们喜爱亲手写程序,创立自己的代码库,运用20世纪60年代的言语,运用机械键盘。

很少有是现成的库能够满意嵌入式体系的特别约束。尽管有许多JSON解析库,但很少有库能够支撑大于RAM容量的文档的解析。

嵌入少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点式程序员总是乐于测验现有的库,因为他们都很懒。可是,假如没有适宜的库,那么嵌入式程序员也很乐意从头创造更小、更快的东西。

因为嵌入式程序员十分重视了解和操控代码的履行和资源的运用,因而简直全部代码都是用C言语编写的。

有时新的编程言语企图侵略嵌入式的国际,成果却会遭到嵌入式程序员的质疑。

这种言语有一些独特的线程模型吗?请拜见如下有关并发的评论。

这种言语有废物搜集吗?请拜见如下有关功能的评论。

这种言语的编译器是否支撑人类已知的每种核算机体系结构?

请拜见如下有关可移植性的评论。简而言之,衡量规范设定得很高,而且C十分优异。

嵌入式软件体系往往很好了解。缺少第三方的代码库和富丽的承继结构,而且还存在严厉的代码巨细约束,全部这些都确保了代码很小且易于了解。

在编写杰出的嵌入式代码中,你在页面上看到的全部便是全部的代码。嵌入式程序员无需经过层层地剥离才干弄清楚代码的实践效果。

这并不是说实践的嵌入式运用程序的逻辑不会十分杂乱,但至少咱们不需求经过层层叠叠的笼统方式来躲藏这些逻辑。

并发

嵌入式济南地铁开发人员都不喜爱并发。关于查尔斯巴贝奇(可编程核算机的创造者,核算机的前驱)来说,一次做一件事就足够了,你也相同。

大多数方式的并发支撑都需求不时地保存状况并切换到新使命。

这需求多个仓库,每个使命一个,还需求许多的RAM,有时多得通货膨胀不是一点半点。现如今,仓库很简略就占用1KB乃至更大的空间。

嵌入的程序员无法忍受这一点。他们甘愿手艺处理协作性的使命切换、非堵塞的I/O、轮询、回调、手动使命调度、主循环。

这些都是嵌入式程序员最常用的东西。假如你不了解这些东西的意义,也不必忧虑,你能够参阅本文结尾引荐的作品。

聪明的读者或许不由想问:“莫非不是全部类型的的使命切换都需求保存使命的状况吗?你岂不是将这些作业从操作体系转嫁到程序员头上了吗?”

嵌入式程序员会回答说:“然也!”,或者说:“将少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点作业从操作体系转嫁到程序员头上,这便是嵌入式编程的作业啊!”

并发是一个难题。可是,抛开先入为主的多线程的概念,并发实践上就简略多了。大便出血是什么原因你知道你的代码不会被中止,因而你很简略把握履行次序。

缺陷就在于你需求为I / O等编写更多的代码,因为你不能运用堵塞。

前面说过的不幸的嵌入式体系程序员很不走运,对他们而言,硬件中止会打乱全部的作业。

可移植性

假如你的程序不能在人类全部已知的处理器体系结少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点构上运转,那么你的程序就不算第三种爱情嵌入式程序。

大端、小端、依据仓库的寻址、依据寄少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点存器的寻址、RISC、CISC、标量、向量、DSP或PIC,这些都无所谓。

代码不管放到哪里都能够正常运转。一个字节包括8比特?没那么快!嵌入式程序员不会做任何假定,他们会质疑全部问题。

假如有一天,客户要求你的程序在有分段只写内存和分支协处理器的依据Chewbacca 5000 12.5位仓库的矢量CPU上运转,那么嵌入式程序员也能够安然地通知他:没问题。

这对你来说意味着什么?张狂地刷旧版的C规范吧。

易于测验

因为嵌入式程序能够在“设备外”进行多种类型的测验,因而嵌入式程序员能够在编写测验代码的时分,纵情地测验现代软件开发。

测验代码能够用Node.JS、Python、或C ++编写。咱们能够在测验代码中在为仓库上分配大目标,世上没有比这更享用的罪恶感了。

为硬件开发嵌入式程序时,测验肯定至关重要。你编写的代码终究会呈现在永久不会更新的设备中。

有时你的代码会被刻录到ROM芯片中。假如在发布后才发现Bug,那本钱可就十分昂贵了。

因而,坚决地遵循现代测验的准则,对编写易于测验的代码坚持热心,以及百分百完结测验覆盖率的决计,是嵌入式程序员十分名贵的质量。

功能

关于大多数程序员来说,功能是一个简略的问题:“代码的运转速度够快吗?”

假如代码的运转速度比要求还快,则万事大吉。

关于嵌入式程序员来说,状况则略为杂乱:“代码的运转速度够快吗?实时性够吗?功耗是否在计划内?”

除了RAM和代码巨细的约束外,代码的运转速度还有必要够快。

但不必过快。药流后多久来月经未运用的周期有助于下降功耗。下降功耗意味着电池寿数更长,发生的谢安琪热量更少,而且鄙人一次硬件晋级中能够运用更廉价,更慢的CPU。

咱们总是与底层的硬件人员博弈。杰出的嵌入式晚春韩愈代码规划能够促进CPU进入睡觉方式,例如运用显式轮询,让体系能够在轮询之间休眠。这也意味着代码不应该因任何原因形成堵塞。

有些嵌入式体系有硬性的实时要求,例如起搏器。在这样的体系中运转的任何线程或使命都有必要确保能手指发麻够在固定的时刻段内回来。

假如运转时刻过长,则体系或许会彻底失效。拿起搏器举个比如,这样的起搏器会被归类为“次品”。毋庸置疑,为心脏起搏器写代码的作业不适合胆怯的人。

大多数嵌入式媒体运用程序都有软性的实时要求——假如线程或使命占用CPU的时刻超越应有的时刻,那么体系功能会被降级,但不会彻底失利。

音频或视频或许会呈现毛病或卡顿。用户界面或许会感觉推迟。这肯定不是功德,但也不是灾难性的。

编写具有杰出实时特性的代码十分类似于编写有助于CPU睡觉方式的代码,两者都是运用很短时刻片,十分留意循环长度而且永久不会堵塞。了解你的代码途径。不惜全部代价防止递归。

怎样才干成为嵌入式程序员?

有抱负的嵌入式程序员都有哪些重要的特质?

你需求对核算机体系结构的基础常识有深化的了解。了解内存的层次结构,吞吐量瓶颈和硬件等级的并发问题。还有一颗强壮的心思把握寻址的作业原理(指针)。

此外,依据你需求运用的软件类型,或许还需求把握一些职业的技能。例如,在Spotify,你需求对网络有很好的了解。

假如你觉得你对核算机体系结构的基础常识没有深化的了解?

那么请参照下列引荐书本:

除此之外,好奇心也是嵌入式程序员身上最重要的质量,巴望了解事物原理的激动以及坚韧,乐意全身心肠投入到作业中,不断学习。

原文:https://labs.spotify.com/2019/04/09/an-opinionated-anthropology-o艾泽拉斯国家地理f-the-embedded-program少儿街舞,放下成见,原本嵌入式程序员如此“妖娆”!,北京景点mer-its-habits-and-habitat/

本文为CSDN翻译,转载请注明来历出处。

【END】

"点个在看吧!");

"点个在看吧!");

print("点个在看吧!");

printf("点个在看吧!

");

cout << "点个在看吧!"<< endl;

"点个在看吧!");

"点个在看吧!");

alert("点个在看吧!")

echo "点个在看吧!"

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
the end