资讯详情

嵌入式分享合集18

一、MOS管道基础知识

都是图啊 犯懒了 今日化身贴图帝

二、菊花厂写代码,程序员自我修养

一天晚上,我和妻子聊天,说部门要我写一篇大咖谈软件的文章,妻子斜了我一眼,淡淡地说:Linus大神21岁就写出来了Linux内核的雏形创造了一个自由主义的开源世界;28岁的张小龙写道foxmail,2000年卖出1200万元。大咖,认识你这么久了,还不知道你有什么突出的成就?我咽了口水:好吧,我重新组织语言,我需要写一篇关于软件的文章……” 回顾过去半年,软件总工程师和软件专家的任命让我们这些写了十几年代码的软件工程师兴奋不已。我在2006年进入公司,几乎参菊花3G菊花3G35岁的高龄有幸加入了从起步、上升、灵魂深处改进、巅峰、回落的壮丽历程G开发部的大家庭。 十多年来,我一直坚持编码岗位,经历了普通开发人员TL、MDE、MDEL、SDM(云化团队),Committer、各种职位,如软件专家。然而,我知道,我从事编码这个高风险职业已经十多年了,没有被祭天,依靠程序员的自我修养——扎实的基本软件能力,如履薄冰的工作态度,对技术的不懈追求。

记得几年前部门第一次评选优秀代码,我成了金码奖的获得者之一。是因为代码很炫吗?并不是。遵循简单的原则:简洁、逻辑清晰、函数职责单一、数据结构设计合理。没有使用高级编码技巧,也没有使用某某设计模式。就像公司最新的一样C/C 语言编程规范也把编写简单的程序放在首位。由于需求的变化,简洁、逻辑清晰的代码易于阅读和维护,但从未引入过在线问题。 当然,简单并不意味着没有思考。相反,我们需要在编写代码之前计划,然后移动,三思而后行。有一次,项目组安排我进行性能优化。通过反复分析热函数,反复测试和比较不同电话模型下的性能差异,我花了三周的时间来回,找到了导致性能恶化的最关键因素。最后,我决定采取优化措施修改备份机制,减少备份数据。这些方案代码变化很小,很简单,但实际优化效果很好,满足了未来几年业务发展的需要。 让我们看看另一个例子。在某个局点升级新版本后CPU负荷上升的问题。经过近两周的攻关,我的最终定位是在业务处理过程中新版本的直接阅读DB核心操作。直接读取DB内核,代码处理简单,也能正常实现业务功能,但性能很差。若在开发过程中能多想一步,采用缓存方案,性能会有天壤之别,也是更好的代码。 人们常说,唯一不变的是变化,客户需求不断变化,我们的代码会被动或主动变化。软件工程师永恒的追求是设计可扩展、自动适应客户需求变化的软件架构。说起来容易,做起来难。要不断积累业务知识,拓展知识面,勤于思考,识别技术未来的演变趋势。我们不能从一开始就做一个无所不能的架构,包括未来的变化,即使可以,交付节奏也不一定允许。在一定时间内满足当前和未来业务需求的设计可能是最合适的。

要写出一个好的代码,但也要继续写出一个好的代码,我们需要深入了解技术原理和业务逻辑。前提是具有扎实的编程基础,即基本的数据结构和算法、编译原理等基本软件能力。 去年年底,我和部门的几位软件专家一起参加了一次互联网架构会议。AI、时尚、热点、风口等问题很多,如区块链、物联网、云、中间件等。但我没想到最受欢迎的话题是基础软件设计、架构设计和演变。就像写武侠小说一样,练基本功,练内功,无论什么精妙招式,都会得心应手。 另外,一些编程习惯,如果坚持下去,对于编程修养提升也是非常有用的。例如使用快捷键、有效的代码注释、命名规则、代码风格等。每次写代码,除了追求好的代码,我都会时刻思考软件的优化,能否使用更少的内存,能否有更好的性能。重视数据结构中的每一个字段,重视每一个小代码的优化,都有可能给我们带来意想不到的收获。比如去年做性能优化,我们仅仅是将流程中的一处动态内存申请修改为静态内存池,却意外获得了30 CAPS(每秒呼叫次数)性能提升。

有人问,我知道真相,为什么还是写不出好代码? 由于个人习惯、赶工期、外部要求低等原因,很多开发人员在编程时特别随意、直接Copy-Paste。我认为程序员应该养成编程习惯和严谨的编程态度,就像追求生活质量一样。 我一直在颤抖,在薄冰上行走。在进入仓库之前,我会反复查看我修改的代码,查看修改代码的上下文,并对修改前后的代码进行比较。在代码进入仓库后,再阅读几次,以确保它们已按预期合并。进入公司这么多年,我从来没有多合、漏合或错过任何代码。 你可能会认为我小题大做,但事实上,这是历史上发生的痛苦教训。在某个国家升级新版本后,我们发现用户访问成功率恶化,这是最重要的定位是由于一行代码被误删除导致的。事后回溯,开发人员自己都不记得这一行代码为什么会被删除。还有一次,一行代码被误删除,导致一个关键KPI指标:软切换统计次数有变更。部门把这两起事件总结为“一行代码引发的惨案”,无论是对产品品牌、客户印象、还是对于个人,都造成了恶劣的影响。     事后大家都在思考,我们有结对编程、代码检视、开发者自测试等非常完善的开发流程,还有MDE(模块设计师)检视作为代码上库前的“守门员”,为什么还会发生这么低级的错误?是流程没执行到位,还是MDE疏忽、没把好关?     在IPD 2.0变革中,公司借鉴开源组织的Committer运作,来加强我们的Committer机制和文化。5G开发部也选拔、任命了一批Committer,我有幸成为其中之一。刚开始履行Committer职责时,我有点疑惑:这不就是给MDE角色披上了新的外衣,把MDE原先“私下”做的事情,通过Committer统计数据给呈现出来嘛?     不过,经过几个月的摸索、实践后,我渐渐地明白,Committer机制应该是一种文化上的变革,牵引大家提升自己的软件能力。Committer的职责很多,作为代码提交前的最后一道关卡,这是在当前人员能力不足阶段有效果,但是最终应该被弱化的一项实践。参与编码前的软件设计、持续做好架构看护和技术债务清理,让大家都有更大的机会写出更好的代码,我认为这是Committer更大的价值。     随着个人和组织的软件工程能力提升,自动化测试防护网和变更防护墙建设完善之后,前面提到的“一行代码引起的惨案”,是可以避免的。

      对于大部分老员工,特别是无线2G/3G/4G等部门的老员工来说,一提到变更控制,都会如临大敌。版本升级后,KPI变差是绝对不允许的,严重时可能面临版本回退、客户投诉和上报事故。而KPI变好,除了要向客户解释,还有可能面临商务风险,客户会觉得之前吃亏了。现实世界对我们就是这么苛刻,谁让我们是影响世界的通信软件工程师呢,他们这是爱之深、责之切啊!     我们开发一个版本,动辄涉及几十万代码的新增、修改或重构。要想不引入变更问题,除了做好设计、结对编码、代码检视和测试之外,我认为最关键的就是完善的自动化防护网。在3G时,我带着两个同事将IT测试工程从只有几百个用例扩充到上万个用例。全方位的场景覆盖、严密的信元有效性检查、完善的用例失败判决机制、无死角的资源泄漏检查等手段,让变更错误无所遁形,给3G留下了一道变更防护墙。     开发过程中补充IT和PC-ST测试用例,不是为了提升代码覆盖率,而是为了自动化防护。而要能达成自动化防护的前提,是每个用例都具备完善的有效性检查,否则防护网就是形同虚设。几年前,我跟一个同事开玩笑:“我会故意将某行代码改错,看看你补充的用例是否能检查出来。”让我意外的是,在交付紧张的情况下,他仍然多花了半天时间完善用例有效性检查,并请我故意改错代码来做试验。当然,最终的结果是,他准备得很充分,我没能发现问题。多么有自我追求的一个程序员!

      说起程序员的追求,我还想起了2016年参与的一个产品云化项目,我负责弹性伸缩特性的方案设计。在此之前,我一直在投入嵌入式软件开发,虽然期间产品也换了好几代的硬件,经历了产品与平台解耦、制式间解耦、软件与硬件解耦等过程,但是对于服务化、微服务化、云化等概念,我却基本处于懵懂的状态。     不懂怎么办,只能是“站在巨人肩膀上,为我所用”。兄弟产品线不是已经做了吗,那就找他们做同行协助;友商不是有路标和规划了吗,那就在他们的有限材料中寻找可借鉴的地方;互联网的亚马逊云、阿里云不是有非常成熟的方案了吗,那就下载他们的产品手册和用户指南……那段时间感觉自己就像是入了魔一样,疯狂地学习分布式软件相关技术,疯狂地吸收各方面的能量为我所用,最终给出了一个令自己和项目满意的设计方案。     这也让我充分意识到自己之前把眼光局限于所在产品、系统、子系统的不足。     作为一个程序员,除了要提升自己的基础软件能力,我们也要始终保持对于新兴技术的好奇心,孜孜不倦的追求,不断拓宽自己的视野。而这方面的能力和诉求,在5G时代更是如此。     当前我们菊花厂5G面临的网络安全问题,虽然有着很大的政治因素,但也从侧面反映了5G的战略意义。超高速率、超大连接数、超高可靠低时延,对我们在软件处理时延、可靠性、安全、韧性等方面的能力都提出了更高的要求。同时,5G承载的垂直行业应用、接口开放和硬件“白盒化”等趋势,也必将对我们当前的知识和技术体系,提出更大的挑战。     公司计划用五年的时间,全面提升软件工程能力,对我们是考验,也是机会。统一编程规范、整洁代码、整洁优雅的架构,不同的人有不同的追求,需要我们有持之以恒、水滴石穿的决心。五年或者十年后,当我们回首时,会发现自己曾经的付出是值得的。正如,清代著名学者王国维提出的读书三境界之第三境:“众里寻她千百度,蓦然回首,那人却在灯火阑珊处。”     也许我们绝大多数人终其一生也无法成为Linus、张小龙这样的大神。然而,我们能够做一个有修养的程序员,并参与到改变世界的华为5G产品开发中来,在人类的通信史中留下自己的优秀代码,幸哉。本人也是电信专业的 真可惜没去华为啊 whaosoft aiot http://143ai.com 转自《华为人》。

三、学习STM32简单吗

    越是简单的东西越容易流行起来。

    当年STM32是怎么在众多单片机里脱颖而出的?因为库函数这个东西,让开发变简单了。

    在这之前,单片机主要是51、AVR、PIC、MSP430这些玩意,就是写个UART通信函数,都要先去搜索下别人的代码“借鉴”一下,发现别人写得不完全满足需求又自己修改,然后慢慢地积累出自己的一套库,在换下一款单片机的时候这几年的积蓄发现又用不上。

    ST半导体搞这个库函数,不就是为了降低开发门槛么?

    让开发者专注于更抽象的应用而不需要太关注单片机底层的东西才是大趋势,ST抓住这个趋势先发制人才得以迅速占领市场。

    什么?直接写寄存器?汇编?这种炫技的东西绝大多数STM32的目标应用都不需要。什么成本敏感?成本敏感谁选STM32啊,几毛钱一颗只能用汇编写的单片机了解一下。

延庆川北小区45孙老师 收卖废品破烂垃圾炒股 废品孙 再回收

 

  • 做一个键盘/鼠标,可以学习USB协议

  • 做一个联网设备,需要学习以太网,TCP/IP协议的底层实现

  • 做一个无线设备,可能需要学习蓝牙、WIFI或者zigbee的协议

    而最终的应用,可能不一定有库或者包,需要自己去写底层。如果用模块,则可能需要学习SPI、I2C或者SDIO接口去连接模块。

    做一个平衡小车,需要学习PID算法,小车相关文章可以看下:STM32平衡小车,文末附代码、电路图等资源获取方式。

    做一个摄像头能需要学习SCCB协议,如果想深入一些,可能需要学习一些图像处理的知识。

    如果这个摄像头要连接PC,做更深度的处理,则需要学习上位机的编写,可能需要设计协议或者写一个服务器,此时可能需要学习开发服务器的知识,以及一门写服务器的语言,包括不限于C++/Java/python/nodeJs。服务器框架可能也要学一个。服务器都有数据库,学习个简单的nosql吧,当然mysql和oracle也可以。

    上位机要是需要图形界面,最简单的可能是C#,当然C++调用win32 API更好。

    如果要做人脸识别、图形分割,还需要机器学习的知识,可能需要python和tensorflow / pytorch框架,当然其他语言也可以,但可能更复杂,而机器学习,基础是数学,嗯~,很难的那种。

    现在都是手机端操作,Android可能学一下,Java走起。如果碰巧手机是苹果的,objective-c学起来。

    如果继续深入,做一个更复杂的设备,首先需要自己设计板子。这时候PCB设计需要学,模电数电需要学,电路原理更需要学。

    软件层面,可能发现裸机已经不够用了,可能需要学习ucos/freeRTOS之类的操作系统,甚至自己学习写一个操作系统内核。如果这个系统要求健壮、高效,需要深入理解操作系统、数据结构、算法、优化、汇编语言等。

    上述种种内容还不少,不知不觉已经学习了计算机科学的一部分了,对计算机科学有了基本的了解了。

    如果大家觉得这是强行关联,其实不是。综上所述,只是用STM32做了一个处理单元放在服务器端的小机器人,能保持平衡、识别人脸、能在PC端和手机端控制而已。

    语音识别、对话系统等功能还没说,这些可能需要更多自然语言处理、乃至强化学习的知识,你发现,往往效果不尽如人意,这不是你技术不好,而是这个世界的瓶颈,恭喜,可以看论文、写论文,为人类在计算机、人工智能领域的突破做贡献了。

    什么?想要把运动单元做波士顿动力那样的?这事情就更复杂了,不然你以为我怎么入坑的?

    技术深究起来自己都怕,比如刚学习了STM32的cortex架构,那其寄存器、指令集、内存是如何实现的?刚了解这些,那其存器是哪一种,取指与解码过程是怎样的?加法器又怎么实现?刚了解三极管和布尔逻辑运算,那三极管是怎么工作的?刚了解PNP和NPN,那共射特性曲线是怎样的?为什么载流子会运动,正偏反偏是什么?为什么磷、硅、硼作为半导体材料,会形成电子流动?空穴是否能流动?

    重点不是STM32能做什么,而是我们能用STM32做什么?能做什么程度的产品,市场竞争力如何,甚至考虑是否满足了用户未被满足的需求,也就是填补了市场空白。技术并不是独立的,而是拓扑的。

 

标签: st三极管8550

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台