嵌入式Linux C笔试题积累

时间:2021-08-26 04:34:41

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

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

 __interrupt double compute_area (double radius)

{

double area = PI * radius * radius;

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

returnarea;

}

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

2).ISR 不能传递参数。

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

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

 

2.C语言中对位的操作

比如对a的第三位清0,第四位置1.

#defineBIT3 (1<<3)

#defineBIT4 (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;

 

7.

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

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

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

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

 

8.1.

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

#include <stdio.h>

#include <assert.h>

void* mem_cpy(void *dst, const void*src, int count)   //参数定义为空指针类型,并且源地址内容不应该被改变,因此用const修饰

{

/*

      if(NULL==dst|| NULL==src)

           returndst;

*/

      assert(dst);   //若传入参数不为真,程序退出

      assert(src);

      while(count--)

      {

           *(char*)dst= *(char*)src;    //强制转化为字符指针类型,并进行内容复制

           dst= (char*)dst +1;

           src= (char*)src +1;

      }

      returndst;

}

 

int main(int argc, char* argv[])

{

      charFrom[100] ="Hello baby!";

      charTo[100] = {0};

      mem_cpy(To,From,100);      //前两个参数位子不要弄错

      printf("%s\n",From);      //输出字符串

      printf("%s\n",To);

      return0;

 

}

 

精简版

char * strcpy(char * strDest,constchar * strSrc)

{

      char* strDestCopy=strDest;

      assert((strDest!=NULL) && (strSrc!=NULL) ); // #include <assert.h>

 

      while((*strDest++=*strSrc++)!='\0');

      returnstrDestCopy;

}


 

 

8.2.

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

#include "stdafx.h"

#include <assert.h>

#include <string.h>

 

int strcmp(char *source, char *dest)

{

 

   int i;

   assert((NULL != source)&&(NULL != dest));  //判断指针是否为空

   if(strlen(source) != strlen(dest))  //判断两字符串长度时候相等,不相等肯定不相等,直接退出

   {     

        return -1;

   }

   for(i = 0;i < strlen(source);i++)   //利用指针,将两字符串逐字比较

   {

        if(*(source + i) != *(dest + i))  //如果不相等,退出

            return -1;

   }

 

   return 0;

}

 

int main(int argc, char* argv[])

{

      staticchar a[2][10];        //定义一个二维数组

      intN;

      printf("inputtwo string\n");

      for(inti=0;i<2;i++)

      {

           scanf("%s",&a[i][0]);    //输入两个字符串

      }    

 

      N=strcmp(&a[0][0],&a[1][0]);   //调用自定义函数

      if(N== -1)

           printf("two different string\n");

      else

           printf("samestring\n");

      return0;

}



9.1.

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

#include <stdio.h>

intmain(int argc,char * argv[])

{

int a [3][2]={(0,1),(2,3),(4,5)};

int *p;

p=a [0];

printf("%d",p[0]);

}

问打印出来结果是多少?

答案:1.

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

 

10.

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

#include "stdafx.h"

#include<stdio.h>

#include <stdlib.h>

#include<string.h>

 

void s_back(char *p)

{

      inti=0;

      char*ps;

      char*pe;

      chartemp;

      if(!p)

           return;

      ps=p;

      while(*p!=0)

           p++;//最后一个字符满足要求,p++后指针指向了字符串外的一个地址;

      pe=p;

     

      for(i=0;i<(pe-ps)/2;i++)

      {

           temp=*(ps+i);

           *(ps+i)=*(pe-i-1);//由于pe指向的是字符串外的一个地址,因此这里还必须减一

           *(pe-i-1)=temp;

      }

}

 

int main(void)

{

      printf("input:");

      char*p=(char *)malloc(10);

      scanf("%s",p);

 

      s_back(p);

      printf("output:%s\n",p);

      free(p);

      return0;

}


11.

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

#include "stdafx.h"

#include <assert.h>

#include <string.h>

 

int fun(char *p)

{

      intlen;

      if(NULL== p)       //检测指针是否有效

           return-1;

      len=strlen(p)-1;      printf("len= %d\n",len);

      for(inti=0;i<(len/2);i++)

      {

           printf("*(p+%d)=%c\n*(p+len-%d)=%c\n",i,*(p+i),i,*(p+len-i-1));

           if(*(p+i)!= *(p+len-i-1))   //判断首尾是否依次相等,即是否为回文

                 return0;              //不是回文返回0

      }

      return1;        //是回文返回1

 

 

}

 

int main(int argc, char* argv[])

{

      intR;

      charch[]="abcdedcba";

      R=fun(ch);

      switch(R)

      {

           case-1:

                 printf("error!\n");

                 break;

           case0:

                 printf("it'snot huiweng\n");

                 break;

           case1:

                 printf("it'shuiweng\n");

                 break;

           default:

                 break;

      }

      return0;

}