嵌入式软件工程师经典面试题127道(一)
1、int a[10]={1,2,3,4,5,6,7,8,9,0};int *p=&a[1];则p[6]等于8
2、整数数组清零:bzero(),memset()。
3、sizeof();测试变量所占地址的字节数
4、 main() { char *str[]={"ab","cd","ef","gh","ij","kl"}; char *t; t=(str+4)[-1]; printf("%s",t); }则显示"gh"
5、小端:低位字节数据存储在低地址大端:高位字节数据存储在低地址例如:int a=0x12345678;(a首地址为0x2000)0x2000 0x2001 0x2002 0x20030x12 0x34 0x56 0x78 大端格式
6、异步IO和同步IO区别如果是同步IO,当一个IO操作执行时,应用程序必须等待,直到此IO执行完,相反,异步IO操作在后台运行,IO操作和应用程序可以同时运行,提高系统性能,提高IO流量; 在同步文件IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行,而异步文件IO中,线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,将会通知线程IO操作完成了。
7、用变量a定义一个整型数 int a;一个指向整型数的指针 int *a;一个指向指针的指针,它指向的指针式指向一个整型数 int **a;一个有10个整型数的数组 int a[10];一个有10指针的数组,该指针是指向一个整型数 int *a[10];一个指向有10个整型数数组的指针 int (*a)[10];一个指向函数的指针,该函数有一个整型数参数并返回一个整型数 int (*a)(int);一个有10个指针的数组,该指针指向一个函数,该函数有一个整型数参数并返回一个整型 int (*a[10])(int);
8、int foo(void){int i;char c=0x80;i=c;if(i>0)return 1;return 2;}返回值为2;因为i=c=-128;如果c=0x7f,则i=c=127。
9、a=b*2;a=b/4;a=b%8;a=b/8*8+b%4;a=b*15;效率最高的算法a=b*2 -> a=b<<1;a=b/4 -> a=b>>2;a=b%8 -> a=b&7;a=b/8*8+b%4 -> a=((b>>3)<<3)+(b&3)a=b*15 -> a=(b<<4)-b
10、c关键字
c的关键字共32个*数据类型关键字(12)char,short,int,long,float,double,unsigned,signed,union,enum,void,struct*控制语句关键字(12)if,else,switch,case,default,for,do,while,break,continue,goto,return*存储类关键字(5)auto,extern,register,static,const*其他关键字(3)sizeof,typedef,volatile
11、int main(void){unsigned int a = 6;int b = -20;char c;(a+b>6)?(c=1):(c=0);}则c=1,但a+b=-14;如果a为int类型则c=0。原来有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数),比如上面 (a+b)>6这个比较运算,a+b=-14,-14的补码为1111111111110010。此数进行比较运算时,被当成了无符号数,它远远大于6,所以得到上述结果。
12、给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit,在以上两个操作中,要保持其它位不变。#define BIT3 (0x1<<3) static int a; void set_bit3(void) { a |= BIT3; } void clear_bit3(void) { a &= ~BIT3; }
13、要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。 int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa66;(建议用这种) 一个较晦涩的方法是: *(int * const)(0x67a9) = 0xaa66;
14、中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表性的是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。__interrupt void compute_area (void) { double area = PI * radius * radius; printf(" Area = %f", area); return area; } ISR不可能有参数和返回值的!ISR尽量不要使用浮点数处理程序,浮点数的处理程序一般来说是不可重入的,而且是消耗大量CPU时间的!!printf函数一般也是不可重入的,UART属于低速设备,printf函数同样面临大量消耗CPU时间的问题!
15、评价下面的代码片断: unsigned int zero = 0; unsigned int compzero = 0xFFFF; /*1's complement of zero */ 对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下: unsigned int compzero = ~0;16、main(){char *ptr; if ((ptr = (char *)malloc(0)) == NULL) puts("Got a null pointer"); else puts("Got a valid pointer");}该代码的输出是“Got a valid pointer”。还可以*ptr='a';不出现段错误
17、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 两个指针。
18、int a = 5, b = 7, c; c = a+++b;则c=12。
19、int main(){int j=2;int i=1;if(i = 1) j=3;if(i = 2) j=5;printf("%d",j);} 输出为5;如果再加上if(i=3)j=6;则输出6。
20、宏定义是在预编译阶段被处理的。21、Norflash与Nandflash的区别(1)、NAND闪存的容量比较大(2)、由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。(3)、NAND Flash一般地址线和数据线共用,对读写速度有一定影响。NOR Flash闪存数据线和地址线分开,所以相对而言读写速度快一些。
22、反码:对原码除符号位外的其余各位逐位取反就是反码补码:负数的补码就是对反码加1正数的原码、反码、补码都一样
23、pthread_t tid;pthread_create(&tid,NULL,pthread_func,NULL);//创建线程pthread_join(tid,NULL);//等待子线程结束,并回收资源pthread_detach(tid);//与当前进程分离pthread_exit(NULL);//退出调用线程pthread_cancel(tid);//取消线程pthread_mutex mutex=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_init(&mutex,NULL);//初始化一个互斥锁pthread_mutex_lock(&mutex);//对互斥锁上锁pthread_mutex_unlock(&mutex);//对互斥锁解锁sem_t sem;sem_init(&sem,0,1);//创建信号量并初始化它的值sem_wait(&sem);//信号量的值减1sem_post(&sem);//信号量的值加1
24、内存管理MMU的作用*内存分配和回收*内存保护*内存扩充*地址映射
25、ROM是只读存储器,掉电不丢失RAM是读写存储器,掉电丢失
26、SRAM:CPU的缓存就是SRAM,静态的随机存取存储器,加电情况下,不需要刷新,数据不会丢失DRAM,动态随机存取存储器最为常见的系统内存,需要不断刷新,才能保存数据SDRAM:同步动态随机存储器,即数据的读取需要时钟来同步。
27、signed char 的取值范围-128~127.
28、编译和链接有什么不同?(如外部符号的处理)编译生成的是目标文件(object *.o);编译过程中对于外部符号不做任何解释和处理。外部符号对应的就是“符号”
链接生成的是可执行程序链接将会解释和处理外部符号。外部符号对应的是地址
29、已知strcpy函数的函数原型是:char *strcpy(char *strDest, const char *strSrc)。其中,strDest是目的字符串,strSrc是源字符串。不调用C++/C的字符串库函数,请编写函数strcpychar *strcpy(char *strDest, const char *strSrc){int i=0;if(!(strDest && strSrc))return;while(strDest[i++] = *strSrc++);return strDest;}
30、strcpy能把strSrc的内容复制到strDest,为什么还要char *类型的返回值?为了实现链式表达式int len = strlen(strcpy(strDest, strSrc));
31、写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个#define MIN(a, b) (a) <= (b) ? (a) : (b)
32、关键字static的作用是什么static用来修饰一个局部的变量的时候,生命域是全局的作用域是局部的
static用来修饰一个模块内的(某一个C的源程序文件)全局变量的时候生命域不变作用域减小,只在本模块内有效
static用来修饰一个函数的时候作用域减小,只在本模块内有效
33、说明下面的声明的含义: A. const int a; // a是一个常数 int const a; // a是一个常数 B. const int *a; // a是一个指向整型常数的指针 int * const a; // a是一个指向整型变量的常指针 int const * a const; // a是一个指向整型常数的常指针C.char *strcpy(char *strDest, const char *strSrc);// 参数在函数内部不会被修改const int strcmp(char *source, char *dest);// 函数的返回值不能被修改const int a = strcmp(xx, yy);if(strcmp(xx,yy) != 0)
34、说明关键字volatile有什么含意,并给出例子。volatile表示被修饰的符号是易变的。告诉编译器不要随便优化我的代码!!*一个硬件寄存器*中断中用到的变量*线程之间共享变量volatile int a = 10;while((a & 0x01) == 0);#define P_UART_STATUS ((const volatile unsigned int *)0x88000000);// volatile表示硬件会修改这个寄存器的内容// const表示该寄存器只读,写无意义
35、printf可以接受多个参数,为什么,请写出printf的原型。int printf(const char *fmt, ...);
完整面试题库可进群免费领取!!!
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!
点击这里找小助理0元领取:扫码进群领资料
为何TI的GPMC并口,更常被用于连接FPGA、ADC?我给出3个理由
1. GPMC并口简介
GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口,是AM335x、AM437x、AM5708、AM5728等处理器专用于与外部存储器设备的接口,如:
类似于异步SRAM内存和专用集成电路(ASIC)设备。异步,同步,和页面模式(仅适用于非复用模式)突发NOR闪存设备。NAND闪存。ADC器件。图 1 GPMC概述
2.GPMC并口特点
为什么工业领域在与FPGA/ADC通信的时候,更喜欢使用GPMC接口呢?本文给出3个理由,那就是:高带宽、连接模式丰富、配置灵活 。具体如下:
PS:下文将介绍基于AM570x GPMC的ARM + FPGA通信案例、多通道AD(AD7606)采集综合案例。
(1)高带宽,速率可达100MB/s以上
以AM57x为例,通过GPMC接口与FPGA连接,采用DMA的方式读取FPGA端的数据,速度可达69MB/s,实际上通过配置GPMC接口的时序参数和不同工作模式,速率可超过100MB/s。
(2)连接模式丰富,灵活的8位和16位异步存储器接口
由于有gpmc_ad[15:0] 16个信号引脚可支持地址线与数据线复用和非复用模式,这让GPMC与外设的连接模式变得很丰富,可以和宽范围的外部设备通信,如:
外部异步或同步8-bit位宽内存或设备(非突发设备)外部异步或同步16-bit位宽内存或设备外部16-bit非复用NOR Flash设备外部16-bit地址和数据复用NOR Flash设备外部8-bit和16-bit NAND Flash设备外部16-bit伪SRAM(pSRAM)设备下面介绍几种连接模式。
1)16-bit Address/Data Multiplexed(地址线与数据线复用模式)
图 2
2)16-bit Nonmultiplexed(地址线与数据线非复用模式)
图 3
3)8-bit Nonmultiplexed(地址线与数据线非复用模式)
图 4
4)8-bit NAND(仅使用数据线模式)
此模式适用于无需地址线的场合,例如GPMC与NAND FLASH连接。NAND FLASH无需地址线,通过数据线D[x:0]发送读写命令,进行数据读取/写入。
图 5
(3)配置灵活,具有多达8个片选
GPMC基本编程模型提供了最大的灵活性,以支持八个可配置片选中不同的时序参数和位宽配置。可根据外部设备的特点,使用最佳的片选设置。
可选择不同的协议,以支持通用异步或同步随机访问设备(NOR闪存,SRAM)或支持特定的NAND器件。地址和数据总线可在同一个外部总线上复用。读和写访问可独立定义为异步或同步。系统请求(字节,16位字,突发)是通过单次或多次访问进行。外部设备访问配置文件(单或多个优化的突发长度,本地包或仿真包)是基于外部设备特性(支持协议,总线宽度,数据缓冲区大小,本地包支持)。系统突发读或写请求是同步突发(多个读,或多个写)。在没有突发或页面模式时是由外部存储器或ASIC设备支持,系统突发读或写请求转换为连续单一的同步或异步访问(单一读,或单一写)。仅在单一同步或 单一异步读或写模式下支持8位宽的设备。为了模拟一个可编程的内部等待状态,一个外部等待引脚可被监控,以在开始(初始访问时间)和突发访问期间动态的控制外部访问。
图 6 GPMC框图
3.GPMC并口应用案例
创龙科技基于AM5708、AM5728设计的工业评估板——TL570x-EVM、TL5728-EasyEVM,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足运动控制、工业PC、机器视觉、智能电力、视频监测等工业应用环境。
* AM5708
图7 SOM-TL570x核心板
图8 TL570x-EVM开发板
* AM5728
图9 SOM-TL5728核心板
图10 TL5728-EasyEVM开发板
图 11
本文讲解基于AM570x GPMC的ARM + FPGA通信案例、多通道AD采集综合案例。
基于GPMC的ARM + FPGA通信案例
案例功能
DSP端使用EDMA将数据搬运到指定的内存空间物理地址(GPMC片选基地址),再将数据读取回来并保存到DSP端L2SRAM,并校验数据读写的正确性、计算数据读写速率。ARM端通过MessageQ发送读写地址与读写大小到DSP端,DSP端读写对应内存空间,并返回传输时间及传输速率到ARM端。GPMC的初始化由ARM端驱动程序实现。
程序工作流程框图如下所示。
图 12
案例测试
将TL-HSAD-LX采集卡通过TL-HSAD-LX-PinBoard转接板和软排线,插到TL570x-EVM评估板的GPMC拓展接口J5上,并使用5V2A电源给TL-HSAD-LX采集卡供电,硬件连接图如下。
图 13
图 14 测试结果
EDMA单次传输数据大小为2KByte(0x800),总共循环100次。如需再次测试读写速度,请重新运行DSP端程序。
从上图可看到本次测试的误码率为0%(errcnt: 0);平均写入时间约为101us,写入速率约为38.53MB/s;平均读取时间约为118us,读取速率约为32.98MB/s。
备注:本次测试板卡通过软排线的形式连接,软排线的长度会影响误码率和读写带宽,目前测得最高速率为38.53MB/s(写入速率)。如将FPGA设计于底板,最高速率可到69MB/s(写入时间为28us)
基于GPMC的多通道AD采集综合案例
案例功能
AM570x DSP端使用EDMA通过GPMC接口采集AD7606或ADS8568模块8通道的AD信号,同时由DSP端对其中6通道的AD信号进行FFT处理,最后将8通道时域数据和经FFT处理的6通道频域数据保存到DSP端L2SRAM中,可通过仿真器与CCS软件查看对应通道的时域波形和频域波形。
程序保存通道0的时域数据和经FFT处理的频域数据至CMEM(共享内存)空间,通过IPC组件通知ARM端读取该通道的时域数据和频域数据,使用Qt在LCD显示屏上进行波形绘制,最后将数据保存到文件中。
本案例默认配置AD7606模块采样周期为6us,即采样率约为167KHz;配置ADS8568模块采样周期分别为5us,即采样率为200KHz。程序工作流程框图如下所示:
图 15
案例测试
将Tronlong的TL7606I(AD7606)模块或TL8568I(ADS8568)模块插入评估板GPMC扩展接口,并对模块进行独立供电。TL7606I模块使用5V电源供电,J1跳线帽连接到0,使用±5V量程。TL8568I模块使用12V电源供电,软件已配置为±12V量程。
将模块的待测输通道正确连接信号发生器,信号发生器输出频率为4KHz、峰峰值为2Vpp(即幅值为1V)的正弦波信号。待测信号电压请勿超过模块量程,否则可能会导致模块损坏。评估板接入LCD显示屏,并通过仿真器连接到PC机。硬件连接示意图如下:
图 16 TL7606I模块硬件连接示意图
图 17 TL7606I模块硬件连接示意图
图 18 TL8568I模块硬件连接示意图
程序运行后,即可在LCD显示屏上看到通道0的时域波形和频域波形。
图 19 时域波形
图 20 频域波形
以上案例详细说明、案例源码 欢迎在评论区留言,或点赞收藏。
相关问答
inand是什么文件?inand是一个文件系统的缩写,全称为"InternalNANDFlashDisk",意为内部NAND闪存磁盘。它是一种用于嵌入式系统中的存储设备,通常用于存储操作系统、应用...
我的电脑明明已经装了 flash player ,却找不到在哪里,在网上...可以,到Adobe官网下载最新的64位系统FORIE的flashplayer有用(0)回复morica你是升级了IE了吧,建议换非IE浏览器,比如chrome有用(0)回复gon...
Adobe Flash Player安装路径-ZOL问答3人讨论2548次围观关注问题写回答讨论回答(3)lijunru00AdobeFlashPlayer默认安装路径也是必须安装到C:\WINDOWS\system32\Macromed,其...
求Teclast NANDFlash U盘量产修复具体步骤,谢谢?你好,下载IS916-BO量产工具。插上U盘,解压后,点击EXE应用程序,在量产设置项中输入PID和VID,开始量产就可以了。你好,下载IS916-BO量产工具。插上U盘,解压后...
NandFlash 和NorFlash的区别?1、存储架构不同NORFlash架构提供足够的地址线来映射整个存储器范围。这提供了随机访问和短读取时间的优势,这使其成为代码执行的理想选择。另一个优点是100%...
为什么我的电脑安装了Adobe Flash ,然而却不在界面和工具栏...举报手机MotoMotoFLASH3人讨论7687次围观关注问题写回答讨论回答(3)...首先你得确定安装了没有。在开始-所有程序中看有木有?没有的话,打开我的电脑...
flash 版本是10的,上网视频都看不到,怎么处理-ZOL问答第二C:\WINDOWS\system32\Macromed\Flash把文件夹删掉!不行用QQ电脑管家粉碎第三:开始运行regedit打开注册表顺序展开HKEY_LOCAL_MACHI...
ESSD是什么电子器件?ESSD是一种电子存储器件,全称为"ElectricallyErasableandProgrammableSemiconductorDevice",即电可擦除可编程半定制...
flash 卡住无响应?方法一:刷新或重启浏览器浏览器有延迟,未能及时检测到Flash,可以通过刷新或关闭后重启一下浏览器,或切换浏览器模式方法二:安全软件影响可能是安全软件拦...
FLASH 里用了MovieClip(this.root).gotoAndStop();出现错误#1...dstwsznruojdROOT不了可能是步骤有错误要不就是应用的软件不行我推荐你一款不错的软件应用宝安卓手机和苹果手机都可以扫描扫描后安卓用户将进入应用宝进行...