上海传音控股驱动开发笔试题


约定:数据类型  int 四个字节(32位系统,认为整型是4个字节),char 一个字节
答题时间: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里实现驱动特定的功能。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值