一份笔试题

笔试题目

一、选择题

二、 1:main()   { int x=1,y=1;    y=x--      printf( “ %d,%d\n ” ,x,y);  }运行结果为(  B)   A.0 , 0                            B.0 , 1  C.1 , 0                             D.1 , 1

2:某文件中定义的静态全局变量(或称静态外部变量)其作用域是( B )

A.只限某个函数                B.本文件   C.跨文件                     D.不限制作用域

3:设 int a[10],*p=a 则对数组元素的正确引用是(C  )

A.a[p]                 B.p[a]          C.*(p+2)                 D.p+2

4:C语言中,系统自动打开的文件是(  A)   A.二进制文件                     B.随机文件  C.非缓冲文件                     D.设备文件

5:下列程序的运行结果是( D )

main( )   { int a[][4]={1,3,5,7,9,11,13,15,17,19,21,23};   int (*p)[4],i=2,j=1;   p=a;    printf(″%d\n″,*(*(p+i)+j));  }   A.9      B.11        C.17         D.19

6:在软件生命周期中,下列哪个说法是不准确的?( C )

A.软件生命周期分为计划、开发和运行三个阶段  B.在计划阶段要进行问题确认和需求分析  C.在开发后期才能进行编写代码和软件测试  D.在运行阶段主要是进行软件维护

7:下列语句定义整型指针p1、p2,( B )  是正确的。  A.int p1,p2;                    B.int *p1,*p2;  C.int *p1,p2;                   D.int **p1,p2;

B. 8:下列程序的运行结果是(  B)  main()  {    int  a[5] = {1,2,3,4,5};   int *ptr =  (int*)(&a+1);     printf("%d %d" , *(a+1), *(ptr-1) );  }  A. 2  2                                  B. 2  1  C.2  5                                  D.以上均不是

C.二、简答题

D.8、下面的程序或程序段存在一个错误或不妥处请在其下划一条线,并将改正的内容写到每小题后的空白处

main()   {

char c1,c2;

c1=‘9‘;

c2=‘10‘;

printf(”cl=%c,c2=%c\n”,c1,c2);

}

答:char cl,c2;

printf(”c1=%c,c2=%c\n”,c1,c2);

改: char c1,*c2;

c2="10";

printf(”cl=%c,c2=%s\n”,c1,c2);

9、下面的代码输出是什么,为什么? void foo(void) {  unsigned int a = 6; int b = -20;  (a+b > 6) ? puts("> 6") : puts("<= 6"); }

输出:>6  因为:当unsigned int类型和int类型相加int的类型会被转变成unsigned int,那么b=10...10100 ,所以:a+b>6

10、中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展 ―让标准 C支持中断。具代表事实是,产生了一个新的关键字__interrupt,下面的代码就使用了 __interrupt关键字去定义了一个中断服务子程序 (ISR),请评论一下这段代码,找出错误并改正.

__interrupt double compute_area (double radius)

{

double area = PI * radius * radius;

printf("\nArea = %f", area);

return area;

}

答:__interrupt double compute_area (double radius)

应把double去掉和把double radius改成void 因为中断处理函数不能传参和返回值所以自然return 也要去掉。

三、内核驱动题

11、请简述arm linux内核启动流程。

答:首先IROM先把一段一段裸机程序复制到SRAM中启动进行初步初始化arm在通过里面的复制剩余代码至DRAM进行下一部分的初始化和引导启动linux内核从中如果板子的ID和linux中相应的ID不能匹配的话linux将无法启动。

12、驱动里面为什么要有并发、互斥的控制?如何实现?举例说明。

并发:可分两种一种宏观上并发微观上串行,一般出现在单核CPU中,这种采用某种算法使得个进程轮流占用CPU,当时间片用完即退下让下一个进程占用CPU。别一种是宏观上和微观上都是并发的这种一般在多核CPU中,是真正上并发,并发本质就是提高CPU的效率,使得CPU不会因为一个进程阻塞而不工作,也不会因为一个进程运行时间长而使得其他进程等待太久。

互斥:互斥是为了某个变量,某个函数因为多人一起操作而使结果不朝着我们想要的方向走。

如系统文件中有个txt文件多人读可以,但是如果多人一起写这个txt的话那么这个txt就很难看懂了,如果这里这里设置一个互斥量使一次只有一个人可写那么txt就不会混乱了。

13、请简述linux内核终端处理分成上半部分和下半部分的原因,为何要分?如何实现?

linux内核终端处理分上下部分的原因:首先分上下部是的真正要屏蔽中断时间不会太长而使linux重启。而且把不紧急的代码放下下部分,可以使CPU更多时间去相应其他终端,也可以提高CPU的效率。

四、编程实现题

14、设计并实现一个在linux平台下简单的内存FIFO字符设备驱动,并简述该驱动的验证方法。

#include <linux/init.h>

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/cdev.h>

#include <linux/device.h>

#include <linux/stat.h>

#include <linux/slab.h>

#include <linux/kdev_t.h>

#include <linux/moduleparam.h>

#include <linux/sched.h>

#include <linux/platform_device.h>

#include <linux/uaccess.h>

MODULE_LICENSE("GPL");

#define FIFO_MAJOR 0

#define FIFO_MINOR 0

#define DEV_NUM 1

#define FIRSTPRI_NUM 0

#define DATA_NUM 100

#define DRI_NAME "fifo_dev"

unsigned int fifo_major = FIFO_MAJOR,fifo_minor = FIFO_MINOR;

dev_t fdev_t;

module_param(fifo_major,int,S_IRUSR);

module_param(fifo_minor,int,S_IRUSR);

struct fifo_dev

{

struct cdev tcdev;

int data[DATA_NUM];

int pri,tail;

};

static struct class *my_class;

static struct fifo_dev *fifo_devs;

static struct device *my_devices;

static int fifo_open(struct inode * node,struct file * filep)

{

int i=0;

struct fifo_dev *fifodev = NULL;

printk(KERN_INFO"Fifo_dev:Hello come to fifo_open");

fifodev = container_of(node->i_cdev,struct fifo_dev,tcdev);

filep->private_data = fifodev;

return 0;

}

static ssize_t fifo_read(struct file * file,char __user * buf,size_t count,loff_t * ppos)

{

int i=0,j=0;

int tbuff[DATA_NUM];

struct fifo_dev *fifodev = NULL;

printk(KERN_INFO"Fifo_dev:Hello come to fifo_open");

fifodev = file->private_data;

if(fifodev->pri == fifodev->tail)

{

printk(KERN_NOTICE"Fifo_dev:No data to read");

count = 0;

return count;

}

i=fifodev->pri - fifodev->tail;

if(i<count)

count = i;

for(;j<=count;j++)

tbuff[j]=fifodev->data[fifodev->tail+j];

copy_to_user(buf,tbuff,count);

fifodev->tail+=count;

return count;

}

static ssize_t fifo_write(struct file * file,const char * buf,size_t n,loff_t * ppos)

{

int i=0,j=0,k=0,q=0;

int tbuff[DATA_NUM];

struct fifo_dev *fifodev = NULL;

printk(KERN_INFO"Fifo_dev:Hello come to fifo_write");

fifodev = file->private_data;

j=DATA_NUM-n;

if((fifodev->pri) >= j)

{

if((fifodev->tail) >= n)

{

k=fifodev->tail-n;

if(((fifodev->pri )- (fifodev->tail)) > k)

q=k;

else

q= fifodev->pri - fifodev->tail;

for(;i<q;i++)

{

fifodev->data[k+i]=fifodev->data[fifodev->tail+i];

}

}

else{

q=n;

k=0;

for(;i<q;i++)

{

fifodev->data[k+i]=fifodev->data[fifodev->tail+i];

}

}

fifodev->tail=k;

fifodev->pri = q + fifodev->tail;

}

copy_from_user(tbuff,buf,n);

for(;j<=n;j++)

fifodev->data[fifodev->pri+j]=tbuff[j];

fifodev->pri +=n;

return n;

}

static struct file_operations fifo_cdev=

{

.owner = THIS_MODULE,

.read  = fifo_read,

.open  = fifo_open,

.write = fifo_write,

};

static int fifo_probe (struct platform_device *dev)

{

int ret;

if(fifo_major = 0)

{

ret = alloc_chrdev_region(fdev_t,FIFO_MINOR,DEV_NUM,DRI_NAME);

}

else

{

ret = register_chrdev_region(fdev_t,DEV_NUM,DRI_NAME);

}

if(IS_ERR(ret))

{

printk(KERN_ERR"Fifo_dev:Failed for chrdev_region");

return -ENOANO;

}

printk(KERN_INFO"Fifo_dev:Success for chrdev_region");

fifo_devs = kmalloc(sizeof(struct fifo_dev)*DEV_NUM,GFP_KERNEL);

if(fifo_devs ==NULL)

{

printk(KERN_ERR"Fifo_dev:Failed for kmalloc");

goto failed_kmalloc;

}

printk(KERN_ERR"Fifo_dev:Succwss for kmalloc");

memset(fifo_devs,sizeof(struct fifo_dev)*DEV_NUM,0);

my_class = class_create(THIS_MODULE,DRI_NAME);

if(my_class ==NULL)

{

printk(KERN_ERR"Fifo_dev:Failed for my_class");

goto failed_my_class;

}

printk(KERN_ERR"Fifo_dev:Succwss for my_class");

my_devices=device_create(my_class,NULL,fdev_t,NULL,DRI_NAME);

if(my_devices ==NULL)

{

printk(KERN_ERR"Fifo_dev:Failed for my_devices");

goto failed_my_devices;

}

printk(KERN_ERR"Fifo_dev:Succwss for my_devices");

cdev_init(&(fifo_devs->tcdev),&fifo_cdev);

ret=cdev_add(&(fifo_devs->tcdev),fdev_t,1);

if(ret<0)

{

printk(KERN_ERR"Fifo_dev:Succwss for cdev_add");

goto failed_cdev_add;

}

printk(KERN_ERR"Fifo_dev:Succwss for cdev_add");

fifo_devs->pri = FIRSTPRI_NUM;

fifo_devs->tail= FIRSTPRI_NUM;

return 0;

failed_cdev_add:

device_del(my_devices);

failed_my_devices:

class_destroy(my_class);

failed_my_class:

kfree(fifo_devs);

failed_kmalloc:

unregister_chrdev_region(fdev_t,DEV_NUM);

return -ENOANO;

}

static int fifo_resume(struct platform_device *dev)

{

cdev_del(&(fifo_devs->tcdev));

device_del(my_devices);

class_destroy(my_class);

kfree(fifo_devs);

unregister_chrdev_region(fdev_t,DEV_NUM);

return 0;

}

struct platform_driver fifo_plat_dri ={

.probe  = fifo_probe,

.resume = fifo_resume,

.driver = {

.name = DRI_NAME,

.owner = THIS_MODULE,

},

};

static int __init fifo_inits(void)

{

int ret;

ret = platform_driver_register(&fifo_plat_dri);

return 0;

}

static void __exit fifo_exits(void)

{

platform_driver_unregister(&fifo_plat_dri);

}

module_init(fifo_inits);

module_exit(fifo_exits);

测试:read.c

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/ioctl.h>

int main(int argc , char **argv){

int fd,count,i;

int buf[100];

char *lednode = "/dev/fifo_dev";

/*O_RDWR只读打开,O_NDELAY非阻塞方式*/

if((fd = open(lednode,O_RDWR|O_NDELAY))<0){

printf("APP open %s failed!\n",lednode);

}

else{

printf("APP open %s success!\n",lednode);

count = argv[1];

read(fd, buf, count);

printf("read num :\n");

for(i=0;i<count;i++)

{

printf("%d  ",buf[i]);

}

printf("\n");

}

close(fd);

}

write.c

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/ioctl.h>

int main(int argc , char **argv){

int fd,count,i;

int buf[100];

char *lednode = "/dev/fifo_dev";

/*O_RDWR只读打开,O_NDELAY非阻塞方式*/

if((fd = open(lednode,O_RDWR|O_NDELAY))<0){

printf("APP open %s failed!\n",lednode);

}

else{

printf("APP open %s success!\n",lednode);

count = argc;

for(i=1;i<=count;i++)

{

buf[i-1]=argv[i];

}

write(fd, buf,count);

}

close(fd);

}

时间: 2024-10-16 14:57:31

一份笔试题的相关文章

新浪PHP开发工程师面试笔试题

找实习找的心累,于是在学校bbs上找了一个新浪的散招. 先做了一份笔试题,题目如下. 1.列举一下你知道的Unix信号,并说明其用途 2.给你一个ip地址,写出其无符号32位的表示法 3.给你一些http的东西post请求,数据,cookie,URL,写一个http头. 4.简述一些shell命令 top/mv/find/sar/touch/wc/chmod/df/strace 5.用PHP写一个程序,打印出本月日历 6.简单的SQL查询.有一个取手机号的后四位,不会. 取某几位好像可以用SUB

某公司笔试题

记录一下一份笔试题上的知识点: 1.short类型的范围是多少? 2.考i++ 和++i的考点. 3.可以成为内部函数的修饰类型为. 4.关于建索引的知识. 5.wait() 和 sleep()的区别. 6. gc是什么,为什么需要有gc. 7.谈谈代码重复的理解. 8.final finally finalized的区别. 9.写一个singleton. 10.分别用递归和非递归实现二叉树的后序遍历. 11.有a[n]和b[n]两个数组,f(x)为随机函数,请将a[n]的数随机赋给b[n],要

整理收藏一份PHP高级工程师的笔试题

整理了一份PHP高级工程师的笔试题,问题很全面.嗯,基本上这些题都答得不错,那么你应该可以胜任大部分互联网企业的PHP职位了.下面直接上题. 1. 基本知识点 HTTP协议中几个状态码的含义:503,500,401,200,301,302... include,require,include_once,require_once 的区别. PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等. HEREDOC介绍. 写出一些php魔术方法. 一些

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

笔试题系列001

测试笔试题类型:软件测试| 试题:55道试题(50道选择题,5道问答题)http://bbs.sjtu.edu.cn/bbsanc,path,%2Fgroups%2FGROUP_9%2FJobInfo%2FD7CD26755%2FD85486036%2FM.1131274669.A.html http://202.197.191.206:8080/38/text/test/test_2/shijuan2.htm 软件工程 http://test.examw.com/410/P6517/一.单选题

诺基亚(Microsoft Devices Group)2014暑期实习生笔试题知识点

总结一下Microsoft Devices Group的软件类笔试题,所有笔试题分两份试卷,逻辑题一份和软件测试题一份,只总结技术题喽~题目全英文,只包含选择题和填空题,选择题居多,分单选和多选,多选题题目会标注出来.总体来说考察的很基础也很细节,难度适中.下面把记得的一些知识点总结一下下: *命名管道的定义. *主机A发送IP数据报给主机B,途中经过了5个路由器.试问在IP数据报的发送过程总共使用几次ARP(6次) *Linux系统下,给一个文件重命名(mv A,B) *考察无符号整型数和有符

转:嵌入式软件工程师经典笔试题

> 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)  #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3). 意识到这个表达式将使一个1

Android开发面试经——4.常见Android进阶笔试题(更新中...)

Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目, [<Android开发面试经——2.常见Android基础笔试题> ] (http://blog.csdn.net/finddreams/a

嵌入式c笔试题(整理)

嵌入式c笔试题 (2012-03-24 22:36) 预处理器(Preprocessor)1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的