一次嵌入式软件工程师工资底层面试,看你会多少

校招的优点(相对社招)
对应聘者的专业实践技能要求不是很高,更多看重理论基础大公司校招很多,是进入到大公司工作的好途径公司经过学校进行一轮初级筛选,会主动为应聘者避开一些坑人的公司地点集中,都是公司去学校招聘,不必满世界跑来跑去,节省时间财力
职业方向的选择
我其实很早之前就在为工作做准备了,具体开始时间是大二的暑假,那个时候有段时间专门请教了多个学长,网上查询了很多资料,结合自己的专业与兴趣,最后选择了嵌入式Linux开发这个职位方向。资料的收集与学习
当时选定方向之后就一直在网上找相关的学习资料,想着要找到一份比较系统完善的学习资料,这样可以在学习的过程中节省很多的时间精力,最后找到了韦东山的嵌入式学习视频,狠下心来买了一个开发板以及视频的二三期(这里怎么这么像打广告,不过这个视频确实不错,售后也比较给力),这个算是我的嵌入式启蒙了,至今仍然非常感谢录制视频的人,让我学到了很多有用的东西。同期,我实验室里面有两位同学在一个嵌入式的班参加培训,我还记得好像是信盈达,大家一同学习,相互打鸡血,学习过程也就不显得太过无聊。
临近2017年的校招,那个时候是2016年的7、8月份,我开始为正式的校招做近期准备了,准备的内容包括以下方面:
简历学习并熟悉校招流程找一些嵌入式类的笔试题去练习公司宣讲会信息搜集
另外推荐两个非常好用的网站,有网页客户端也有手机APP。
1. 海投网:该网站是从各个高校的首页里面抓取招聘信息,然后整理集合到网站页面中,并且可以选择城市地区,简直是一个校招信息收集的神奇,极大地节省了自己去各个地方搜集招聘信息的时间精力,并且信息还比较全面,值得使用。
2. 看准网:该网站里面有各大公司的面试经历,点评以及薪资平均值统计等等,但是需要自己上传面试经历等来获得查看所有信息的权限,自己找点学长的面试经历或者别的,填上去过了审核就可以随意查看各种信息啦,里面的信息很有参考价值。
由于我是毕业于一个普通的二本院校(虽然专业是一本),所以很多嵌入式的公司并不会鸟我们学校,由于离武汉比较近,并且往届的很多学长也是去的武汉,再者还有一位实验室的大牛也要去武汉参加校招,所以就决定跟他一块去武汉碰碰运气,也因此我还额外准备了武汉地区校招攻略,什么杂七杂八的生活用品,准备在武汉血战一个月。
简历的书写
简历的问题我跟实验室那位大牛前前后后搞了一个月左右,期间咨询过老师,网上搜集无数模板,知乎上也找了不少相关话题,参考往届学长学姐的简历,最后终于搞出了一版还算满意的简历。
简历的书写要遵循以下几点(必须遵守):
简洁,页数必须控制在一页以内(最重要)。实习经验优于项目经验优于与职位不相关的项目,每个条目用2-3行概括,抓关键词,突出项目所涉及的知识点。不要出现错字、病句、标点符号使用错误、排版不整齐、英文大小写不一致、中文数字与阿拉伯数字混用等(一个都不要有)。内容要包括个人信息、教育经历、专业技能、项目作品、所获奖项、 在校任职等。不要写不会或者不熟悉的知识点,写上去的必须保证能够脱口而出并且没有错误。尽量不要出现精通的字样。需要突出的技能点加粗(注意:只有技能栏,别的地方再随意加粗就显得太乱了)。
这里给出一份简历模板,不一定符合每一个人,但是绝对很有指导意义:
对于其中的几点说明:
由于面积受限,所以文字内容框比word默认标准的A4纸文字框大个人链接完全是想要面试官知道有这么个东西,同学也曾提醒过我,在纸质简历上放链接就是浪费地方,但是从实际结果来看,还是有用处的,这个因人而异吧项目作品或者实习经历最好不要少于三个多采用关键字描述,节省字数
说起简历的问题,又想到了去武汉面试的时候见到的华科同学的简历,开头大大的学校名以及学校logo,目测占去了整张简历的1/5,这个真的不是夸张。对于这些名牌大学来说,学校真的是整个简历上面最耀眼的地方了,当然要大书特书(感觉我语气有点酸哎),而咱这种二流的学校,既不想让学校太过显眼,又不能说让面试官看半天还找不到学校名,于是就悄么叽儿的稍微往下放一点,也算是不卑不亢了哈。最后,学校不是很好的就千万不要学人家华科的孩子们啦,省点空间写点真正有用的东西是首要的。
出发去武汉
至今仍然清楚地记得,出发去武汉的日子是9.1号,卧铺,两个人(实验室同学同行),历经9个小时。由于打算在武汉长期奋斗,所以两个人都拖着大包小包,异常笨重,当天夜晚走的,第二天下车到华科的时候已经是中午十点左右了。两个人就随便买了点东西,拖着大箱子在华科的校园里面随便晃一晃,边走边吃边聊,顺便感受一下华科的环境氛围。
由于第一次去武汉,首先要做的就是找住的地方,作为学生,当然就要找经济一点的地方啦。住的地方有多种选择,比如:
酒店:数量较多,价格较贵。没有住过,武汉的一个如家一个月是2000,觉得较贵就没有住(穷学生的痛处)。青年旅舍:数量较多,价格便宜。这种一般是一间房子里面住很多人,洗漱什么的超级不方便,在武汉大概是每天30元的样子,我跟我同学只住了一天,因为人太多,我个人比较难以忍受,只在里面住了一天就拖着同学另寻住处。小旅馆:数量中等,价格便宜。学校旁边比较常见(你懂得),这种小旅馆按月来订的话是有优惠的,比如我们一个房间是70一晚,然后按月来订的话就是每晚50,合计每人25,由于我不喜欢与人一块挤在一张床上睡,就打地铺,同学睡床上。学校招待所:据说有,但是没有找到,于是作罢,但是有些学校是有的,价格极其便宜。
中间还有一件事情,就是在武汉待得时间较长了,想要去剪一次头发,于是手机搜索好不容易找到一家最近的,一看,洗剪吹20,心想,虽然比在学校贵了点,但是还能够接受,但是同学觉得不太对,于是进门的时候问了一句,原来是洗剪吹各20,卧槽,当时心里就开始怀疑人生,于是剪发作罢,坚持了一个月没理发,回校的时候头发都长老长。(写着写着就心疼当时的自己)
惨烈的校招
经过两天的休整,9.4号就开始在网上找相应的招聘信息了,这个时候必须先说一下校招的基本流程:
收集招聘信息
收集信息主要指的是企业宣讲会信息的收集,包括企业开办宣讲会的时间、地点、是否有笔试等等信息。这里安利一个网站—海投网, 有手机 APP 和网站,里面的信息都是从各大学校的招聘门户拉取过来的,不用一个一个去学校网站查找信息,省去了大量的时间。 收集招聘信息有以下几个注意事项: 注意时间问题。同一个公司的宣讲会一般会在多个学校召开,最好去到该公司的官网上面去看看宣讲会行程。协调好各个想去的公司的时间去参加宣讲会。特别注意一些有注明现场笔试或者现场接受简历的宣讲会信息,这些是重点关注的。因为现在有很多公司校招都是网投简历了,网投简历有的不能用自己写好的简历,而是网站上面的简历模板,而且是通过计算机进行筛选的,这样重重原因会导致学校不好的同学简历根本不会到达HR的手里,网站直接自动筛选程序就给过掉了。而现场接收简历就不存在这种情况,会大大提高简历的过审概率。注意有网申的一定要网申,网申与现场投递简历并不冲突,可同时进行。需要在线笔试的注意一下笔试时间,协调好时间,不要因为要参加别的宣讲会而错过了,也可以趁机提前准备一下。网投简历( 或者宣讲会现场投递简历)
现在越来越多的公司都选择网投简历,节省成本,这样造成的弊端上面也说过了, 但是有注明要网投的公司还是要去网投一下的。网投的时候信息一定要填写完整, 把自己会的、做过的东西全部列出来(没有一页A4纸的限制),这样会加大简历过审的几率。 宣讲会现场投递简历的时候可以先听一听宣讲内容,然后进一步决定要投递哪一个岗位,然后把岗位名称写上去(不必直接打印岗位名称或者公司名到简历上面),可以一份简历模板,多次投递。到现场参加宣讲会( 笔试/投递简历)
有的宣讲会结束之后会进行现场笔试以及简历投递,有的宣讲会注明了不接受现场简历那就没有太大的必要过去参加了,把时间留给那些有现场笔试和简历投递的宣讲会。面试
面试一般情况下有两轮,第一轮是技术面,也就是一对一的面试,第二轮是 hr 面,主要谈薪资待遇啊等等。有的公司有群面,注意:技术类公司也有群面的。 这样的公司一般就是一面技术面,二面群面,之后是签约洽谈。签约洽谈
在过了重重关卡之后终于来到签约阶段,签约一般都是以 offer的形式进行,也就是双方协议,有纸质的,也有邮件形式的(有的双方协议会约定违约金),这表明公司有录用你的意向了,等到三方协议发放的时候就可以同公司进行三方协议的签订了,到这里你就基本上确定能够被该公司录取了。
由于去的比较早,且还有没几天就过中秋节了,所以这段时间来校招的公司不是太多,但是当时并没有意识到这个问题,在经过几天的折腾之后,发现竟然一无所获,面试机会都不超过两个,说实话,当时我们两个都有点灰心甚至绝望了,也一度萌生出回校继续考研的心思(现在想想真是十分荒唐的想法)。所以校招的时候有一点,就是一定要坚定信念,不要遇到那么一两个挫折就想着要不要放弃,要抱着一种不成功便成仁的想法,否则,那段时间的情绪真的是非常低落,这样会十分影响面试发挥的。
在这次校招当中,我的直接竞争对手是华科、武大这些尖子学校里面的学生,本来是感觉压力挺大的,在一开始的一两场面试中就表现出一种强烈的自卑感,但是后来一想,在这里谁认识你啊,面试完大部分人还不都是各奔东西了,所以自卑给谁看呢,我的自卑源于认识的人比我牛,而又和我在同一个场合的情况下,既然大家都不认识我,我还有什么可自卑的,就是干啊,出错、出丑也不用担心,反正也没人知道你。抱着这样的想法,我在面试当中也就少了很多的自卑,而是抱着平等的心态来面试的,表现自然也就比之前好很多了。值得一提的是,在华硕的一场面试当中遇到一位华科的研究生,曾问他对于华硕本次面试的感觉。结果人家说什么?人家说这次面试就是来玩玩的,主要是为了积攒经验,这次面试过不了就算了,反正他们学校有华为可以保底。当时我听完之后,心中有一万只草泥马在奔腾,要知道我这种学校出身的想去华为连简历都过不了机筛的,华为保底这种想法真的是想都不敢想,华科学生们的底气可见一斑,从一方面也可以看出普通学校与重点学校的差别了。
中间有一场魅族的面试,面我的人是个胖哥,但是有一个很奇怪的点,就是我之前去面试的时候一般都是我很紧张,有时候甚至说话或者动作都会抖,但是那天面试魅族的时候因为我已经经历过了很多场面试啦,所以自然比较随意了,不是很紧张,但是面试官我有看到他拿鼠标的手在微微发抖,我就很奇怪,难道他比我还紧张?哈,这都是臆测了,不知道具体什么原因。期间面试挺顺利,各种问题都没有卡壳,也没有不会的,但是最终面试没过,这就是很诡异的地方,我每次面试过后都会总结,但是这次我实在是找不到没过的原因。
录用我的一家公司是珠海的全志科技,是做超大规模集成电路的,也就是传说中的芯片原厂,这次面试让我相信,也许,有时候找工作真的是要看缘分的。第一次面试是一个晚上,7点去酒店集合,当时在跟一个同来面试的在闲聊,过了一会儿,我看到有位同学垂头丧气地出去了,我就半开玩笑说,这肯定是被面试官怼了,希望待会我不会垂头丧气地走出去吧。然而,这个flag立的好啊,果不其然,我被怼的快要说不出话来,出去的时候心情同前一位同学,当天晚上真的是整个校招的心情最低点,之前已经跪掉不少面试了,当时还给女朋友打电话说想读研,不想再面下去了,然后女票也是安慰了许久,但是我的心情没有丝毫缓和。就这样闷闷不乐到第二天,起床的时候突然收到一条短信,告诉我面试过了,让参加第二场面试,当时就很恍惚,现在想来也许是我的态度打动了面试官,亦或是各种比赛经历与项目经历啥的?话说二面的时候我那组刷了2/3的人,也许是我华硕群面积攒了一些经验,所以才得以顺利过了面试,真是福祸相依啊。
注意:有的培训公司也会浑水摸鱼进入到校招的行列,往往他们会出一些比较困难的问题刁难你,然后告诉你,你的能力不够,需要在我们公司进行多长多长时间的培训,期间不需要付培训的费用诸如此类,那么就要注意了,这类就是十足的培训公司,千万不要去。
收到了现任公司的offer之后,就比较放心了,因为这家公司算是符合我的心理预期,并且公司是嵌入式同学都想进的所谓的芯片原厂,后期的面试就是真的十分放松了,期间包括一个上海的格科微电子,当时在全国也就招那么几个人,真的没想到会收到offer,但是最终因为其它各种原因,选择了现在的全志科技。至此为止,整个校招算是接近尾声,还有几天才到租房期限,这几天也陆续面过几家公司,但都没有合心意的,就这样磨磨蹭蹭到了退房那天。还记得那天下着小雨,天气逐渐转凉,回程狠心买了高铁票,几个小时之后到大郑州,心里面的一块石头也算是落了地,这将近一个月早上6点出门,晚上12点左右才回到住的地方,整个人精神紧绷,现在也可以放松一下啦。
找工作最重要的是心态问题,当你多次失败的时候就会有很大的挫败感,这个时候不可避免的想要逃避找工作这个现实,想着能不能去考研,能不能先回去,再学习一段时间再来找工作,我告诉你,不能。千万不要想着给自己留后路,你已经没有退路了,不管失败几次,要学会调整自己的心态,没有到最后一刻就要相信自己能够找到一个好的工作。还有一个就是不能够消极怠工,可能因为心情缘故,有的宣讲会因为远或者你自己觉得不太适合你就不去了,简历也不想投递,这样是不行的,不论你心情再差都不能够消极怠工,不然你很可能会错过很重要的机会。
找工作很苦,考研也很苦,选择了一个方向后就要沿着这个方向死磕下去(前提是你确定了自己想走的方向),不要想着有回头路。对于考研与工作我也不能够给出一个确切的答案,只能说是看自己的想法了,但是有一点我可以确切的给出答案,那就是考研究生一定要考一个好的学校,怎么也得是985、211(双一流大学),最差也得是你报考的专业在全国是能够排的上号的,否则我认为上研究生纯属是浪费时间,还不如去参加点培训找工作去。在我去面试的过程中碰到的本科生的比例约等于0,几乎清一色的985、211硕士研究生,由此推及其他地区的校招,大抵也是如此,可以得知找工作的压力多大,如果考研也是为了找一个好的工作的话,那最好还是考虑下上面的话。
这里说一下在面试过程中的个人经验积累。
也就是一对一的面试,在该轮面试中,面试官主要就你简历上面的内容进行询问考察,主要目的是了解你的个人能力,判断你是否适合公司的这个职位。 在此轮面试当中一般有两种面试官: 一种是就着你做的每一个项目去问,问的不是很深入,并且问题的内容也不会超过你简历上面写到的东西。一种是只选择你简历上面的一个项目深入了去问,并且他还会就这个项目进行扩展,问出一些你可能没有接触过的东西来。
我个人认为遇到第一种面试官对你的面试过程来说是比较幸运的,因为你很容易就可以回答出他想要的回答,你不会有太大的压力。这时就主要看你的项目是否够足够吻合那个职位要求,以及你的项目涉及的知识点是否是面试官想要的,这里拼的就是项目经验。当你遇到第二种面试官(一般会是项目总监或者技术总监一类的人)的时候,我必须要同情你一下,因为你很可能会挂掉这次面试。但是从另一个方面来说,这又是比较幸运的,因为这样的面试官所在的公司我认为创新能力比较强,公司也比较有活力(一家之言,也说不定)。这里拼的就是你的知识面以及抗压能力,还有面试官对你的主观印象了。面试的时候有几个注意事项:
1. 不会的东西就说不会,但是尽量要找一个相近的可替代的东西去补充。 比如问你会不会写一个 memcpy 函数,如果你不会这个但是又恰巧会 strcpy 函数,那你就把strcpy函数写出来,还要大概说一下你觉得memcpy函数可以怎样去实现,可能会遇到那些问题等,诸如此类。
2. 涉及让自己评价自己的问题不要说太满。比如让你说自己的缺点,不要把自己说的一无是处,而是挑一个不至于让人一听就对你没有好感的缺点去说。让你说自己的优点,也不要把自己说的十全十美,很可能后面有一个坑等着你去跳,而要挑一个个性的,与众不同的优点。说优缺点的时候最好配以例子进行说明,而是不是干巴巴的总结。
3. 如果问到你还有什么问题想问的吗?千万不要说没了,你要就这所申请的职位或者你本身就感兴趣的东西去问一下面试官。比如你可以问:这个职位在公司里面有多少人啊,主要负责哪条产品线啊等等。
群面(研发类少见)
主要就是无领导小组讨论。网上有很多详细介绍的,这里简单说明几点。 无领导小组讨论会有总结陈词、计时、记录员几个角色,一般来说总结陈词与记录员是一个人总结陈词是高风险、高回报的角色。 个人最建议抢到计时这个角色, 主要负责时间分配遇到有时间要求的个人观点描述一定要注意时间,大家观点都差不多,但是你没超时你就有更多的筹码。
一般群面的步骤如下:1. 个人观点表述;2. 无领导小组讨论;3. 总结发言
签约洽谈就是公司有录用你的意向了,主要就是跟你谈一些公司的福利待遇问题, 下面列出几个个人认为比较重要的问题:
是否有实习试用期时长,劳动协议时长(三年期、五年期)是否有餐补以及住宿是否有补贴每天上下班时间以及一周工作几天年薪(注意除了月薪一定要问下年薪的构成,有的会发放 14 个月或者 13 个月的工资以及年终奖), 每年的调薪考核方式以及调薪幅度入职是否有培训,是一对一的吗入职时的职位分配
一些常见的面试问题
Q:你还有没有什么想问的
A:这个职位在公司里面有多少人啊,主要负责哪条产品线,在公司具体负责哪一块的业务Q:你还有没有什么想展示的
A:这个问题是让你进一步说明你自己会些什么东西,因此你简历上有的他还没问到的或者是你会的但是没有写到简历上面的都可以说出来Q:你认为自己的优缺点有哪些
A:缺点:做事情比较急
优点:做事情之前喜欢做好规划
原则:缺点不要说得太过;优点要找个性的,不要太虚太笼统,结合例子说明。Q:你觉得你的自学能力怎么样(以及其余类似的问题)
A:包括其他让你评价你自己某一方面的能力的时候,注意后面的坑,你确定以及肯定你那方面能力足够的话,你可以说你能力很强,否则不要说太满,而且一般情况下这个问题后面会跟着一个小测试,用来测试你的能力,所以,不确定的千万不要说大话。Q:你对这个工作是否有一定的规划
A:这个问题要结合公司回答,比如我想在公司的带领下和公司一同成长,未来也希望能够参与到公司的管理团队当中去,共同带领公司向前发展。总之不要显得你毫无野心和目标不明确。Q:如果你从公司离职,可能会是什么原因
A:个人发展与公司发展方向不符;公司不能够满足个人发展所需的空间等等Q:你的期望薪资是多少
A:这个问题的原则上是不要给出确切的工资数目
一般情况可以回答:相信公司都有自己的评价标准,希望公司能够根据我的个人能力给出相匹配的工资数目。如果你碰到了比较固执的面试官非要你给出一个确定的薪资数目(看准网上面会有各大公司的匿名薪资统计),你最好已经提前查看过该公司的薪资水平是多少,如果这个公司你很想去,那么你按低于公司平均水平的数目来说,如果这个公司你不是太想去,那你就可以往高了说点。但是说出来的薪资数目一定要有根据,比如你说你参考了公司的薪资水平与当地的消费水平等等。
笔试会有在线笔试以及现场笔试两种类型,像嵌入式软件工程师最常考的就是 C 语言,也会有链表、二叉树、模电、数电、编程以及方面的题。这个主要就是靠平时的积累以及刷题经验,嵌入式软件工程师不需要了解过多的,但是数据结构与
C 语言编程是一定要掌握的。推荐 495 个 C 语言问题, 50 个 C、C++面试题这几个pdf文件,好好看看。最后,最重要的,笔试还是靠平时的积累,多动手编程,多去练习。
一个嵌入式工程师的面试之路
一个嵌入式开发者的面试之路
阿里面试心得
工作—面试-笔试(12)
作者同类文章X
上周发了一个阿里内推的帖子,没想到短时间内就收到了成百上千封简历。
我仔仔细细地看了每一封简历,附带有Gi...
【面试】小米公司嵌入式职位面试经验
面试得很广,从硬件、软件、基础知识、简历内容都有涉及。整个面试持续了将近三个小时,由三位面试官轮流来问,分别偏重硬件、软件、以及综合,但总的来说还是围绕简历和基础知识来问的。第一位面试官面的比较偏重硬...
关于嵌入式面试的一些题
预处理器(Preprocessor)
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 *...
嵌入式软件面试集锦
原帖地址:http://www.amobbs.com/thread--1.html
_I、 __O 、__IO是什么意思?
这是ST库里面的宏定义,定义如下:
今年的就业形式不太好,在过去的两个月,一直处于奔波的状态。今天总算把自己签了出去。首先,要感谢家人、朋友和老师的鼓励和帮助。对自己的面试经历理了理,过去两个月,居然面了多达14家公司。不做统计,不知道...
上传大小:6.49MB &em&面试&/em& 分享 一本对程序员找工作很有帮助的书,...学习&em&ucos&/em&iii先学什么 3C币 64下载
学mcgs买什么书 3C币 33下载
嵌入式实时操作系统&em&uCOS&/em&-II经典实例——基于STM32处理器(第2版)光盘 立即下载 ...嵌入式软件工程师经典&em&面试&/em&题 3C币 38下载
嵌入式软件工程师英语&em&面试&/em& 5C币 36...
记录一下我的大学面试经历,明天开始再也不去面试了。 1:广州海格通信    10.12    西苑宾馆    未过一面       第一次面试,结果相当惨烈。下午3点投的简历,晚上7点在艾默生宣讲会上...
没有更多推荐了,C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。
从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。
从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。
有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器(Preprocessor)
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
?; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
?; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
?; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
?; 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。
2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ( (A) &= (B) ? (A) : (B) )
这个测试是为下面的目的而设的:
?; 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
?; 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
?; 懂得在宏中小心地把参数用括号括起来
?; 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);
3. 预处理器标识#error的目的是什么?
#error 停止编译并显示错误信息
如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
死循环(Infinite loops)
4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
这个问题用几个解决方案。我首选的方案是:
一些程序员更喜欢如下方案:
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。
第三个方案是用 goto
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。
数据声明(Data declarations)
5. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
a) // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
等价于int *(a[10]);
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*max_function)(int a); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?
6. 关键字static的作用是什么?
在C语言中,关键字static有三个明显的作用:
一旦声明为静态变量,在编译时刻开始永远存在,不受作用域范围约束,但是如果是局部静态变量,则此静态变量只能在局部作用域内使用,超出范围不能使用,但是它确实还占用内存,还存在.
?; 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
?; 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,很少人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
7.关键字const有什么含意?
总结:1)只读。2)使用关键字const也许能产生更紧凑的代码。3)使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)
如果应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?
const int *a;
int const *
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:
?; 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
?; 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
?; 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
8. 关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
?; 并行设备的硬件寄存器(如:状态寄存器)
?; 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
?; 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
?; 一个参数既可以是const还可以是volatile吗?解释为什么。
?; 一个指针可以是volatile 吗?解释为什么。
?; 下面的函数有什么错误:int square(volatile int *ptr){return *ptr * *}
下面是答案:
?; 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
?; 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修改一个指向一个buffer的指针时。
?; 这段代码有点变态。这段代码的目的是用来返回指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
return a *
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
return a *
位操作(Bit manipulation)
9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应
?; 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
?; 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
?; 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:
#define BIT3 (0x1 && 3)
void set_bit3(void) {a |= BIT3;}
void clear_bit3(void) {a &= ~BIT3;}
一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。
访问固定的内存位置(Accessing fixed memory locations)
10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa55。
编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is:
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。
中断(Interrupts)
11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展——让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
double area = PI * radius *
printf("/nArea = %f", area);
这个函数有太多的错误了,以至让人不知从何说起了:
?; ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
?; ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
?; 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
?; 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
代码例子(Code examples)
12 . 下面的代码输出是什么,为什么?
void foo(void)
unsigned int a = 6;
int b = -20;
(a+b & 6) ? puts("& 6") : puts("&= 6");
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 "&6"。
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。
13. 评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF; //1's complement of zero
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;
这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。
到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧...
动态内存分配(Dynamic memory allocation)
14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
下面的代码片段的输出是什么,为什么?
if ((ptr = (char *)malloc(0)) == NULL) puts("Got a null pointer");
else puts("Got a valid pointer");
这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是"Got a valid pointer"。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。
15 Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一个扩展为struct s * p1, p2;
上面的代码定义p1为一个指向结构的指针,p2为一个实际的结构,这也许不是你想要的。
第二个例子正确地定义了p3 和p4 两个指针。
晦涩的语法
16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
int a = 5, b = 7,
c = a+++b;
这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c = a++ +
因此, 这段代码持行后a = 6, b = 7, c = 12。
如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。
好了,伙计们,你现在已经做完所有的测试了。这就是我出的C语言测试题,我怀着愉快的心情写完它,希望你以同样的心情读完它。如果是认为这是一个好的测试,那么尽量都用到你的找工作的过程中去吧。
Compare characters in two buffers.
比较两块内存中的字符
int memcmp( const void *buf1, const void *buf2, size_t count );
Sets buffers to a specified character
将内存块设置为指定的字符
Write formatted data to a string
将格式化的数据写到字符串
【嵌入式基础】嵌入式软件开发——嵌入式软件工程师经典笔试题
从CSDN各个博客上摘选的一些容易做错的嵌入式软件的笔试题,做一下记录,让自己记住。1、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)解答:这一题主要容易错的地方就是...
关于嵌入式面试的一些题
预处理器(Preprocessor)
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 *...
嵌入式面试全攻略,记我的一次校招
写在前面:说实话,面了这么多家公司,觉得校招最注重的还是基础能力与理论。对于嵌入式Linux开发类职位来说,最重要的是C语言基本功底,对C语言要了解的十分透彻,比如C语言的面向对象编程,怎么用C语言去...
嵌入式程序员的面试经历
上个月辞职了,这一段时间一直在忙着找工作。之前主要是做机顶盒方面开发的,总感觉技术面有点窄,所以打算往TCP/IP网络和底层发展。
大致看了一下书籍《TCP-IP详解(第一卷)》,《UNIX网络编...
CVTE 嵌入式软件工程师 笔试题
早上考完了CVTE的嵌入式软件工程师的笔试题,昨晚做了android工程师的题,结果发现完全没有相同的,真晕。。。
今天早上去9:30华工参加笔试,题目共20题,包括选择题,填空题,量不大,主要涉及软...
嵌入式程序员C语言笔试经典题目
嵌入式程序员C语言笔试经典题目这是一篇大牛的文章,估计作者是一个做嵌入式软件开发的项目经理,整理一些常用的笔试、面试题目以及一些常见的考点。为了尊重原创,给出地址http://hi.baidu.com...
嵌入式应用软件架构设计
日常工作中,主要的任务是做应用,且经常涉及到应用移植。
要做到嵌入式应用的代码逻辑清晰,且避免重复的造轮子,没有好的应用架构怎么行。
如果嵌入式应用没有好的分层与封装,移植将会是一件很痛苦的事情。
嵌入式软件工程师经典笔试题
& 预处理器(Preprocessor)
1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60...
凹凸笔试题目(嵌入式软件开发)
Embedded Software Design Engineer1 读程序段,回答问题int main(int argc,char *argv[]){int c=9,d=0;c=c++%5;d=c...
2015年嵌入式软件岗位笔试题目总结
2015年嵌入式软件试题1、下面函数用于打印传入的参数,比如:print_cpu_util(10000,&xx&);print_cpu_util(3333,&xy&quo...
没有更多推荐了,

我要回帖

更多关于 嵌入式软件工程师工资 的文章

 

随机推荐