嵌入式Linux C笔试题积累

1.   嵌入式系统中断服务子程序(ISR)

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

__interrupt double compute_area (double radius)

{ double area = PI * radius * radius;

printf(" Area = %f", area);

return area;

}

1). ISR 不能返回一个值。

2). ISR 不能传递参数。

3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

4). 与第三点一脉相承,printf()经常有重入和性能上的问题。

2.C语言中对位的操作,比如对a的第三位清0,第四位置1.本来应该会的,一犯晕写反了,以后注意!

#define BIT3 (1<<3)

#define BIT4 (1<<4)

a &= ~BIT3;   a |= BIT4;

3.volatile

表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本。

volatile表示直接存取原始地址

例:

并行设备的硬件寄存器(状态寄存器)

在多线程运行的时候共享变量也要时时更新

一个中断服务子程序中访问到的的非自动变量(定义变量时默认为自动变量,这里指全局变量或加修饰的变量)

4.Const:
Const char*p    //p 指向的内容不能被修改
Char const *p;     // p指针指向内容不能修改

Const (char*) p;  //p指针不能修改,p++ 操作会出错
Const type fun();     // 返回值类型为一个const type类型,不能修改
Fun( const char *p);     //保护指针,引用传递的值不被修改.
类成员函数:中 fun() const;     //表明FUN不能修改成员变量,不调用非const 成员函数.

5.要求设置一绝对地址为0x67a9 的整型变量的值为0xaa66

int *ptr = (int *)0x67a9;

*ptr = 0xaa66;

6、

#include "stdio.h"
int a=0; 
int b;
static char c;
int main(int argc,char *argv[])
{
char d=4;
static short e;

a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a) 写出程序输出
答案:a = 2, b = 100, c = 2, d = 6, e = 5

7a)对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的?

little endian        big endian 刚好反过来
高地址--〉 0x12      低地址--〉 0x12
                     0x34                          0x34
                     0x56                          0x56
低地址--〉 0x78      高地址--〉 0x78
记忆方法:

小端模式 : 地址的增长顺序与值的增长顺序相同(x86为小端模式)

大端模式 : 地址的增长顺序与值的增长顺序相反

b)在ARM系统中,函数调用的时候,参数是通过哪种方式传递的?
    参数<=4时候,通过R0~R3传递,>4的通过压栈方式传递

8 .1请实现内存复制函数void* memcpy(void* dst, void* src, int count)。

 1 #include <stdio.h>
 2 #include <assert.h>
 3 void* mem_cpy(void *dst, const void *src, int count)   //参数定义为空指针类型,并且源地址内容不应该被改变,因此用const修饰
 4 {
 5 /*
 6     if(NULL==dst || NULL==src)
 7         return dst;
 8 */
 9     assert(dst);   //若传入参数不为真,程序退出
10     assert(src);
11     while(count--)
12     {
13         *(char*)dst = *(char*)src;    //强制转化为字符指针类型,并进行内容复制
14         dst = (char*)dst +1;
15         src = (char*)src +1;
16     }
17     return dst;
18 }
19
20 int main(int argc, char* argv[])
21 {
22     char From[100] ="Hello baby!";
23     char To[100] = {0};
24     mem_cpy(To,From,100);      //前两个参数位子不要弄错
25     printf("%s\n",From);      //输出字符串
26     printf("%s\n",To);
27     return 0;
28
29 }

精简版

1 char * strcpy(char * strDest,const char * strSrc)
2 {
3     char * strDestCopy=strDest;
4     assert( (strDest!=NULL) && (strSrc!=NULL) ); // #include <assert.h>
5
6     while ((*strDest++=*strSrc++)!=‘\0‘);
7     return strDestCopy;
8 }

8.2、不使用库函数,编写函数int strcmp(char *source, char *dest)相等返回0,不等返回-1;

 1 #include "stdafx.h"
 2 #include <assert.h>
 3 #include <string.h>
 4
 5 int strcmp(char *source, char *dest)
 6 {
 7
 8     int i;
 9     assert((NULL != source)&&(NULL != dest));  //判断指针是否为空
10     if(strlen(source) != strlen(dest))   //判断两字符串长度时候相等,不相等肯定不相等,直接退出
11     {
12         return -1;
13     }
14     for(i = 0;i < strlen(source);i++)   //利用指针,将两字符串逐字比较
15     {
16         if(*(source + i) != *(dest + i))  //如果不相等,退出
17             return -1;
18     }
19
20     return 0;
21 }
22
23 int main(int argc, char* argv[])
24 {
25     static char a[2][10];        //定义一个二维数组
26     int N;
27     printf("input two string\n");
28     for(int i=0;i<2;i++)
29     {
30         scanf("%s",&a[i][0]);    //输入两个字符串
31     }
32
33     N=strcmp(&a[0][0],&a[1][0]);   //调用自定义函数
34     if(N == -1)
35         printf(" two different string\n");
36     else
37         printf("same string\n");
38     return 0;
39 }

9.1、在数组定义int a[2][2]={{3},{2,3}};则a[0][1]的值为0。(对)
9.2、

1 #include <stdio.h>
2 in tmain(int argc,char * argv[])
3 {
4     int a [3][2]={(0,1),(2,3),(4,5)};
5     int *p;
6     p=a [0];
7     printf("%d",p[0]);
8 }

问打印出来结果是多少?

答案:1.

分析:花括号里嵌套的是小括号而不是花括号!这里是花括号里面嵌套了逗号表达式!其实这个赋值就相当于int a [3][2]={ 1, 3, 5};

10.0 输入任意字符串,打印输出其逆序:

 1 #include "stdafx.h"
 2 #include<stdio.h>
 3 #include <stdlib.h>
 4 #include<string.h>
 5
 6 void s_back(char *p)
 7 {
 8     int i=0;
 9     char *ps;
10     char *pe;
11     char temp;
12     if(!p)
13         return;
14     ps=p;
15     while(*p!=0)
16         p++; //最后一个字符满足要求,p++后指针指向了字符串外的一个地址;
17     pe=p;
18
19     for(i=0;i<(pe-ps)/2;i++)
20     {
21         temp=*(ps+i);
22         *(ps+i)=*(pe-i-1); //由于pe指向的是字符串外的一个地址,因此这里还必须减一
23         *(pe-i-1)=temp;
24     }
25 }
26
27 int main(void)
28 {
29     printf("input:");
30     char *p=(char *)malloc(10);
31     scanf("%s",p);
32
33     s_back(p);
34     printf("output:%s\n",p);
35     free(p);
36     return 0;
37 }

11、写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1

 1 #include "stdafx.h"
 2 #include <assert.h>
 3 #include <string.h>
 4
 5 int fun(char *p)
 6 {
 7     int len;
 8     if(NULL == p)       //检测指针是否有效
 9         return -1;
10     len=strlen(p)-1;       printf("len = %d\n",len);
11     for(int i=0;i<(len/2);i++)
12     {
13         printf("*(p+%d)=%c\n *(p+len-%d)=%c\n",i,*(p+i),i,*(p+len-i-1));
14         if(*(p+i) != *(p+len-i-1))   //判断首尾是否依次相等,即是否为回文
15             return 0;              //不是回文返回0
16     }
17     return 1;        //是回文返回1
18
19
20 }
21
22 int main(int argc, char* argv[])
23 {
24     int R;
25     char ch[]="abcdedcba";
26     R=fun(ch);
27     switch (R)
28     {
29         case -1:
30             printf("error!\n");
31             break;
32         case 0:
33             printf("it‘s not huiweng\n");
34             break;
35         case 1:
36             printf("it‘s huiweng\n");
37             break;
38         default:
39             break;
40     }
41     return 0;
42 }

嵌入式Linux C笔试题积累

时间: 2024-10-10 07:29:30

嵌入式Linux C笔试题积累的相关文章

嵌入式Linux C笔试题积累(转)

http://blog.csdn.net/h_armony/article/details/6764811 1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 多编译开发商提供一种扩展—让标准C支持中断.具代表事实是,产生了一个新的关键字 __interrupt.下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的. __interrupt double compute_area (double radi

非常全的linux面试笔试题及答案

非常全的linux面试笔试题及答案 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 i节点来标识.4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块.5. 链接分为: 硬链接 和 符号链接 .6. 超级块包含了i节点表 和 空闲块表等重要的文件系统信息.7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八

(转载)非常全的linux面试笔试题及参考答案

一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 i节点来标识.4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块.5. 链接分为: 硬链接 和 符号链接 .6. 超级块包含了i节点表 和 空闲块表等重要的文件系统信息.7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是 

硬件笔试题积累1

1.同步电路和异步电路的区别是什么 同步电路:电路中所有触发器的时钟输入端都接同一个时钟源,因而所有触发器的状态的变化都与所加的时钟脉冲沿同步. 异步电路:电路没有统一的时钟,有些触发器的状态的变化不与所加的时钟脉冲同步. 2.什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求? 将两个门电路的输出端并联来实现“线与”. 在硬件上,要用OC门来实现,同时在输出端加一个上拉电阻. OC(Open Collector)门,又称集电极开路门. OD(Open Drain)门,又称漏极开

嵌入式c笔试题(整理)

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

老男孩教育-linux面试题-笔试题-1

2. 笔试题-1 2.1 新建一个用户user,密码是123456,并将其加到root组 useradd user -G root && echo "123456"|passwd --stdin user 2.2 显示当前系统的日期和时间 [[email protected] /]# date +%F 2016-08-25 [[email protected] /]# date +%X 10时16分25秒 [[email protected] /]# date +%H:

嵌入式linux面试题解析(二)——C语言部分二

嵌入式linux面试题解析(二)--C语言部分二 1..h头文件中的ifndef/define/endif 的作用?    答:防止该头文件被重复引用. 2.#include 与 #include "file.h"的区别?    答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h. 3.描述实时系统的基本特性    答 :在特定时间内完成特定的任务,实时性与可靠性. 4.全局变量和局部变量在内存中是否有区别?如果有,是

嵌入式linux面试题解析(一)——ARM部分二

嵌入式linux面试题解析(一)--ARM部分二 1.描述一下嵌入式基于ROM的运行方式基于RAM的运行方式有什么区别. 基于RAM的运行方式:需要把硬盘和其他介质的代码先加载到ram中,加载过程中一般有重定位的操作: 基于ROM:没有上面的操作. 基于ROM:速度较基于RAM的慢,因为会有一个把变量,部分代码等从存储器(硬盘,flash)搬移到RAM的过程:可用RAM资源比基于RAM的多: 基于RAM:速度较基于ROM的快,可用RAM比基于ROM的少,因为所有的代码,数据都必须存放在RAM中.

嵌入式linux面试题解析(三)——Linux应用编程部分一

嵌入式linux面试题解析(三)--Linux应用编程部分一 1.TCP与UDP的区别 TCP:是面向连接的流传输控制协议,具有高可靠性,确保传输数据的正确性,有验证重发机制,不会出现丢失或乱序. UDP:是无连接的数据报服务,不对数据报进行检查与修改,无须等待对方的应答,会出现分组丢失.重复.乱序,但具有较好的实时性,UDP段结构比TCP的段结构简单,因此网络开销也小. 2.流量控制和拥塞控制 拥塞控制    网络拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致