嵌入式Linux C笔试题积累

2019-07-12 22:02发布

 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)。 [cpp] view plaincopy
  1. "FONT-SIZE: 13px">#include   
  2. #include   
  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 ",From);      //输出字符串  
  26.     printf("%s ",To);  
  27.     return 0;  
  28.   
  29. }  
  30.    
精简版 [cpp] view plaincopy
  1. char * strcpy(char * strDest,const char * strSrc)  
  2. {  
  3.     char * strDestCopy=strDest;  
  4.     assert( (strDest!=NULL) && (strSrc!=NULL) ); // #include   
  5.   
  6.     while ((*strDest++=*strSrc++)!='