上海传音控股驱动开发笔试题
答题时间:60分钟
1.计算结果
- char str[] = "hello"; sizeof(str) = 6;
- char *p = str sizeof(p) = 4;
- void *pbuf = malloc(100); sizeof(pbuf) = 4;
- void func(char string[100]){
- int a = sizeof(string); a = 4;
- }
- 2.typedef struct{
- char a;
- int b;
- char c;
- }test_struct;
- test_struct g_test_arry[5];
请问以下语句的值为多少?
sizeof(test_struct) = 12;
sizeof(g_test_array) = 60;
3.下面的程序能够编译通过?如果不能通过,应该如何修改才能编译通过?
如果可以编过,输出结果是?
- int sim2_is_active = 0;
- int sim1_is_active ;
- int sim3_is_active;
- int mmi_is_sim2_active(void){
- return sim2_is_active;
- }
- int main(){
- if(sim1_is_active){
- printf("sim1 active!\n");
- }
- if(sim3_is_active){
- printf("sim3 active!\n");
- }
- //mmi_is_sim2_active 函数地址,地址不为0,所以if判断为真
- if(mmi_is_sim2_active){
- printf("sim2 active!\n");
- }
- return 0;
- }
答案:可以编译通过,结果为
sim2 active!
4.#ifdef 和 #if 的区别
- #if (5*3)
- #define __MMI_SHOW_WALLPAPER_IN_SUBMENU
- #endif
- #define CFG_MMI_BUG_FIX 0
- int main(){
- #if defined(CFG_MMI_BUG_FIX)
- printf("1\n");
- #endif
- #if CFG_MMI_BUG_FIX
- printf("2\n");
- #else
- printf("3\n");
- #endif
- #ifdef CFG_MMI_BUG_FIX
- printf("4\n");
- #endif
- #ifdef __MMI_SHOW_WALLPAPER_IN_SUBMENU
- printf("5\n");
- #endif
- return 0;
- }
输出结果为:
1 3 4 5
5.程序实现:已知从1-100范围内选出99个整数,没有顺序的存放在全局数组中,
请编程找出缺少的那个整数。
- //假定99个数组存放在arra数组中
- int searchData(int array[99]){
- int i = 0,sum = 0;
- for(i = 0;i < 99; i ++){
- sum+=array[i];
- }
- return 5050 - sum;
- }
思路:将1-100总和算出,再减去99个选取的数
6.嵌入式系统总是要用户对变量或者寄存器进行位操作,给定一个整型变量a,写两段代码,
第一个设置a的bit 3,第二个清楚a的bit 3,在以上的两个操作中,要保持其他位不变,另外
代码要对16bit和32bit通用。
- #define BIT3 (0x1<<3)
- static int a;
- void set_bit3(void) {
- a |= BIT3;
- }
- void clear_bit3(void) {
- a &= ~BIT3;
- }
7.下面的函数有问题吗?Volatile关键字在什么情况下使用?
- int square(volatile int *ptr){
- return (*ptr)*(*ptr);
- }
有问题,这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!
正确的代码如下:
- long square(volatile int *ptr) {
- int a;
- a = *ptr;
- return a * a;
- }
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,
优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在
寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
8.Linux 中mutex_lock函数作用是什么?spin_lock 函数作用是什么?两者的区别是什么?
mutex_lock:从 实现原理上来讲,Mutex属于sleep-waiting类型的锁,mutex_lock是用来保护资源.比如某一个变量,多个函数
都会对该变量进行操作,为了保证在同一时间,只能有同一个函数对该变量的操作,需要对该变量进行加锁和解锁操作,用来防止不
可预知的错误.而自旋锁spin lock是busy-waiting。就是说当没有可用的锁时,就一直忙等待并不停的进行锁请求,直到得
到这个锁为止。这个过程中cpu始终处于忙状态,不能做别的任务。
区别:
(1)Mutex适合对锁操作非常频繁的场景,并且具有更好的适应性。尽管相比spin lock它会花费更多的开销(主要是上下文切换)
,但是它能适合实际开发中复杂的应用场景,在保证一定性能的前提下提供更大的灵活度。
(2)spin lock的lock/unlock性能更好(花费更少的cpu指令),但是它只适应用于临界区运行时间很短的场景。而在实际软件开发
中,除非程序员对自己的程序的锁操作行为非常的了解,否则使用spin lock不是一个
好主意(通常一个多线程程序中对锁的操作有数以万次,如果失败的锁操作(contended lock requests)过多的话就会浪费很多的时
间进行空等待)。
9.linux 驱动中有platform,bus,device,driver 四个概念,例如经常使用的函数接口,platform_driver_register,bus_add_driver
和bus_add_device等,如何理解platform,bus,device,driver四个概念?他们分别的作用是什么?他们之间有什么关系?
在Linux2.6内核引入了bus_type、device_driver、device分别描述总线,驱动和设备,这就是所谓的“总线设备驱动模型”。总线是
三者联系起来的基础,通过一种总线类型,将设备和驱动联系起来。总线类型中的match函数用来匹配设备和驱动,当match操作完成之
后就会调用device_driver中的probe函数。典型的bus type有USB \ PCI \ I2C \ SPI等。Platform总线是2.6 kernel中最近引入的一种
虚拟总线,主要用来管理CPU的片上资源,具有更好的移植性,因此在2.6 kernel中,很多驱动都用platform改写了。在数据结构设计上,
总线、设备及驱动三者相互关联。platform device包含device,根据device可以获得相应的bus及driver。设备添加到总线上后形成一个
双向循环链表,根据总线可以获得其上挂接的所有device,进而获得了 platform device。根据device也可以获得驱动该总线上所有设备
的相关driver。platform driver包含driver,根据driver可以获得相应的bus,进而获得bus上所有的device,进一步获得platform device
,根据name对driver与platform device进行匹配,匹配成功后将device与相应的driver关联起来,即实现了platform device和platform
driver的关联。匹配成功后调用driver的probe进而调用platform driver的probe,在probe里实现驱动特定的功能。
上海传音控股驱动开发笔试题相关推荐
- 2015 4399校园招聘游戏开发笔试题
http://gointernetgo.com/textinterview/other/4399yxbs 2015 4399校园招聘游戏开发笔试题 2014-10-19 • 其它 • 0 条评论 •2 ...
- 【腾讯笔试题】2019年腾讯实习正式批移动端开发笔试题
2019年腾讯实习正式批移动端开发笔试题 说明 不定项选择题 编程题 1.小Q与橙汁 题目描述 输入描述 输出描述 示例1 输入 输出 示例2 输入 输出 2.打怪兽 题目描述 输入描述 输出描述 示 ...
- 小米2019秋招系统软件开发笔试题详解
小米2019秋招系统软件开发笔试题详解 兄弟们,给大家个题目玩一玩,题目如下: @ 在游戏Dota2中,有一位非常强大的英雄卡尔,他有三种属性:冰.火.雷.同时卡尔身上有三个无顺序的属性槽,他可以从三 ...
- 某公司iOS开发笔试题
参考答案不唯一,大家可以根据自己的理解回答,没有必要跟笔者的一样.参考笔者的答案,也许给你带来灵感! 1.对数组中的元素去重复 例如: NSArray *array = @[@"12-11& ...
- Java中级开发笔试题及答案,最全指南
JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...
- 2014京东校园招聘-软件开发笔试题
2019独角兽企业重金招聘Python工程师标准>>> 今天去川大参加了京东的宣讲,外加笔试,那叫一个人山人海啊,貌似有1000人,通道和走廊甚至演讲台上都站满了人,oh my go ...
- 小米实习生测试开发笔试题
1.下面代码是否有错,如有错,请指出并阐述错误原因. class testB{string aa = "I'm testB"; } interface testA{string a ...
- VMware(威睿)后端开发笔试题总结
1. Linux中查看系统的发行版本信息 的命令? cat/etc/issue 和 lsb_release 2. linux 挂载一个共享文件夹: mount -t cifc ...
- 招商银行信用卡中心春招秋招数据方向数据分析数据挖掘数据开发笔试题(持续更新)
1.Spark支持的分布式部署方式中哪个是错误的 Standlone Spark on mesos Spark on YARN Spark on local Spark有3种运行模式(分布式部署方式) ...
最新文章
- SCVMM2012功能测试(7)—更新管理(符合性)
- 年终盘点:2021年AI领域值得关注的十件事
- android ADT学习总结
- python3的3D实战 -基于panda3d(3)
- 进程和线程的定义和区别
- Content Aware ABR技术
- 工作243:name报错
- jQuery中each()的用法
- 利用Vert.x构建简单的API 服务、分布式服务
- 将查询出来的数据按照一个字段分组且排序过程中,遇到的一些有关group的问题(分组排序应该使用partition by)
- java的程序员工资一般多少_JAVA程序员工资一般是多少
- LVGL8学习之msgbox
- 什么是云桌面?企业为什么要关心云桌面?
- 聊一聊微博新知博主这件事,看看赚钱方式有哪些?
- Material Design系列之BottomNavigationView详解
- 你好,再见;你好,幸会!
- 鸟哥Linux服务器篇——什么是 DNS
- Unity UGUI实现图文混排
- C++ 命名空间,也有叫名称空间
- PTA7-12 城市间紧急救援 (25 分)(dijkstra+dp)(简单易懂的写法)
热门文章
- 回溯法——批处理作业调度
- openstack中文文档
- android 开发热更新技术Andfix 和 Tinker
- 2016年最值得关注的16个网页设计趋势
- linux qt调用摄像头,Qt5下实现摄像头预览及捕获图像方法实例
- MySQL 主键相关操作
- c++11 多线程编程(三)------ 竞争和互斥锁
- html前端开发作品,Web前端开发(HTML5+CSS3)
- mysql安装教程_mysql8.0.20安装教程,mysql下载安装教程8.0.20
- mysql 命令 例子_Mysql 命令实例