想成为嵌入式程序员应知道的0x10个基本问题
嵌入式工程师工作中的问题与不足
嵌入式工程师工作中的问题与不足1. 引言嵌入式系统是现代科技发展中的重要组成部分,广泛应用于各个领域,如电子设备、汽车、医疗设备等。
嵌入式工程师作为开发和维护嵌入式系统的专业人员,在日常工作中面临着一系列问题与不足。
本文将探讨这些问题,并提供相应的解决方案。
2. 技术更新速度快嵌入式系统的技术更新速度非常快,新的处理器、传感器和通信技术不断涌现,给嵌入式工程师带来了巨大压力。
他们需要不断学习新技术,跟上行业的发展趋势。
然而,由于时间有限,很难对所有新技术进行深入研究和掌握。
解决方案:持续学习是嵌入式工程师必备的能力之一。
可以通过参加行业会议、培训课程和阅读相关书籍来增加自己的知识储备。
此外,建立良好的合作网络也是非常重要的,可以与其他工程师交流经验和学习新技术。
3. 复杂性与可靠性之间的平衡嵌入式系统通常需要在复杂环境中运行,并具有高可靠性的要求。
然而,增加系统的可靠性通常会增加其复杂性。
嵌入式工程师需要在复杂性与可靠性之间进行权衡,以确保系统既能正常运行又能满足用户需求。
解决方案:在设计嵌入式系统时,工程师应该采用模块化和层次化的方法,将系统划分为多个模块,并对每个模块进行独立设计和测试。
此外,使用合适的软件开发方法和工具也可以提高系统的可靠性。
最后,在整个开发过程中进行充分的测试和验证是确保系统可靠性的关键。
4. 资源限制嵌入式系统通常具有资源限制,如处理器速度、内存容量和功耗等。
这些限制给嵌入式工程师带来了一系列挑战。
他们需要在有限的资源下实现功能丰富、高效率和低功耗的系统。
解决方案:优化算法和数据结构是提高嵌入式系统效率的有效方法。
工程师可以使用优化编译器和调试工具来改善代码性能。
此外,合理利用硬件资源,如使用中断、DMA等技术来减少处理器的负载,可以进一步提高系统性能。
5. 实时性要求很多嵌入式系统需要满足实时性要求,即在严格的时间限制下完成任务。
这对嵌入式工程师来说是一个巨大的挑战,因为他们需要设计和实现能够满足实时要求的系统。
C语言typedef用法总结
C语言typedef用法总结黄海涛,2012-3-11C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。
当你一层层剥开它的时候,神秘的面纱终会摘下……让我们一起来探究其中的秘密吧!一、概述1、类型定义符typedefC语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。
定义形式:typedef 原类型名新类型名;它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。
2、实质其实质是:为现有类型取个新名字,它并没有引入新的类型。
typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。
3、作用时机在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。
typedef是由编译器解释的。
▲typedef与#define的区别A.#define后面没有分号,而typedef后面有分号;B.#define不是关键字,而typedef是关键字;C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后;D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如:E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。
4、使用原因1)表达方式更简洁,简化编程;2)使程序参数化,提高程序的可移植性;3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。
5、缺点允许一些看上去混乱的语法,可以把几个声明放在一个声明中。
如:二、使用typedef声明定义时的限制1、2、3、存储类关键字:auto、extern、register、static与typedef但在存储类说明符中,typedef是个例外,它不会真正影响对象的存储特性。
嵌入式工程师面试宝典
初入职场嵌入式工程师面试宝典随着物联网发展的推进,嵌入式技术越来越成为一名高新技术行业,目前市场对此方面的人才需求也相对较大,各大高校也先后开设了此类课程。
但是此专业的学生如何找到一份嵌入式工作?第一:技术为王,作为技术类工作,技术肯定是至关重要的。
如何在短暂的时间向面试官展示你的技术能力?实物展示项目开发经验是最具说服力的,嵌入式技术作为软硬件相结合的技术,简历上写的天花乱坠也比不上一个实物的展示,通过自己制作一个实物,实现一定的智能控制功能,能够清晰的阐述出你设计的原理以及思路,能够分析自己的代码。
不管你展示的项目难易程度高低,至少通过此方法可以让面试官明白第一你是做了精心准备的,是一个负责的人,为了自己的这份工作是用心去准备了的。
态度上能给面试官一个好感。
第二面试官通过你的讲解也能了解到你的大概水平,就算现在技术不到位,至少也知道你是个可造之材,或者知道如何培养你。
所以技术类工作首先得保证手头有货,而刚好相反目前大多数同学都是表现在口头有货。
说到什么技术都知道,ARM11都过时了、A8才是主流,元计算、内核裁剪、系统架构等等。
说起来天花乱坠,但是实际落实到真正动手能力上…东方智达科技致力于单片机、嵌入式培训。
培养模式也是项目实战为主,所以想提高项目实战的同学欢迎来东方智达学习。
第二:态度诚恳,不卑不亢。
面对面试官不需要表现的过分的谦虚谨慎,个人感觉这种人没活力,没底气,就像一个永远不会犯错的小羔羊。
当然本着天下老子第一的态度更不用谈了,毕竟人家现在可以应聘你肯定比你牛X。
话说回来“不气盛,那叫年轻人。
”我就看好有个性的年轻人,充满着自信,这事我能搞定,这种人也许是企业更希望得到的。
第三:面试服饰礼仪。
本文主要针对嵌入式工程师面试,作为技术工种所以建议不要西装革履了,刚毕业的同学花大几千买套西装真不划算,花几百买套劣质西装倒不如好好买套休闲装,看着精神干净。
服饰方面一直提出休闲简约,不要搞的花里胡哨的。
嵌入式系统开发中的常见问题与解决方案
嵌入式系统开发中的常见问题与解决方案嵌入式系统已成为现代科技应用的基石,几乎涉及到我们日常生活中的方方面面。
从手机到家电,从汽车到医疗设备,嵌入式系统无处不在。
然而,在嵌入式系统开发的过程中,常常面临着各种挑战和困扰。
本文将探讨一些嵌入式系统开发中常见的问题,并提供相应的解决方案。
问题一:处理器选择与性能优化嵌入式系统的核心是处理器的选择和性能优化。
一方面,开发人员需要根据系统的要求选择适当的处理器,考虑功耗、性能、成本等因素。
另一方面,处理器性能的优化也是一个重要的任务。
为了提高系统的性能,可以采取以下措施:1. 合理利用处理器的并发性能,根据系统需求选择合适的多核处理器;2. 优化算法和数据结构,尽量减少处理器的计算压力;3. 采用硬件加速技术,如使用硬件加速的图形处理器(GPU)来处理图像;4. 对系统进行优化编译,提高代码执行效率。
问题二:内存管理与资源利用嵌入式系统的内存资源通常比较有限,有效的内存管理和资源利用是开发过程中的关键问题。
以下是一些解决方案:1. 使用编程技术,如动态内存分配和对象池管理,合理分配和回收内存;2. 采用触发式的内存管理策略,及时释放不再使用的内存资源;3. 对关键数据和代码进行优化,减小内存占用空间;4. 使用压缩算法对数据进行压缩,减小存储空间占用。
问题三:实时性与响应性要求许多嵌入式系统需要满足实时性和响应性要求,即在规定的时间内产生响应。
为了解决实时性问题,可以考虑以下措施:1. 使用实时操作系统(RTOS),提供实时任务调度和中断处理机制;2. 优化关键任务的代码,减少执行时间;3. 使用硬件加速技术和并行处理来提高系统的响应速度;4. 对任务进行优先级管理,确保关键任务的及时响应。
问题四:通信与网络连接嵌入式系统通常需要进行通信和网络连接,与其他设备进行数据交换和远程控制。
以下是解决通信与网络连接的一些方法:1. 选择合适的通信协议和接口,如UART、SPI、I2C等;2. 使用高效的通信机制,如消息队列、信号量等,确保数据传输的可靠性和实时性;3. 采用网络通信技术,如以太网、Wi-Fi和蓝牙等,与其他设备进行远程通信和控制;4. 设计适当的网络协议和安全机制,保护系统数据的安全性。
想成为嵌入式程序员应知道的0x10个基本问题
想成为嵌入式程序员应知道的0x10个基本问题想成为嵌入式程序员应知道的0x10个基本问题: 预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2 . 写一个\标准\宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B)) 这个测试是为下面的目的而设的:1) 标识#define在宏中应用的基本知识。
这是很重要的。
因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。
这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3) 懂得在宏中小心地把参数用括号括起来4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b); 3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。
这问题对区分一个正常的伙计和一个书呆子是很有用的。
只有书呆子才会读C语言课本的附录去找出象这种问题的答案。
嵌入式软件工程师笔试题华为面试宝典
1、将一个字符串逆序2、将一个链表逆序3、计算一个字节里(byte)里面有多少bit被置14、搜索给定的字节(byte)5、在一个字符串中找到可能的最长的子字符串6、字符串转换为整数7、整数转换为字符串/** 题目:将一个字符串逆序* 完成时间:2006.9.30深圳极讯网吧* 版权归刘志强所有* 描述:写本程序的目的是希望练一下手,希望下午去面试能成功,不希望国庆节之后再去找工作拉!*/#include <iostream>using namespace std;//#define NULL ((void *)0)char * mystrrev(char * const dest,const char * const src){if (dest==NULL && src==NULL) return NULL;char *addr = dest;int val_len = strlen(src);dest[val_len] = '\0';int i;for (i=0; i<val_len; i++){*(dest+i) = *(src+val_len-i-1); }return addr;}main(){char *str="asdfa";char *str1=NULL;str1 = (char *)malloc(20);if (str1 == NULL)cout<<"malloc failed";cout<<mystrrev(str1,str);free(str1);str1=NULL;//杜绝野指针}p=head;q=p->next;while(q!=NULL){temp=q->next;q->next=p;p=q;q=temp;}这样增加个辅助的指针就行乐。
ok 通过编译的代码:#include <stdio.h>#include <ctype.h>#include <stdlib.h>typedef struct List{int data;struct List *next;}List;List *list_create(void){struct List *head,*tail,*p;int e;head=(List *)malloc(sizeof(List));tail=head;printf("\nList Create,input numbers(end of 0):"); scanf("%d",&e);while(e){p=(List *)malloc(sizeof(List));p->data=e;tail->next=p;tail=p;scanf("%d",&e);}tail->next=NULL;return head;}List *list_reverse(List *head) {List *p,*q,*r;p=head;q=p->next;while(q!=NULL){r=q->next;q->next=p;p=q;q=r;}head->next=NULL;head=p;return head;}void main(void){struct List *head,*p;int d;head=list_create();printf("\n");for(p=head->next;p;p=p->next)printf("--%d--",p->data);head=list_reverse(head);printf("\n");for(p=head;p->next;p=p->next)printf("--%d--",p->data);}编写函数数N个BYTE的数据中有多少位是1。
嵌入式系统工程师面试题及答案
嵌入式系统工程师面试题及答案一、基础知识1、什么是嵌入式系统?答:嵌入式系统是一种以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。
它通常嵌入在其他设备或产品中,用于控制、监测或执行特定的任务。
2、嵌入式系统的特点有哪些?答:嵌入式系统具有以下特点:专用性强:针对特定应用需求进行定制开发。
实时性要求高:需要在规定的时间内完成任务响应。
资源受限:处理器性能、内存容量、存储等资源相对有限。
功耗低:通常要求在电池供电或低功耗环境下长时间运行。
可靠性高:在恶劣环境下稳定工作,故障率低。
3、列举几种常见的嵌入式处理器架构。
答:常见的嵌入式处理器架构有:ARM、MIPS、PowerPC、X86 等。
4、什么是中断?中断处理的过程是怎样的?答:中断是指计算机在执行程序过程中,遇到需要紧急处理的事件时,暂停当前程序的执行,转而去执行相应的中断服务程序。
中断处理的过程通常包括:中断请求、中断响应、中断处理、中断返回。
二、操作系统1、列举几种常见的嵌入式操作系统。
答:常见的嵌入式操作系统有:Linux、μC/OSII、FreeRTOS、VxWorks 等。
2、实时操作系统和非实时操作系统的区别是什么?答:实时操作系统对任务的响应时间有严格的要求,必须在规定的时间内完成任务处理,否则可能导致系统故障或错误。
非实时操作系统则对任务响应时间没有严格限制,更注重系统的资源利用率和功能完整性。
3、简述嵌入式操作系统的任务调度算法。
答:常见的任务调度算法有:优先级调度:根据任务的优先级来决定任务的执行顺序,优先级高的任务先执行。
时间片轮转调度:将 CPU 时间分成固定的时间片,每个任务轮流获得时间片执行。
混合调度:结合优先级和时间片轮转的调度方式。
三、编程语言1、嵌入式系统中常用的编程语言有哪些?答:C 语言和C++语言是嵌入式系统中最常用的编程语言。
此外,还有汇编语言、Python 等在特定场景下也会使用。
嵌入式面试经典100题
嵌入式面试经典100题嵌入式系统是当今快速发展的领域之一。
面试官通常会问一些经典的问题来评估求职者的知识和技能。
以下是 100 个嵌入式面试经典问题,有助于准备嵌入式面试。
1. 什么是嵌入式系统?2. 嵌入式系统有哪些组成部分?3. 嵌入式系统通常用于哪些领域?4. 什么是微控制器?5. 微控制器有哪些类型?6. 解释一下位运算符。
7. 什么是布尔运算?8. 解释一下存储器分段。
9. 什么是中断?10. 解释一下中断向量表。
11. 什么是浮点数?12. 解释一下浮点数运算。
13. 什么是传感器?14. 解释一下传感器工作原理。
15. 什么是执行器?16. 解释一下执行器工作原理。
17. 什么是总线?18. 解释一下总线工作原理。
20. 解释一下串口工作原理。
21. 什么是以太网?22. 解释一下以太网工作原理。
23. 什么是蓝牙?24. 解释一下蓝牙工作原理。
25. 什么是 Wi-Fi?26. 解释一下 Wi-Fi 工作原理。
27. 什么是 LED?28. 解释一下 LED 工作原理。
29. 什么是 LCD?30. 解释一下 LCD 工作原理。
31. 什么是纽扣电池?32. 解释一下纽扣电池工作原理。
33. 什么是定时器?34. 解释一下定时器工作原理。
35. 什么是串口通信?36. 解释一下串口通信原理。
37. 什么是 FPGA?38. 解释一下 FPGA 工作原理。
39. 什么是 PLC?40. 解释一下 PLC 工作原理。
42. 解释一下触摸屏工作原理。
43. 什么是传感器数据采集?44. 解释一下传感器数据采集原理。
45. 什么是 PWM?46. 解释一下 PWM 工作原理。
47. 什么是功率放大器?48. 解释一下功率放大器工作原理。
49. 什么是串口通信协议?50. 解释一下串口通信协议原理。
51. 什么是温度传感器?52. 解释一下温度传感器工作原理。
53. 什么是湿度传感器?54. 解释一下湿度传感器工作原理。
嵌入式系统开发中的常见问题与解决方案
嵌入式系统开发中的常见问题与解决方案嵌入式系统是一种运行在特定硬件平台上的计算机系统,通常用于控制、监测和执行特定任务。
随着技术的不断发展,嵌入式系统在日常生活中扮演着越来越重要的角色,它们被广泛应用于汽车、家电、医疗设备、工业自动化等领域。
然而,在嵌入式系统开发的过程中,经常会遇到一些常见的问题。
本文将介绍一些常见问题及其解决方案,帮助开发人员更好地应对挑战。
1. 固件接口问题在嵌入式系统开发过程中,常常会面临与硬件的接口问题。
不同的硬件平台可能有不同的接口规范,因此开发人员需要了解并掌握各种接口标准。
如果遇到与硬件接口不兼容的情况,可以尝试使用硬件适配器或接口转换器来解决。
2. 系统稳定性问题稳定性是嵌入式系统开发的重要考虑因素。
在开发过程中,可能会遇到系统崩溃、死机或数据丢失等问题。
为了解决这些问题,开发人员可以采用以下措施: - 严格遵循软件工程实践,如代码审查、单元测试和集成测试等,以确保软件质量。
- 使用合适的调试工具和技术,如断点调试和虚拟仿真,以帮助发现和修复问题。
- 优化系统资源的使用,如内存管理和任务调度,以提高系统性能和稳定性。
3. 资源限制问题嵌入式系统通常具有有限的资源,如内存、存储和计算能力。
在开发过程中,需要谨慎管理和利用这些资源。
以下是几种解决方案:- 优化算法和数据结构,以减少资源消耗和提高系统性能。
- 使用压缩算法或数据压缩技术,以减少存储空间的使用。
- 使用硬件加速器或并行处理技术,以提高系统的计算能力。
4. 实时性问题许多嵌入式系统需要实时响应,即按预定时间完成特定任务。
实时性问题可能导致系统性能下降或任务无法按时完成。
以下是几种解决方案:- 使用实时操作系统(RTOS)或实时调度器,以确保任务按照优先级顺序运行。
- 优化系统的任务调度算法,以减少任务切换的开销。
- 使用硬件定时器或中断机制,以确保关键任务的准确执行时间。
5. 电源管理问题对于移动设备或便携式嵌入式系统,电池寿命是一个重要问题。
嵌入式工程师面试基础知识问答
嵌入式工程师面试基础知识问答C 语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。
这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试是相当有趣的。
从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。
这个测试只是出题者为显示其对ANSI 标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ASCII 值。
这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式系统上。
如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。
从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。
不管怎么样,看一下这人如何回答他不会的问题也是满有趣。
应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。
有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮助。
这些问题都是我这些年实际碰到的。
其中有些题很难,但它们应该都能给你一点启迪。
这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。
为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器( PREPROCESSOR)1 . 用预处理指令#DEFINE 声明一个常数,用以表明1 年中有多少秒(忽略闰年问题)#DEFINE SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1)#DEFINE 语法的基本知识(例如:不能以分号结束,括号的使用,2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
嵌入式面试题大全
嵌入式面试题大全
嵌入式面试题涉及的知识面广泛,包括嵌入式系统的基础知识、C/C++语言、操作系统、电路和电子技术等。
以下是一些嵌入式面试中常见的题目:
1. 请简述嵌入式系统的定义和特点。
2. 什么是实时操作系统?请列举几个常见的实时操作系统。
3. 描述一下嵌入式系统中常用的数据结构和算法。
4. 请简述嵌入式软件开发的一般流程。
5. 什么是嵌入式系统的低功耗设计?为什么它很重要?
6. 请简述嵌入式系统中常用的通信协议。
7. 请简述嵌入式系统中常用的硬件接口。
8. 如何进行嵌入式系统的电源管理?
9. 请简述嵌入式系统中常用的软件架构。
10. 如何进行嵌入式系统的性能测试和优化?
11. 请简述嵌入式系统中常用的开发工具和调试方法。
12. 如何进行嵌入式系统的安全设计和保护?
13. 请简述嵌入式系统中的常见故障和解决方法。
14. 如何进行嵌入式系统的可维护性和可靠性设计?
15. 请简述嵌入式系统中的中断处理和任务调度。
16. 如何进行嵌入式系统的硬件设计和软件设计协同工作?
17. 请简述嵌入式系统中常用的异步通信方法。
18. 如何进行嵌入式系统的资源管理和内存优化?
19. 请简述嵌入式系统中的多线程编程和多任务管理。
20. 如何进行嵌入式系统的性能分析和优化?
以上是一些常见的嵌入式面试题,当然具体的题目还会根据具体的岗位和要求有所不同。
建议在准备面试时,除了掌握基础知识和技能外,还要了解相关公司的业务和技术方向,以及行业的发展趋势和最新技术动态。
嵌入式软件测试的10个方法总结
嵌入式软件测试的10个方法总结这十条秘诀在业界广为流传,使很多人受益。
本文围绕这十条秘诀展开论述。
1.懂得使用工具通常嵌入式系统对可靠性的要求比较高。
嵌入式系统安全性的失效可能会导致灾难性的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失。
这就要求对嵌入式系统,包括嵌入式软件进行严格的测试、确认和验证。
随着越来越多的领域使用软件和微处理器控制各种嵌入式设备,对日益复杂的嵌入式软件进行快速有效的测试愈加显得重要。
就像修车需要工具一样,好的程序员应该能够熟练运用各种软件工具。
不同的工具,有不同的使用范围,有不同的功能。
使用这些工具,你可以看到你的系统在干些什么,它又占用什么资源,它到底和哪些外界的东西打交道。
让你郁闷好几天的问题可能通过某个工具就能轻松搞定,可惜你就是不知道。
那么为什么那么多的人总是在折腾个半死之后才想到要用测试工具呢?原因很多,主要有两个。
一个是害怕,另一个是惰性。
害怕是因为加入测试工具或测试模块到代码需要技巧同时有可能引入新的错误,所以他们总喜欢寄希望于通过不断地修改重编译代码来消除bug,结果却无济于事。
懒惰是因为他们习惯了使用printf之类的简单测试手段。
下面来介绍一些嵌入式常用的测试工具。
源码级调试器[Source-levelDebugger]这种调试器一般提供单步或多步调试、断点设置、内存检测、变量查看等功能,是嵌入式调试最根本有效的调试方法。
比如VxWorksT ornadoII提供的gdb就属于这一种。
简单实用的打印显示工具[printf]printf或其它类似的打印显示工具估计是最灵活最简单的调试工具。
打印代码执行过程中的各种变量可以让你知道代码执行的情况。
但是,printf对正常的代码执行干扰比较大(一般printf占用CPU比较长的时间),需要慎重使用,最好设置打印开关来控制打印。
ICE或JTAG调试器[In- circuitEmulator]ICE是用来仿真CPU核心的设备,它可以在不干扰运算器的正常运行情况下,实时的检测CPU 的内部工作情况。
C语言#define用法总结
C语言#define用法总结黄海涛,2012-3-3如果你还在为使用#define而迷茫,那请阅读这篇文章;如果读完之后你还在迷茫,那请哪天心情好了,再回来读一遍。
:)欢迎跟着我的思路走……一、概述1、宏定义在C语言中,以#开头的为预处理命令。
定义形式:2、本质其本质是:使用宏定义中的字符串替换(Substitution)宏名。
这只是一种简单的代换,预处理程序对它不作任何检查。
如有错误,只能在编译已被宏展开后的源程序时发现。
3、替换时机预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。
由预处理程序负责完成。
在源程序被编译之前,宏替换已经完成,其流程如下:源程序→预处理程序→预处理后的源程序→编译器4、作用域其作用域为宏定义命令起到源程序结束。
如要终止其作用域可使用# undef命令。
5、优缺点▲优点:宏定义使用得当,可以防止出错,提高可移植性,可读性等等;减少函数调用的开销。
▲缺点:可能存在参数副作用;展开后可能比函数调用开销更大。
※规则一:保证在宏替换之后不会发生错误。
二、无参宏定义1、定义的一般形式#define identifier token-sequence#define 标识符字符串2、简单常量●约束1:宏名通常采用易读大写字母表示。
●约束2:宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起替换。
●约束3:宏名在源程序中若用引号引起来,则预处理程序不对其作宏替换。
如:3、字符串为表达式※规则二:无参宏定义中字符串为表达式(即含有运算符),必须加小括号()。
可见,有括号与无括号差别很大,请小心加括号,保证展开后是你所期望的。
参考规则一。
4、5、6三、带参宏定义对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
1、带参宏定义的一般形式为:#define identifier(identifier-list) token-sequence#define 宏名(形参表) 字符串在字符串中含有各个形参,形参是标识符。
嵌入式软件开发面试题
嵌入式软件开发面试题嵌入式软件开发是一种专门针对嵌入式系统的软件开发方法,相较于传统的软件开发,嵌入式软件开发更加注重对硬件平台的适配和资源的优化。
在嵌入式软件开发行业中,招聘过程中会涉及到一些特定的面试题,以考察应聘者的技术能力和解决问题的能力。
以下将介绍一些常见的嵌入式软件开发面试题。
一、操作系统相关题目1. 请介绍一下你对实时操作系统(RTOS)的理解及其特点。
答:实时操作系统是一种能够保证任务在严格时间要求下进行调度的操作系统。
其特点是:能够快速响应外部事件;能够处理实时数据流;能够优先级调度任务;能够提供可预测的延迟。
2. 请解释一下进程和线程的区别。
答:进程是操作系统中资源分配和调度的基本单位,拥有独立的地址空间和系统资源;线程是进程中的一个独立执行单元,多个线程可以共享同一个进程的资源。
二、编程相关题目1. 请编写一个C语言函数,实现对一个数组进行升序排序。
答:```cvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}```2. 请编写一个函数,计算一个整数的阶乘。
答:```cint factorial(int n) {if (n == 0 || n == 1) {return 1;} else {return n * factorial(n-1);}}```三、硬件相关题目1. 请介绍一下嵌入式系统中常用的总线协议有哪些,它们有什么特点?答:常用的总线协议有SPI(Serial Peripheral Interface)、I2C (Inter-Integrated Circuit)、CAN(Controller Area Network)等。
嵌入式面试题及答案
嵌入式面试题及答案嵌入式系统是当今科技领域中一项重要的技术,广泛应用于各个行业。
对于嵌入式系统开发人员来说,掌握面试中常见的问题和答案,可以帮助他们在面试中脱颖而出。
本文将介绍一些常见的嵌入式面试题目,并给出相应的答案。
1. 什么是嵌入式系统?嵌入式系统是指嵌入在其他设备或系统中的计算机系统,包括硬件和嵌入式软件。
它的设计目标是完成特定的功能或任务,通常包括实时性、稳定性和低功耗等特点。
2. 嵌入式系统和普通计算机有什么区别?嵌入式系统和普通计算机相比,主要区别在于应用场景和设计目标。
嵌入式系统通常被用于特定的设备或系统中,如汽车、智能手机、医疗设备等,并且通常需要满足实时性、低功耗等特点。
而普通计算机则面向更通用的计算任务,如个人电脑、服务器等。
3. 嵌入式系统的开发流程是怎样的?嵌入式系统的开发流程包括需求分析、系统设计、硬件设计、软件开发、测试和验证等阶段。
- 需求分析:明确系统的功能需求,包括输入、输出、性能要求等。
- 系统设计:确定系统的整体架构、硬件平台和软件组件,制定系统设计规范。
- 硬件设计:根据系统设计规范,设计硬件电路,包括选型、原理图设计、PCB设计等。
- 软件开发:根据系统设计规范,开发嵌入式软件,包括驱动程序、操作系统、应用程序等。
- 测试和验证:对嵌入式系统进行功能验证、性能测试、稳定性测试等,确保系统的质量和可靠性。
4. 嵌入式系统中常用的实时操作系统有哪些?常用的实时操作系统包括FreeRTOS、VxWorks、QNX等。
这些实时操作系统具有高度可靠性和实时性能,适用于嵌入式系统开发。
5. 嵌入式系统中常用的通信接口有哪些?常用的通信接口包括UART、SPI、I2C、CAN、USB等。
这些通信接口可用于嵌入式系统与外部设备之间的数据交换和通信。
6. 如何提高嵌入式系统的性能?提高嵌入式系统性能的方法有多种,包括优化算法、增加处理器的主频、增加缓存容量、优化代码等。
嵌入式软件工程师面试题及答案
嵌入式软件工程师面试题及答案在嵌入式软件工程师的招聘过程中,面试是一个非常重要的环节。
面试题涵盖了对求职者技能、经验和知识的全面了解,同时也考察了求职者的逻辑思维能力和解决问题的能力。
下面将列举一些常见的嵌入式软件工程师面试题及答案,希望对即将面试的求职者有所帮助。
一、嵌入式系统基础知识1. 什么是嵌入式系统?答:嵌入式系统是一种特殊用途的计算机系统,通常被嵌入到其他设备中,具有实时性、低功耗和小型化等特点,用于控制设备和实现特定功能。
2. 嵌入式系统和通用计算机系统的区别是什么?答:嵌入式系统主要用于特定的应用场景,通常具有固定的功能和任务,而通用计算机系统可以处理各种应用程序,用户可以随意安装软件。
3. 嵌入式软件开发的主要语言有哪些?答:嵌入式软件开发常用的语言包括C、C++、Assembly语言等,其中C语言应用最为广泛。
二、硬件相关问题1. 请解释一下什么是中断?答:中断是一种硬件或软件引起的处理器执行流的突然中断,用于处理系统中的紧急事件或异步事件。
2. 为什么要使用DMA(直接存储器访问)?答:DMA可以实现在处理器不参与的情况下进行数据传输,提高数据传输效率,减轻处理器负担。
3. 请介绍一下嵌入式系统中常用的总线协议有哪些?答:常用的总线协议包括SPI、I2C、CAN、USB等,用于不同设备之间的数据传输和通信。
三、操作系统相关问题1. 什么是裸机程序?答:裸机程序是在没有操作系统支持的情况下直接在处理器上运行的程序,通常用于简单的嵌入式系统中。
2. 嵌入式系统中常用的操作系统有哪些?答:常用的嵌入式操作系统包括FreeRTOS、uC/OS、VxWorks等,根据系统需求选择合适的操作系统。
3. 请解释一下进程和线程的区别?答:进程是操作系统中资源分配的最小单位,具有独立的地址空间和控制结构;线程是进程内的执行单元,共享进程的地址空间和资源。
四、软件开发相关问题1. 请介绍一下嵌入式软件的调试方法?答:嵌入式软件的调试方法包括仿真调试、硬件调试、打印调试等,通过不同方式查找和解决软件中的问题。
嵌入式系统开发中的问题分析与解决方法
嵌入式系统开发中的问题分析与解决方法嵌入式系统是一种特殊的计算机系统,它被嵌入到其他更大的系统或设备中,具有特定的功能和任务。
在嵌入式系统开发过程中,可能会遇到各种各样的问题,这些问题需要经过深入的分析和解决。
本文章将讨论嵌入式系统开发中常见的问题,并提供相应的解决方法。
一、硬件问题在嵌入式系统开发中,硬件问题是比较常见的。
例如,硬件组件的连接问题,不良的元器件,电源问题等。
这些问题可能导致系统无法正常工作或者性能下降。
要解决这些问题,可以采取以下方法:1. 仔细检查硬件连接:检查硬件连接是否正确,检查插头和插座之间是否有松动或脱落。
确保连接牢固可靠。
2. 替换不良元器件:如果发现某个元器件损坏或不良,应及时替换。
例如,替换坏掉的电容、电阻或集成电路等。
3. 检查电源问题:检查电源线是否连接正确,检查电池是否有电,检查电源供应是否稳定。
如果电源问题导致系统无法正常工作,可以尝试使用稳定的外部电源。
二、软件问题除了硬件问题,嵌入式系统开发中还常常遇到软件问题。
例如,操作系统错误、驱动程序问题、编程错误等。
以下是一些解决软件问题的方法:1. 检查操作系统错误:如果嵌入式系统使用操作系统,那么操作系统错误可能导致系统崩溃或运行缓慢。
在这种情况下,可以通过检查系统日志或使用调试工具来诊断和解决操作系统错误。
2. 修复驱动程序问题:驱动程序是嵌入式系统与硬件设备之间的桥梁。
如果驱动程序出现问题,可能导致硬件设备无法正常工作。
要解决这个问题,可以尝试更新驱动程序或者重新安装驱动程序。
3. 调试编程错误:编程错误常常会导致嵌入式系统发生异常或者运行不正常。
要解决这个问题,可以使用调试工具来跟踪程序的执行,查找和修复错误。
三、性能问题除了硬件和软件问题,性能问题是嵌入式系统开发中常见的另一个挑战。
性能问题可能包括响应时间过长、功耗过高、资源利用不充分等。
以下是一些解决性能问题的方法:1. 优化代码:优化代码可以提高嵌入式系统的执行效率。
嵌入式入职试题
嵌入式入职试题嵌入式系统是一种将计算和控制功能嵌入到设备或系统中的计算机技术。
在这个快速发展的领域中,拥有嵌入式系统相关技能和知识的人才需求不断增加。
为了能够选拔到最合适的人才,许多公司会采用入职试题来评估应聘者的能力和经验。
下面是一份嵌入式入职试题,希望您能根据题目进行回答:问题一:请简述嵌入式系统的定义和特点。
嵌入式系统是将计算和控制功能嵌入到设备或系统中的计算机技术。
它通常被用于控制和管理各种电子设备,如家电、医疗器械、汽车等。
嵌入式系统的特点包括实时性、稳定性、可靠性和低功耗等。
在设计嵌入式系统时,需要考虑资源受限、实时性要求高等因素。
问题二:请解释什么是中断,并分别介绍硬件中断和软件中断。
中断是指在程序执行过程中,由于发生了某个事件,导致程序的正常执行被暂停,转而执行与该事件相关的处理程序。
硬件中断是由外部设备的信号触发的,如定时器中断和外部设备的输入输出中断;而软件中断是由程序中的特定指令触发的,用于实现程序的功能调用和系统服务等。
问题三:请简述嵌入式系统的开发流程,并说明每个阶段的关键步骤。
嵌入式系统的开发流程通常包括需求分析、系统设计、软件开发、硬件设计、集成调试和验证测试等阶段。
关键步骤如下:1. 需求分析:明确系统的功能需求和性能指标,制定详细的需求规格。
2. 系统设计:根据需求规格,设计系统的总体架构,确定硬件和软件的划分和接口设计。
3. 软件开发:根据系统设计,编写软件代码,并进行单元测试和集成测试。
4. 硬件设计:根据需求规格和系统设计,设计嵌入式系统的硬件电路图和PCB布局,并进行硬件测试和验证。
5. 集成调试:将软件和硬件进行整合,进行系统级调试,确保系统功能正常。
6. 验证测试:对整个系统进行验证测试,包括功能测试、性能测试和可靠性测试等。
问题四:请简述嵌入式系统中的存储器分类及其特点。
嵌入式系统中的存储器可以分为非易失性存储器(NVM)和易失性存储器(RAM)。
嵌入式软件工程师经典面试题(附答案)(二)
嵌⼊式软件⼯程师经典⾯试题(附答案)(⼆)⼀、基本介绍嵌⼊式系统是以应⽤为中⼼,以计算机技术为基础,并且软硬件可裁剪,适⽤于应⽤系统对功能、可靠性、成本、体积、功耗有严格要求的专⽤计算机系统。
它⼀般由、外围硬件设备、以及⽤户的应⽤程序等四个部分组成,⽤于实现对其他设备的控制、监视或管理等功能。
嵌⼊式软件⼯程师就是编写嵌⼊式系统的⼯程师。
⼆、职业要求应具备哪些能⼒1.最重要的是C语⾔编程,以及C++,这个与你读程,应⽤,开发项⽬,做系统移植息息相关;2.操作系统: LINUX,WINCE等,⾄少学习过⼀种,并且还需要对些基础知识有蛮多的了解;3.对ARM,FPGA,DSP等这些硬件⽐较了解。
这是最常规的条件当然,⼀些基本素质,像英语能⼒,团队协作能管理,也很重要。
三、经典⾯试题1.嵌⼊式系统中经常要⽤到⽆限循环,如何⽤C编写死循环?while(1){}或者for(;;)2.程序的局部变量存在于哪⾥,全局变量存在于哪⾥,动态申请数据存在于哪⾥?程序的局部变量存在于栈区;全局变量存在于静态区;动态申请数据存在于堆区3.关键字const有什么含义?1)只读。
2)使⽤关键字const也许能产⽣更紧凑的代码。
3)使编译器很⾃然地保护那些不希望被改变的参数,防⽌其被⽆意的代码修改4.请问以下代码有什么问题?int main() {char a;char *str=&a;strcpy(str,"hello");printf(str);return 0;}没有为str分配内存空间,将会发⽣异常,问题出在将⼀个字符串复制进⼀个字符变量指针所指地址。
虽然可以正确输出结果,但因为越界进⾏内在读写⽽导致程序崩溃5.已知⼀个数组table,⽤⼀个宏定义,求出数据的元素个数?#define NTBL (sizeof(table)/sizeof(table[0]))6.写⼀个"标准"宏MIN ,这个宏输⼊两个参数并返回较⼩的⼀个?#define MIN(A,B) ((A) <= (B) ? (A) : (B))考点:1) 标识#define在宏中应⽤的基本知识。
嵌入式硬件面试题
1、下面是一些基本的数字电路知识问题,请简要回答之。
(1) 什么是Setup和Hold 时间?答:Setup/Hold Time 用于测试芯片对输入信号和时钟信号之间的时间要求。
建立时间(Setup Time)是指触发器的时钟信号上升沿到来以前,数据能够保持稳定不变的时间。
输入数据信号应提前时钟上升沿(如上升沿有效)T 时间到达芯片,这个 T就是建立时间通常所说的 SetupTime。
如不满足 Setup Time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿到来时,数据才能被打入触发器。
保持时间(Hold Time)是指触发器的时钟信号上升沿到来以后,数据保持稳定不变的时间。
如果 Hold Time 不够,数据同样不能被打入触发器。
(2) 什么是竞争与冒险现象?怎样判断?如何消除?答:在组合逻辑电路中,由于门电路的输入信号经过的通路不尽相同,所产生的延时也就会不同,从而导致到达该门的时间不一致,我们把这种现象叫做竞争。
由于竞争而在电路输出端可能产生尖峰脉冲或毛刺的现象叫冒险。
如果布尔式中有相反的信号则可能产生竞争和冒险现象。
解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。
(3) 请画出用 D 触发器实现 2 倍分频的逻辑电路答:(4) 什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?答:线与逻辑是两个或多个输出信号相连可以实现与的功能。
在硬件上,要用 OC 门来实现( 漏极或者集电极开路),为了防止因灌电流过大而烧坏 OC 门, 应在 OC 门输出端接一上拉电阻(线或则是下拉电阻)。
(5) 什么是同步逻辑和异步逻辑?同步电路与异步电路有何区别?答:同步逻辑是时钟之间有固定的因果关系。
异步逻辑是各时钟之间没有固定的因果关系 .电路设计可分类为同步电路设计和异步电路设计。
同步电路利用时钟脉冲使其子系统同步运作,而异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和“完成”信号使之同步。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
想成为嵌入式程序员应知道的0x10个基本问题.txt人永远不知道谁哪次不经意的跟你说了再见之后就真的再也不见了。
一分钟有多长?这要看你是蹲在厕所里面,还是等在厕所外面……这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。
为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。
记住,第一印象很重要。
2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))这个测试是为下面的目的而设的:1) 标识#define在宏中应用的基本知识。
这是很重要的。
因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。
这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3) 懂得在宏中小心地把参数用括号括起来4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);3. 预处理器标识#error的目的是什么?如果你不知道答案,请看参考文献1。
这问题对区分一个正常的伙计和一个书呆子是很有用的。
只有书呆子才会读C语言课本的附录去找出象这种问题的答案。
当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。
死循环(Infinite loops)4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。
我首选的方案是:while(1){}一些程序员更喜欢如下方案:for(;;){}这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。
如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。
如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。
"这会给我留下一个坏印象。
第三个方案是用 gotoLoop:...goto Loop;应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。
数据声明(Data declarations)5. 用变量a给出下面的定义a) 一个整型数(An integer)b)一个指向整型数的指针( A pointer to an integer)c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)rd)一个有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 tofunctions that take an integer argument and return an integer )答案是:a) int a; // An integerb) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integerd) int a[10]; // An array of 10 integerse) int *a[10]; // An array of 10 pointers to integersf) int (*a)[10]; // A pointer to an array of 10 integersg) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integerh) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。
当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。
但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。
因为在被面试的这段时间里,我确定我知道这个问题的答案。
应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?Static6. 关键字static的作用是什么?这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
Const7.关键字const有什么含意?我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。
去年DanSaks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded SystemsProgramming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。
尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。
(如果你想知道更详细的答案,仔细读一下Saks的文章吧。
)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;/******/前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。
顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。
)2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
简而言之,这样可以减少bug的出现。
Volatile8. 关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:1) 并行设备的硬件寄存器(如:状态寄存器)2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3) 多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。
我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。
搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。
不懂得volatile的内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1)一个参数既可以是const还可以是volatile吗?解释为什么。
2); 一个指针可以是volatile 吗?解释为什么。
3); 下面的函数有什么错误:int square(volatile int *ptr){return *ptr * *ptr;}下面是答案:1)是的。
一个例子是只读的状态寄存器。
它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它。