1. 首页
  2. 问答经验
  3. c语言入门多久可做到嵌入式(如何在嵌入式C语言编程的针尖上舞蹈)

c语言入门多久可做到嵌入式(如何在嵌入式C语言编程的针尖上舞蹈)

简介:关于c语言入门多久可做到嵌入式(如何在嵌入式C语言编程的针尖上舞蹈)的相关疑问,相信很多朋友对此并不是非常清楚,为了帮助大家了解相关知识要点,小编为大家整理出如下讲解内容,希望下面的内容对大家有帮助!
如果有更好的建议或者想看更多关于问答经验技术大全及相关资讯,可以多多关注茶馆百科网。
知识百科在你身边,科学知识在日常生活中,涵盖健康、养生、饮食、生活小窍门、娱乐、科普等方方面面文章附后是学习资源,自助收藏 整合网络信息,作者:Little Horse 不记得从什么时候开始承接企业招聘工作,重点招聘工业嵌入式产品研发人员 出于对企业和新人负责任的态度,我倾向于寻找对嵌入式编程有扎实基础知识和兴趣的人,这有利于企业发展和个人成长,但很多时候就像大海捞针一样,希望和失望 这是一个让我很纠结的问题,不禁想起我听过的一个故事:一个外国人来国内一家公司参观,先是看到员工的工作态度,疯狂的嘲笑,这样的员工应该被解雇;然后在午餐的时候,我尝了尝公司的午餐,又开始骂公司 回顾现在的大学教育模式,很多学校还是沿用类似初高中的填鸭式教育,大部分学生也是吃喝玩乐,即使新生还有一些激情,很快就被环境污染了然后是对学生、学校和企业的辱骂,造成愤怒的混乱 一位好朋友在国内一所985大学教计算机科学,有一次和他聊天抱怨说,现在的学生入学后很长时间都无法上手,而且培训周期很长,但这位朋友的观点是,这应该是理所当然的,在大学里能学到的东西,都需要在企业里锻炼说不出话来 事情真的应该是这样的吗?我很迷茫,但看到每个学生背后的父母为了学费而努力学习,看到他们眼中对孩子的期望,我觉得我们可以做得更好,也应该做得更好 为了让大家了解我内心纠结的心情,先简单谈谈招考考题在我参加中兴的招聘之前,招聘老师给我出了一道题,int n=3,4;我说我不知道,这是一种变态的用法,我们不应该这样使用它,你不应该问这样的问题可能年轻的时候,会被招聘老师气得半死,当然,我也很怀念中兴吸取过去的教训,我在后来组织招聘的时候,有一个基本的原则,就是只把工作中常用的知识作为调查的范围 为了挖掘出一些好的迹象,我们一直在思考什么样的考题能更好地检验求职者的能力和兴趣第一种方法是询问一些基础课和专业基础课的基本概念,过滤掉基础知识不扎实的人;然后期望求职者有兴趣地解释一个他写过的程序,然后通过对求职者的描述,再继续深入,来判断他的能力到什么程度 遗憾的是,99%的人看不出自己凭兴趣写的节目,几句话就能揭开真相后来只好把问题隐藏起来,再降低难度,一些单层循环,以及每层循环适度判断的编程实例(如判断一个整数中0的个数等)如果每次招聘都能遇到一两个会很快写出这样程序的同学,大家就可以兴奋很久了 这是我们能招到的一般能力的学生,在我看来,要达到这种能力,只要随便学几天编程就可以了,还需要大学四年的学习干嘛,郁闷啊但一个更现实的问题是,企业在聘用这些人时将如何利用他们我们不敢直接拿产品让菜鸟员工实践,我们都知道产品是卖给用户的,最初给用户出现的小问题会放大成大问题 企业培训不同于学校教育,没有人会给你死记硬背,更不要指望有人来教你,很多时候都是散养的,最多几句话然后自己看书这种情况也导致很多人在创业初期难以起步,甚至有些人被迫转行,放弃自己的专业方向多年 关于如何快速过渡,结合我多年的工作和培训新员工的经验,我总结出了一个比较有效的方法,将产品研发所需的初级C语言知识巧妙地整合到三个例子中,让新员工通过这三个例子来学习、创新和思考,不断提高他们的C语言能力并具备尽快参与产品研发的能力 如何学习C语言? 许多新员工都喜欢问类似的问题:“如何学习……然后有些朋友会抄很多书,更热心的会指导哪本书是哪本书先读的但遗憾的是,很多时候它就到此结束了,大量的数据仍然静静地躺在电脑硬盘里,只是在偶尔的情况下才会打开目录通过一些企业的培训体系,一般是这样的: 1、新入门后,师傅会给一堆资料看,然后新头皮看一些;2、哪天主人不忙,想着新人,再给它一个产品,让它折腾;3、遗憾的是,具体的产品一般涉及到多个学科,面对很多问题,新人会觉得如云难以前行;4. 一段时间后,有些人在入行时跨过绝望的悬崖,有了自己的积累,开始慢慢深入接触产品,但由于各种资料的稀缺,只能边学习边调整;5、几年后,新人成为老手,而新的产品体系诞生了;6、然后重复上述死循环长此以往,公司的产品体系变得非常杂乱,技术难以重用,无法进行有效积累,那种团队建设都是空谈 如何跳出这个循环?在我的职业生涯中,我做了很多探索,我有一个认识:我们不仅需要将新人的培训尽可能的向前推进和系统化,还需要尽快将其融入到我们的设计和团队理念中所以在接下来的三个C例子中,你会看到比C语法更多的东西正如我之前提到的,在公司里,不可能重复学校那种填鸭式的教育模式,没有人会手把手教你在这种情况下,如何组织培训工作,在很多情况下就成了一种颇具艺术性的选择 随着移动互联网的普及,在线教育也开始流行起来,网络上出现了大量的视频教程根据时代背景,我尝试过将我需要学习的内容制作成书籍和视频,但效果并不好后来对这一领域的深入研究发现,大部分视频只是把大学课堂的内容搬到了网上,很多人只是坐着看了几集就离开了,效果并不好对于在线教育,我也有一些想法和想法,将在以后的专题文章中进行描述,这里不作深入介绍简而言之,最初的尝试并不十分成功 C语言第一个例子:需求不明确 第一个例子:“编写一个控制台程序,知道内部和外部钻石的高度,并输出一个空心钻石”是不是看起来很简单啊,写到这里,很期待你能停下来,思考一下,然后付诸行动,写几行代码试一试,然后继续读下去,收获会更大这些年,我领导过很多人,大多数人看到这个题目,然后马上就开始写程序去了,他们心里多少有点失望,为什么呢? 一般来说,通过公司的层层把查来招聘软件人员,这个例子总能弄出来,但遗憾的是,近一半的人不能准确地做到这一点,只有一个菱形高度的认识,就是各种杂,乱,实施如: 或者像这样: 或者可能是这样的: 为什么会出现这种情况恰恰是这个例子中的第一个大漏洞:需求不明确刚开始的挫折,对于很多新人来说,这无异于一次打击,但记忆也是最深刻的当一个团队协作的时候,会有很多的沟通,而在沟通的过程中,总会有或多或少的歧义,而正是这些歧义,会导致需求不明确,导致大量的返工,甚至导致项目的失败我给新人的第一条建议是:用你自己的语言表达你的需求,并在实现它们之前与它们确认这一点在以后的团队合作中非常重要,所以我很早就在入职培训中嵌入了这一点 嵌入式物联网需要学习的东西真的很多,不学习错误的路线和内容,导致工资涨不上去! 免费给大家分享一个信息包,差不多150g .里面的学习内容、面孔、项目都比较新比较齐全!某条鱼估计至少要好几十条 点击这里寻找小助手0元领取:嵌入式物联网学习资料(头条) 在所有这些之后,第一个例子被重新描述如下:“编写一个控制台程序,用户在其中输入内部和外部钻石的高度,并输出一个空心钻石,其高度定义为钻石的上三角形的高度,如输入5和3,输出如下:* ***** **** **** **** **** ****** 这里有两个小补充: 1、菱形高度的定义看似有悖于常识,但在编程的世界里,简单性是常识,如果定义为整个菱形高度,那么不仅需要做正整数判断,还需要做奇数判断,增加了程序的复杂性 2、以身作则,多言多用,就是所谓图顶千言知道该怎么做,很多人回去,但在许多情况下,结果如下: 第二次被送回家后,很多人都会不耐烦,钻石还没输出,就已经灌输了一堆规矩在这种情况下,我向他们解释了嵌入式程序的特性(稍后将描述)和我以前的经验我刚开始工作的时候,由于CPU速度的限制,程序主要是汇编语言,领导让写一个小汇编程序,但每次提交后,都被领导骂了一顿,让整改,直到后来一行汇编语句无法保存,才被通过回想起来,举个小例子,我对大部分的大会指令都很熟悉,也就理解了领导的良好意图现在新人脸皮薄了,不敢骂,所以要慢慢讲理 经过第二次折腾,大部分新人的态度都可以稍微正确一些,这次写出来的例子和需求基本一致,但是当利息冲过来支付时,我没有看程序,开始询问实现这个程序过程中用到的调试技巧这个例子对于新手来说有点难,不可能写的很好,肯定会经历一些痛苦的调试过程然而,在国内大学教育体制下,对基础调试技能的培养并不重视,预计新生会意识到调试是一开始的基础努力,需要得到足够的重视,需要不断加强雄关路真像铁,现在一步一步从头开始,一个小小的例子还没有开始,对于很多人来说已经是痛苦的经历了如果你想成为一名合格的嵌入式工程师,你需要方法,需要智慧,更需要背后的汗水和坚持这一系列的文章将带你领略我的成长之路,但它代替不了你自己的努力和汗水 C语言第二个例子:边界判断 我在上面提到,这个例子引出了三个重要的概念,第二个是边界判断给定两个数字,如何完整而简洁地判断是合理的输入,这是编程的基本技能不幸的是,这些例子都没有结合自己多年的领导经验,在此补充阐述输入两个数字,一个是外菱形的高度(m),一个是内菱形的高度(n),有几个标准: 1、两个高度都应该是正整数(内菱形的高度可以为0);2、受屏幕尺寸限制,菱形高度应加以限制;3、外钻的高度应大于内钻的高度以前带人的时候,拿到套路之后,我喜欢先输入一个像(1000,800)这样的值,因为很容易忽略这个位置,很多人受挫大多数人都缺乏判断标准,也有一些人比较谨慎,习惯写很多判断条件,比如如下: 如果(m 0 n 0 m n m 30 n 30) {.总之,他们没有把握判断条件应该完整而简洁的基本原则,其实例子很简单,只要简单分析,判断条件就只有三个,如下: 1、内菱形高度大于等于0;2、外菱形高度小于约定(假设30);3、外钻的高度大于内钻的高度; 编写如下程序: 如果(n=0 m n m 30) {.} 还记得在第(1)节中我们约定的菱形的高度就是三角形的高度,好处是判断的简单性,概念是为了服务的目的,否则判断还需要额外增加两个奇数标准,简单性就会降低,哈哈,你可以再回味一下在嵌入式产品中,最终产品的健壮性往往体现在这样简单的标准上,这也希望新人在慢慢融入研发团队的过程中能够充分意识到这一点 终于开始输出空心钻石了,但对于刚毕业的大学生来说,这个例子刚开始还是有一些围绕的,它的思维逻辑是怎样的 大多数人会发现输出空心菱形稍微复杂一些,所以我们修改输出菱形,是否简单很多,如果还是太复杂,修改输出三角形哦,说白了,就是把复杂的问题从枝叶上拔下来,简单之后慢慢处理 问题的开始要简单得多,给定三角形的高度m,输出三角形,如m=5,输出如下: * *** ***** ******* ********* 为了直观起见,也表示了空格,如下所示: ——- * - * * * - * * * * * -******* ********* 这时,结论已经很图形化了,每行输出的空格从m-1递减,每行输出的*从1递增,循环子m,程序示例如下: for (i=1; i=m; i ){j=m - i;while (j--)printf(' ');j=i * 2 - 1;while (j--)printf('*');printf('n');} 问题比较复杂,考虑中空三角形,里面等于多了一个三角形,我们输出的时候,可以简单的扣除,假设n=3,如下图所示: ——- * - * * * - * * - * * - * * - * * * * - * * 示例程序如下: for (i=1; i=m; i ){j=m - i;while (j--)printf(' ');j=i * 2 - 1;for (k=0; k j; k ){if (k m-n || k=j-m n)printf('*');elseprintf(' ');}printf('n');} 更复杂的是,输出完整的空心菱形,只需要重复上面的程序,只需将其反转,并调整高度(减1处理,表达式更复杂),我就不展示示例程序了,如果你感兴趣的话可以自己尝试一下 有人在实施方案时,一开始就是分析空心金刚石,最直观的分析策略是将金刚石分层分成三段,上三角、下三角、中间空心部分,如下图所示: * *** ** ** ** ** ** ** ** ** ** ** *** * 按照这种思路,程序如下: for(i=1;i2*m;i ){if(i=m-n) {star=2*i-1;empty=m-i;while(empty--)printf(' ');while(star--)printf('*');}else if(m-ni i m n j 2*n) {if(j=n i=m){num_empty=2*j-1;empty=m -i;}else{num_empty=2*(2*n-1-(j-1))-1;empty=i-m;}num_star=star=m-n;while(empty--)printf(' ');while(star--)printf('*');while(num_empty--)printf(' ');while(num_star--)printf('*');j ;} else {star=2*(2*m-1-(i-1))-1;empty=(2*m-1-star)/2;while(empty--)printf(' ');while(star--)printf('*');}printf('n');} 反正说到这里,这个例程就算完成了,但是我们还没有发现上面这些程序是不是很优雅啊,里面各种各样的m和n表达式,看了一段时间后,基本上跟乱了差不多,想象一下,如果这就是产品的程序,让以后的人怎么去读和维护 C语言第三个例子:简单粗暴的数字之美 美丽,总是让人神魂颠倒,说到美丽,最容易想到的就是赏心悦目的画面,优美的动作,优美的诗词.然而,数学,自然科学的女王,比诗歌和绘画包含更多的美优雅的程序,也许背后都蕴含着数学之美在上一节描述的一些例子中,我们总是试图拼凑m和n的各种表达式,所以与其试图找到它们,为什么不直接将空心菱形放入轴中呢?在计算机屏幕上,习惯将右侧称为x轴,底部称为y轴,并在屏幕上绘制空心菱形,如下所示:然后通过解析几何知识勾勒出空心菱形的轮廓,程序如下: for (x=0; x m * 2 - 1; x ){for (y=0; y m * 2 - 1; y ){if (abs(m - 1 - y)=m - 1 - abs(m - 1 - x) abs(m - 1 - y) n - 1 - abs(m - 1 - x))printf('*');elseprintf(' ');}printf('n');} 我们把所有的判断都放在一个地方阅读程序,很容易看出这个大的判断语句做了什么,以及它是否比之前的实现更优雅 但是这个判据似乎挺复杂的,没有更好的办法了,估计很多朋友看到我上面的图的时候都想到了,就是把坐标轴移到菱形中间,如下: 外菱形的四个边用表达式表示如下: ( x) ( y) m(-x) ( y) m( x) (-y) m(-x) (-y) m 组合表达式为abs(x) abs(y)m,程序如下: for (x=-m; x=m; x ){for (y=-m; y=m; y ){t=abs(x) abs(y);if (t=n t=m)printf('*');elseprintf(' ');}printf('n');} 我不知道您看到这段代码时的感受,但我只记得当我第一次发现这个实现时,被简单的数学之美所震撼如果你也有同样的感觉,我坚信你可以在编程这条艰难的道路上走得很远…… 第五例:嵌入式C语言和桌面C语言有很大的不同 在大学里,我主修计算机科学,我对编程的兴趣主要集中在聪明的算法和实现上工作之后,我开始从事嵌入式产品开发,摸了很多墙,吃了很多苦,明白了嵌入式C语言和桌面C语言是有区别的为了让新人尽快进入嵌入式门槛,因此,今天,注定是一场批评大会,历经波折,才能成长我们从最好的实现开始,在上一节的最后,我们分享了一个漂亮的实现,像这样: for (x=-m; x=m; x ){for (y=-m; y=m; y ){if (abs(x) abs(y)=n abs(x) abs(y)=m)printf('*');elseprintf(' ');}printf('n');} 这种实现将最复杂的条件判断放在两层循环中,因此程序效率很低,而且在嵌入式编程中,特别是在一些实时性很强的模块中,性能往往是一个紧串工业嵌入式产品研发,追求团队作战,追求产品可维护性,追求性能与资源平衡可读性、可维护性、cpu计算能力、内存、可靠性等都成为需要我们工作的资源通常,我们喜欢把工业嵌入式产品编程称为针尖上的舞蹈除此之外,之前的方案还有很多不足,例如: 1、整个程序经常混在一起,增加了别人阅读程序的复杂性;2、m、n相似名称,典型校风;3、各种复m和n的表达式,过了一段时间,我估计我看大头了;…因此,我们需要在继续前进的道路上,为了便于后续方案的实施,将整个方案结构约定如下: Int main(){for(…)输出前导空格{printf (" n ");}返回0;} 查看程序框架,很容易理解我们要求输出菱形是单层循环仔细观察空心菱形的结构,每一行从左到右都可以抽象为前导空格、左星号、中间空格和右星号四个部分,只需要找出这四个值与行号之间的函数关系,就可以求解整个程序,如下图所示: —-*—***–**-**-**—****—–**-**—**–**-**—***—-*我的职业导师经常会和我探讨计算机编程思维的概念,时至今日,我们也没有办法给其下一个准确的定义,但在反复的迭代锻炼中,慢慢的体会到了哪些实现可以称之为计算机编程思维举一个例子,在计算机世界中,我们经常仅鼠标、键盘、磁盘、磁盘上的数据等等都称之为文件,可以进行简单的遍历为何风牛马不相及的东西,我们非要将其抽象成统一的概念呢,这非一句话能描述清楚,后续会带着大家慢慢体悟,但这种设计思想在产品研发过程中,却比比皆是 插入这两段废话后,回头再来看我们的菱形输出例子,明明每一行的结构不尽相同(回忆一下第二个实现版本,就是分类型分别输出的),但我们非要求同存异,或许,我期望从一开始,就在新人的心中播下架构设计的种子,期待着后续的萌芽虽然这儿的话题是以新人培训切入的,但未尝不是自己的成长之路,所不同的是我是在一次次的跌打滚爬中成长起来的将自己曾经摔过的跟头融入到入职C语言训练的例子中,甚至将自己的整个成长史写出来,但愿别人能以我为镜,成长的更踏实更快速一些 C语言第六个例子:嵌入式C语言和桌面C语言差异巨大 在上一节中,我们已约定了程序基本框架,并且也简单的介绍了编程思维的理念,好似,新人很快就可以写出合乎要求的程序了可惜,每个人的成长之路都不是一帆风顺的, 记得当初自己学习计算机编程时,哪个技能不是从大量的模仿中才能体悟一点点的,进而融入到自己的知识体系中的,一点一滴的成长起来的依据上一节的整体框架要求,我曾经带过的很多新人,甚至包含一些粉丝给我的发来的邮件,写出来的程序基本上都是新瓶装旧酒,仅是以前实现例子的翻版而已我给大家示意一下,大家体会体会,自己是否也有这样实现的冲动 for (……){if (上半菱形)以三角型方式输出;else以倒三角形方式输出;if (上三角形).else if (中心空心).else.if (上半空心)以三角型方式输出;else if (下半空心)以倒三角形方式输出;if (上三角形).else if (中心空心).else.printf('n');} 注:该处的示例是结合第二个实现版本的,将一个菱形分为上三角形,下三角形,中间的空心三部分分别输出,详情请查看《入职C语言例子一(2)》 应该如何实现呢?在上一节中,我们提到了重点在于寻找四个函数关系文字的表现力经常是苍白的,给大家展现一幅我指导新人时的随意手绘图,或许,大家立即就明白了 理解了上图,额外强调几点: 1、空心菱形的每一行都必须等同看待,忘记上三角、下三角、中间空心等这样的分割;2、四个函数关系内部不允许出现if语句,但允许提炼公共函数,如abs类的;3、成功没有捷径,技能的学习也没有捷径,将浮躁的心放下来;走到这儿,很多人都写了七八遍了,拜目前的大学教育模式所赐,很多人又出现了浮躁情绪,即时的安抚还是很有必要的,经常打趣的一句话就是瞧瞧你的师兄xxx,别看现在负责好几款产品得心应手,当初还写了十多遍呢,哈哈实际上很多人也意识到了我这样折腾的目的大学的学习都是浅尝辄止的,很多东西都急于求成,但将这种心态带入企业,带入产品研发中却是致命的,我仅是想通过这样的形式,让新人少走弯路用心良苦,却常引来误解无数,内向者口是心非肚子里骂几句,张狂者会直接诘问我这样折腾他们有何意义,呵呵随意牢骚了几句人生坎坷路啊,经这样一指点,大部分人都可以按照要求顺利的完成该例子,虽然每一部分都是一个复杂的表达式此时,我会给大家讲解一个很关键的计算概念:迭代我们所从事的嵌入式产品是强实时工业产品,不仅经常涉及傅里叶等各种复杂计算,而且还要求在指定时间内完成,因此对计算效率等要求会比较高,最经常采取的策略就是通过迭代,保留有价值的中间计算结果,减少整体计算量 而通过迭代,不仅各部分的表达式不至于那么的复杂,而且会减少计算量该例子比较简单,没什么技术含量,大部分人很快的就完成了迭代的调整,但前后对比的效果却印象深刻,算是额外的收获吧至此,空心菱形程序的所有技术点都描述完毕了,按着这样的要求,大多数人可以写出满足要求的程序了还是非常的建议正在阅读的你能亲自写一写,调一调,下一节我会贴出标准答案,大家可以在比对一下,而差异部分正好是我们后续内容的起点 C语言第七个例子:不断完善心中的答案 前面几节中,列举了一个很优雅的实现,一些朋友提醒我该程序输出不正常,自己测试了一下,确实如此当时写程序时,是直接以文档的方式写的,一些例程也是小伙写的程序中拷贝出来的,重在意图表现,所有的程序代码都没有测试过,缺乏了严谨性,优化如下: for (x=-m 1; x m; x ){for (y=-m 1; y m; y ){t=abs(x) abs(y);if (t=n t m)printf('*');elseprintf(' ');}printf('n');} 咱们书接上节,言归正传,在上一节中,新人磕磕碰碰的,终于写出了符合技术要求的程序,皆大欢喜,以为要完工了,可惜,路依旧漫漫此时,我会给大家分享该题目的标准答案,让大家同自己写的程序进行比对,以前的程序都是以片段方式提供的,标准答案以完整的格式提供,示意如下: #include stdio.h#define MAX_DIAMOND_HEIGHT 16int myGreater(int n);int main(){int n, nRow;int nIn, nOut;int nCount1, nCount2, nCount3;for (;){printf('输入内外菱形高度(最大%d行):外菱形高度,内菱形高度:n', MAX_DIAMOND_HEIGHT - 1);scanf('%d,%d', nOut, nIn);if (nIn nOut nOut MAX_DIAMOND_HEIGHT nIn=0)break;printf('输入不合法,请重新输入:nn');}nIn=nOut - nIn; for (nRow=-nOut 1; nRow nOut; nRow ){//行号printf('%-010d', nRow);nCount1=nRow=0 ? nRow : -nRow; for (n=0; n nCount1; n )printf(' ');nCount1=nOut - nCount1; nCount2=myGreater(nCount1 - nIn); nCount3=nCount1 - nCount2; for (n=0; n nCount3; n )printf('*');nCount3=2 * nCount2 - 1; for (n=0; n nCount3; n )printf(' ');nCount1--; nCount2=myGreater(nCount1 - nIn); nCount3=nCount1 - nCount2; for (n=0; n nCount3; n )printf('*');printf('n');}return 0;}int myGreater(int n){if (n 0)return 0;return n;}

不知正在阅读的你看到这个标准答案的感觉,能否寻找出和自己程序的差异的地方,下一节我们以此程序为起点,给大家介绍一些真实产品中的代码特点。

撇开大道理讲嵌入式代码

在上一节中,我们给出了标准答案,是以真实产品代码风格写的,期望小伙伴们能同自己的实现比较一下。现在的90后是有个性的一代,很多人都非常反感直接的大道理灌输,鉴于此,我期望我们的小伙伴们能自己需寻找答案,然后大家在交流碰撞中成长,效果或许会更好一些。这篇文章就让我们一起来找出标准答案中有价值的地方吧。1. 有意义的变量命名大学老师教编程的时候,重点精力都放在了语法方面,侧重于将所有的语法给大家展现一下(这种学习方法我相当不赞同,后续会展现自己的方法,项目组内俗称大树法则的方法),因此经常使用短小的程序展示语法,但因为程序短小,因此变量命名也就随意了一些,因此i,j,k,m,n就成了常客,然后不小心带入了产品中,然后……。但在产品研发的时候,即使比较简单的设备,代码量也会比较大,为了代码阅读维护方便,有意义的名字就变得非常的重要了。在标准例子中,使用了nIn和nOut就是想用简单的英语单词表示内外菱形的高度。一些朋友可能读过《可读代码的艺术》 或《代码整洁之道》 等书籍,作者强调使用准确的英文单词来表达特定含义。但我们是中国人,能想起一些简单的单词词汇已经颇为不易,想准确表达更是天方夜谭,因此,项目组内经过了无数次的迭代和探索后,形成了一种变量定义习惯:尽可能使用简单的相近英文词汇,全局变量必须加准确含义的中文注释,函数内的一些自动变量,因其作用范围很小,有时候注释可省略。关于变量命名的故事还有好多,这个刚刚是给大家起个头,我们后面会有专门的系列文章介绍,记住在真实产品的代码中,需要有意义的变量命名,忘记m和n吧。2. 代码分节是什么是节(section),第一次知道这个概念的时候,正式全球跨千年的时候,我还在大四,我在北京一家企业打零工,当时公司承接了一个日本银行的项目,日方对代码质量要求很严格,专门派了一个专家过来给我们讲解各种要求,以及其背后的道理。当时还很年轻,狂傲不羁,因此大部分的苦口婆心都被当做了耳旁风,但唯独对节的概念记忆比较深刻(可能是一开始就讲的是这个了,呵呵,后续的就没耐心听了,这个系列文章阅读比例逐次下降,估计是同样的道理)。我们在读代码的时候,人的思维一段时间内仅停留在一个较窄范围的点上,如果面对的是看不到尾的代码,会潜移默化的将其看做灭绝师太的裹脚布——又臭又长,逆反情绪悠然而生。因此,我们需要将代码按逻辑分成一块一块的,以空格作为区分,然后每块代码前增加适当的注释,解释这一块代码的功能,是所谓节的概念。经过这样的改造,读代码的时候,感觉会完全不一样。关于节的价值,远不值这些,后续会在编程规范系列文章中和大家慢慢道来,此时,我们仅要求小伙伴知道垒又臭又长的代码是不对的。实际上在第5节中,我约定程序整体结构时,已经有这样的意图了,大家不放回忆并体味一下。

for (……){}

3. 细节化标注某些代码存在着一定的深度,一段时间就会忘记,通过右侧简单的注释加以标注,不仅便于后续代码的阅读理解,而且标注点一般是关键代码段,给后续的代码审查也带来的方便。在示例代码中,会看到迭代表达式右侧(微信公众号排版问题,经常到了下面一行)有简单的标注,主要就是起这样的作用的。但万事过犹不及,很多刚入职的小伙伴喜欢在右侧加好多的注释,仅挑出有价值的进行标注,需要长期的锻炼和慢慢的体悟,或许,那一天回头审视自己的代码,会将许多无用的注释删除的时候,就修炼到家了。4. 资源嵌入式系统中,资源是一个需要时时刻刻关注的问题。何为资源,在我们的概念中,不仅内存和flash空间大小是资源,cpu计算能力也是资源,甚至代码可读性(可维护性),代码实现复杂度(耗去的人力成本),复用率等等诸多方面,都被我们称之为资源。好钢要用在刀刃上,但首先要明白刀刃在哪儿。缺乏了明确边界,空谈提高资源利用率是无意义的。如可读性第一位,内存和cpu资源比较宽裕,我们那个最优雅实现版本最佳了。如果cpu计算能力紧张,上一节的标准实现更好一些。如果内存稍微宽裕,为了增加代码可读性,我们还有更好的方法。前面已经有人给我留言提到过这种方法了,不知大家有没有感受到,锻炼到现在这个时候,单纯的菱形输出是多么easy的事情啊,非要搞个空心菱形,将程序搞的混乱不堪。但加入我们用一个数组来表示整个菱形输出,第一次以*输出一个菱形,第二次以空格在输出一个菱形,然后将整个数组输出出来,是否会非常的简单呢,代码可读性瞬间爆棚,执行效率也高,仅仅多占了一些内存而已。

总结

经过马拉松的历程,终于到了最后的篇章,我们来归纳汇总一下第一个空心菱形输出例程中提到的知识点:

1、需求清晰理解,最使用的策略是:将需求用自己的语言表达出来,和对方确认后再实施。2、边界判断,要让小伙伴意识到:在嵌入式产品中,最终产品的鲁棒性,很多时候就是表现在这样一点一滴的简单判据上。3、基本调试手段的锻炼,工欲善其事必先利其器,无须多言。4、编程思维的引入,需要慢慢的体会抽象的价值,这是一个难点,但想走得远必须扛过去。5、数值计算过程中,很重要的一个概念:巧用迭代。6、基础编程规范的引入,体会节的概念,要意识到产品代码可读可维护的重要性。7、在嵌入式编程领域,资源是受限的,而我们要学会针尖上的舞蹈。8、撰写工作笔记,善于总结,习惯去体悟成长的脚步。记得刚开始从事嵌入式编程的时候,我的职业导师给我欣赏了他的记事本,密密麻麻的各种调试记录,感悟想法,技术资料,知识归纳,我终于明白了他为何获得了全公司上上下下的认可。因此,我们的团队形成了一条不成文的规矩,必须做工作笔记,不管方式,不管格式,只要开始记录就好。

文章来源于嵌入式微处理器,作者小马儿

本文转载自“嵌入式微处理器”,如有侵权,请联系删除原文链接:如何在嵌入式C语言编程的针尖上舞蹈?15年大神7个实例讲代码

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

, 每天学点小知识,让你的生活涨姿势,更加的多姿多彩!课外知识,带你遨游知识的海洋。探索你所未知的秘密。

本文主要介绍了关于c语言入门多久可做到嵌入式(如何在嵌入式C语言编程的针尖上舞蹈)的相关养殖或种植技术,问答经验栏目还介绍了该行业生产经营方式及经营管理,关注问答经验发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解问答经验技术怎么管理的要点,是您问答经验致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/3776441.html