
嵌入式软件笔试面试问题汇总
DDR内存测试
一棹春风一叶舟,一纶茧缕一轻钩。花满渚,酒满瓯,万顷波中得自由。
展开
-
问:已知一个MCU的复位地址为0x00080000,请利用函数指针的方法实现复位。
答:首先声明一个函数指针,指向复位后要开始执行指令的位置:Volatile unsigned long* mcu_reset= (volatile unsigned long*)0x00080000;然后,调用函数指针,实现复位:(*((void(*)())mcu_reset))()...原创 2019-03-13 12:04:44 · 474 阅读 · 0 评论 -
问:已知u32 a=0x12345678,u8 *p=(u8 *)&a,求*p=____,*(p+1)=___,*((u16 *)(p)+1)=___,*((u16*)(p+1)=____
问:已知u32 a=0x12345678,u8 *p=(u8 *)&a,求*p=______,*(p+1)=_______,*((u16 *)(p)+1)=________,*((u16*)(p+1))=__________.答:*p=_0x12_____,*(p+1)=__0x34_____,*((u16 *)(p)+1)=__0x5678______,*((u...原创 2019-03-13 11:44:40 · 2712 阅读 · 1 评论 -
问:已知一个内存地址为0x12345678,一个整型变量int a,请将地址上的内容赋值给a。
答: a = *((volatile unsigned long*)0x12345678);原创 2019-03-13 11:42:07 · 2492 阅读 · 0 评论 -
各种常用排序算法的比较
原创 2019-03-06 21:25:34 · 170 阅读 · 0 评论 -
用C/C++编程实现快速排序
快速排序的基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。/******************************************************************/...原创 2019-03-06 21:24:20 · 270 阅读 · 0 评论 -
用C/C++编程实现希尔排序
希尔算法基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。操作方法:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;按增量序列个数k,对序列进行k 趟排序;每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增...原创 2019-03-06 21:23:16 · 319 阅读 · 0 评论 -
用C/C++编程实现插入排序
插入排序算法思想:和前俩种排序不同,插入排序在排序过程中是局部有序,随着插入项的增多,有序部分的项的位置会发生改变,而冒泡排序和选择排序每轮确定的项数的位置是永远不变的。在首轮,选择第二项作为插入项,然后取出这一项放在一个变量中,和前一项比较而且小,则前一项后移到第二项的位置,然后第二项也就是插入项放在前一项的位置,第二轮选择第三项作为插入项然后取出和前一项也就是第二项比较如果小,第二项后移到插入...原创 2019-03-06 21:22:08 · 363 阅读 · 0 评论 -
用C/C++编程实现堆排序
堆排序的基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;void adjust(int arr[], int len, in...转载 2019-03-16 11:12:11 · 332 阅读 · 0 评论 -
用C/C++编程实现直接选择排序
直接选择排序算法思想:在冒泡排序上做了优化,减少了交换次数,在首轮选择最大的数放在第一项,一轮之后第一项是有序的了,第二轮从第二项开始选择最大的数放在第二项,以此类推,直到整个数组完全有序。public void select_sort(){ // 对应位置的数组下标 int max; // 定义临时变量 int temp; for (int i...原创 2019-03-06 21:27:27 · 300 阅读 · 0 评论 -
用C/C++编程实现冒泡排序(Bubble Sort)
冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。int temp;//外层循环是排序的趟数for (int i = 0; i < arrays.length - 1 ; i++) {//内层循环是当前趟数需要比较的次数for (int j = i+1; j < arrays.length; j++) {//前一...原创 2019-03-06 21:25:58 · 981 阅读 · 0 评论 -
问:什么是最小堆?什么是最大堆?在堆中怎么插入或删除一个元素?
答:最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。 最大堆的插入最大堆的插入的思想就是先在最后的结点添加一个元素,然后沿着树上升。跟最大堆的初始化大致相同。MaxHeap&...原创 2019-03-09 10:35:39 · 3516 阅读 · 0 评论 -
ifdef、define、endif这些关键字的作用是什么?
1、 注释掉一段代码;2、防止头文件重复包含。原创 2019-03-03 13:14:09 · 1301 阅读 · 0 评论 -
问:已知一個整型變量int a,a*20等價于_________,a*68等價于__________,a%8 等價于_____(不可使用‘*’或者‘/’)
答:a*20等價于(a << 4) + (a << 2);a*68 等價于 (a << 6) + (a << 2);a%8 等價于 a & 0x07原创 2019-03-13 13:51:33 · 178 阅读 · 0 评论 -
问:自定义一个函数,实现功能:将unsigned short 类型的数转换成二进制数,并打印出来。例如,输入112,打印出:1110000。
答:void dec2bin_print(unsigned short a){ int c=0; int i=0; int d[30]={0}; while(a != 0) { c = a%2;//c为a的余数 d[i] = c; i ++;//i表示a转换的二进制数的位数 a =...原创 2019-03-13 14:14:58 · 1888 阅读 · 0 评论 -
问:用宏定义一年有多少秒(忽略闰年)
问:用宏定义一年有多少秒(忽略闰年)答:#define SECONDS_PER_YEAR 60*60*24*365UL //加UL,是为了防止溢出原创 2019-03-13 14:28:27 · 1637 阅读 · 0 评论 -
通过proc文件系统作快速问题定位
点击跳转到出处文章翻译自Peeking into Linux kernel-land using /proc filesystem for quick’n’dirty troubleshooting这篇博客的内容完全是关于现代Linux内核的。换句话说,指的是与RHEL6一样使用的2.6.3x系列内核,而不是古老的RHEL5所使用的2.6.18内核(都什么鬼了?!),虽然大部分企业...转载 2019-04-18 17:39:28 · 464 阅读 · 0 评论 -
Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别
用户空间动态申请内存用的函数是malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是free()。注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃。 那么,在内核空间中如何申请内存呢?一般我们会用到kmalloc()、kzalloc()、vmalloc()等,下面我们介绍一下这些函数的使用以及它们...原创 2019-04-18 16:58:03 · 567 阅读 · 0 评论 -
进程间通信方式有哪些?有何优缺点?
(1)管道管道分为无名管道和有名管道。无名管道无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系一般指的是父子关系。无名管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,,这样提供了两个进程之间数据流动的一种方式。有名...原创 2019-04-01 21:02:37 · 1634 阅读 · 0 评论 -
strcpy、sprintf 与 memcpy 有啥区别?
三者主要有以下不同之处:操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。实现功能不同,strcpy 主要实现字符串变量间的拷贝,spri...原创 2019-04-01 20:49:31 · 611 阅读 · 0 评论 -
sizeof 和 strlen 有何区别?
sizeof 是一个操作符,strlen 是库函数。sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\0‘的字符串作参数。编译器在编译时就计算出了sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。数组做sizeof 的参数不退化,...原创 2019-04-01 20:47:58 · 174 阅读 · 0 评论 -
下面的代码输出是什么,为什么?
voidfoo(void){unsignedinta=6;intb=-20;(a+b>6)?puts(">6"):puts("<=6");}答:这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者对这些东西懂得极少,不管如何,这无符号整型问题的答案是输出是">6"。原因是当表达式中存在有符号...原创 2019-04-01 20:43:26 · 2063 阅读 · 0 评论 -
下面的代码使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码。
__interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf("\nArea=%f",area);returnarea;}答:这个函数有如下的错误:1) ISR不能返回一个值。2)ISR不能传递参数。3)在许多的处理器/编译...原创 2019-04-01 20:40:51 · 8939 阅读 · 2 评论 -
数据声明(Data declarations)--------------- 用变量a给出下面的定义
a) 一个整型数(Aninteger)b)一个指向整型数的指针(Apointertoaninteger)c)一个指向指针的指针,它指向的指针是指向一个整型数(Apointertoapointertoanintege)d)一个有10个整型数的数组(Anarrayof10integers)e)一个有10个指针的数组,该指针是指向一个整型数的。...原创 2019-04-01 20:19:11 · 296 阅读 · 0 评论 -
TCP与UDP有啥区别;进程和线程有啥区别
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。它通过校验和,丢包时的重传控制,序号标识,滑动窗口、确认应答,次序乱掉的分包进行顺序控制实现可靠传输。即通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付。3、UDP具有较好的实时性,工作效率比TCP高,适用...原创 2019-04-01 20:12:53 · 520 阅读 · 0 评论 -
同步和异步有啥区别
同步(Sync):所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(比如系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭,那么迁移程序也会中断,用户体验不好。异步(Async):将用户请求放入消息队列,并反馈给用户,比如系统迁移程序已经启动,提示你可以关闭浏览器了。然后程序再慢慢地写...原创 2019-04-01 20:10:03 · 278 阅读 · 0 评论 -
Volatile与Register的区别
a.volatilevolatile是易变的,不稳定的意思,volatile是关键字,是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码不在进行优化,从而可以提供对特殊地址的稳定访问。那么什么是编译器优化呢?为了提高运行效率,攻城师们费尽心机地把代码优化,优化程序运行时存取速度。一般...原创 2019-04-01 20:08:25 · 1370 阅读 · 0 评论 -
二叉查找树与红黑树(Binary Search Tree and R-B Tree)
参考:https://www.cnblogs.com/skywang12345/p/3576328.htmlhttp://www.cnblogs.com/skywang12345/p/3245399.html定义:二叉查找树(Binary Search Tree),又被称为二叉搜索树。设x为二叉查找树中的一个结点...原创 2019-04-04 14:48:31 · 244 阅读 · 0 评论 -
问:下列选项中,初始化不正确的是
问:下列选项中,初始化不正确的是()A. char str[5] = "good!";B. char str[] = "good!";C. char* str = "good!";D. char str[5] = {'g','o','o','d','!'};答:A原创 2019-03-15 14:24:35 · 477 阅读 · 2 评论 -
请使用递归的方式实现整数型数组的求和,如int a[100]
请使用递归的方式实现整数型数组的求和,如int a[100]。int GetSum(int *a, int n){ return n==0 ? 0 : (GetSum(a, n-1) + a[n-1]);}原创 2019-03-15 14:25:21 · 544 阅读 · 0 评论 -
问:请编程实现一个函数,其功能为:把字符串循环右移n个字符,例如,字符串”abcdefghi“右移3个字符后变为”ghiabcdef“。
问:请编程实现一个函数,其功能为:把字符串循环右移n个字符,例如,字符串”abcdefghi“右移3个字符后变为”ghiabcdef“。答:int str_loop_right_shift(char* str,const unsigned short n){ int len=0; char* tmp; len = strlen(str); if(NULL ==...原创 2019-03-13 15:30:58 · 729 阅读 · 0 评论 -
问:请指出下列程序的错误并修改。 void GetMemeory(char* p) { p = (char*) malloc (100); } void test() { .......}
问:请指出下列程序的错误并修改。void GetMemeory(char* p){ p = (char*) malloc (100);}void test(){ char *str=NULL; GetMemory(str); strcpy(str,”Thunder”); strcat(str+2, “Downloader”); printf...原创 2019-03-13 14:58:27 · 6125 阅读 · 1 评论 -
网络协议---Zigbee网络协议
序言物聯網中存在2類協議,接入協議:負責子網內部設備之間的組網與通信,如:Zigbee、WIFI、藍牙。通信協議:負責通過傳統互聯網、服務器、APP或設備進行數據交換,如:HTTP、MQTT、XMPP、COAP、WEBSOCKET一、什麼是Zigbee網絡協議是一种基于IEEE802.15.4协议的最近发展起来的一种短距离无线通信技术,功耗低,被业界认为是最有...原创 2019-03-13 09:55:29 · 955 阅读 · 0 评论 -
查看linux系统内存使用情况的系统命令是?
答:1)free2)cat /proc/meminfo原创 2019-03-03 12:45:28 · 1016 阅读 · 0 评论 -
若在C/C++编程中,文件a.c与b.c相互调用与依赖,如何解决?
答:把双方需要调用的函数剥离出来,单独存放到第三个文件c.c中原创 2019-03-03 12:41:53 · 376 阅读 · 0 评论 -
linux系统下的文件权限
-rwxrw-r‐-1 root root 1213 Feb 2 09:39 abc第一组rwx:文件所有者的权限是读、写和执行-第二组rw-:与文件所有者同一组的用户的权限是读、写但不能执行-第三组r--:不与文件所有者同组的其他用户的权限是读不能写和执行也可用数字表示为:r=4,w=2,x=1因此rwx=4+2+1=7...原创 2019-03-03 10:45:29 · 143 阅读 · 1 评论 -
C程序的编译过程
1,由.c文件到.i文件,这个过程叫预处理2,由.i文件到.s文件,这个过程叫编译3,由.s文件到.o文件,这个过程叫汇编4,由.o文件到可执行文件,这个过程叫链接...原创 2019-03-03 10:44:37 · 392 阅读 · 0 评论 -
自旋锁与互斥锁的区别
两种锁的加锁原理互斥锁:线程会从sleep(加锁)——>running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销。自旋锁:线程一直是running(加锁——>解锁),死循环检测锁的标志位,机制不复杂。互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。假设线程A想要通...转载 2019-03-03 10:44:06 · 456 阅读 · 0 评论 -
中断与DMA的区别
DMA:是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制,使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率.中断:是指CPU在执行程序的过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回源程序被中断的位置并继续执行。 所以中断和DMA的区别就是DMA不需CPU参与而中断...原创 2019-03-02 13:41:49 · 10595 阅读 · 1 评论 -
设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。
注册一个字符设备驱动有两种方法:1) void cdev_init(struct cdev *cdev, struct file_operations *fops)该注册函数可以将cdev结构嵌入到自己的设备特定的结构中。cdev是一个指向结构体cdev的指针,而fops是指向一个类似于file_operations结构(可以是file_operations结构,但不限于该结构)的指针....原创 2019-03-02 13:40:27 · 634 阅读 · 0 评论 -
copy_to_user()和copy_from_user()主要用于实现什么功能?一般用于file_operations结构的哪些函数里面?
由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数据读写。copy_to_user():完成内核空间到用户空间的复制。copy_from_user():是完成用户空间到内核空间的复制。一般用于file_operations结构里的read,write,ioctl等内存数据交换作用的函数。当然,如果ioctl没有用到内存数据复制,那么就不会用到这两个...原创 2019-03-02 13:39:04 · 1426 阅读 · 0 评论