嵌入式软件笔试题 (c语言版)

转自pkuyjxu

 

 

1:用C语言实现大小端的测试

Int CheckCpu()

{
    union
    {
        int a;

        char b;

     }c;

     c.a=1;

    if(c.b==1)

    printf(“小端”);

    else printf(“大端”);

}

2:volatile的作用有哪些?

Volatile第一变量相当于告诉编译器这个变量的值会随时发生变化,每次使用之前都要去内存里从新读取它的值,并不要随意针对它做优化,主要用在:

1:一个中断子程序中会访问到的非自动变量;

2:多线程应用中被几个线程共享的变量;

3:并行设备的硬件寄存器。

3:C语言中static关键字的作用有哪些?

     1:在函数体中,一个被声明为静态的变量在这个变量在调用过程中维持其值不变;

     2:在模块内(但在函数体外),一个被声明为静态的变量,可以被这个模块内的所用函数使用,但不能被模块外的函数使用,它是一个本地的全局变量;

     3:在模块内,一个被声明为静态变量的函数,智能被这个模块内的函数调用;

     4:static全局变量与局部变量的区别:static全局变量只能被初始化一次,防止其他单元文件中被引用;

     5:static局部变量与局部变量的区别:static局部变量只能被初始化一次,下一次依据上一次结果的值;

      6:static函数与普通函数的区别:static在内存中只用一份,普通函数在每一次调用中维持一份拷贝。

4:请问下面三种变量的区别:

   Int const *p :     指向常整型的指针;

   Int *const p;   指向整型的常指针;

   Int *const *p:   指向常整型的常指针;

5:在ARM系统中,在函数调用的时候,参数是通过哪种方式传递的。

    当参数小于等于4的时候是通过r0~r3来进行传递的,当参数大于4的时候是通过压栈的方式进行传递。

6:中断与异常有何区别.

     异常在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常;所谓中断是指外部硬件产生的一个电信号从CPU的中断引脚进入,打断CPU的运行。所谓异常是指软件运行过程中发生了一些必须作出处理的事件,CPU自动产生一个陷入来打断CPU的运行。

7:用预处理指令#define表示一年中有多少秒

#define SECONDS_PER_YEAR     (60*60*24*365)UL

   注意后面必须加UL,表示计算的结构是常整型。

8:简述SPI,UART,I2C三种传输方式。

SPI:高速同步串行口,首发独立,可同步进行

     SPI接口主要应用在EEPROM,Flash,实时时钟,A/D转化器,数字信号处理,是一种全双工同步通讯总线,该接口一般使用四条线:串行时钟线(sck),主出从入线,主入从出线,低电平有效地的从机选择线。

I2C协议:是单片机与其他芯片进行通讯的协议:1:只要求两条总线线路,一条是串行时钟线,一条是串行数据线; 2:通过软件设定地址   3:是一个多主机总线,如果两个或更多主机同时初始化数据传送可通过冲突检测和仲裁防止数据破坏; 4:I2C总线传输的是数据的总高位

UART:主要是由一个modem(调制解调器),可以将模拟信号量转化成数字信号量。

9:中断不能返回一个值,中断不能传递参数。

10:嵌入式系统总要求用户对变量或者寄存器进行位操作,给定一个整型变量a:

      define BIT3 (oxo1<<3)

        static int a ;

     void set_bit3(void)

        {

a|=BIT3;

}

void clear_bit3(void)

       {

a&=~BIT3;

}

作为一个嵌入式程序员,这种程序是小菜一碟,至所以给出这个程序,是想规范大家写程序方法,这里主要是用到了一个宏定义:BIT3  这样的话就可以增加程序的可读性

同时移植性也增强。

11:嵌入式系统中经常要求程序去访问某特定内存的特点,在某工程中,要求设定一个绝对地址0x6799的整型变量的值为0xaa66.

      Int *ptr;

      ptr=(int*)0x67a9;

      *ptr=aa66

12:引用和指针有什么区别?

      1:应用必须初始化,指针不必;

       2:引用处画化后不能改变,指针可以被改变;

       3:不存在指向空值的引用,但存在指向空值的指针;

   13:全局变量与局部变量在内存中是否有区别,是什么区别?

        全局变量存储在静态数据库,局部变量存储在堆栈;

14:写出float,bool,int类型与零的比较,假设变量为X:

       Int :    if(x==0)

       Float:    if(x>0.0000001&&x<0.0000001)

       Bool:      if(x==false)

15:Intertnet采用哪种网络协议,该协议的主要层次结构?

   TCP/IP协议

应用层/传输层/网络层/数字链路层/物理层。

16:IP地址有两部分组成:网络号和主机号

17:程序的局部变量存储在(栈)中,全局变量存储于(静态存储区),动态申请数据存储于(堆中);

18:编写一个字符串复制函数:strcpy(const char *str,const char *str1)

         void strcpy(const *char str,const chat *str1)

            {

               if(*str1==’\0’) return;

char *sp1,*sp2;

sp1= str;

sp2=str1;

while(*sp2!=’\0’)

{

*sp1=sp2;

sp1++;

sp2++;

}

}

19:编写一个函数实现字符串翻转 void rechange(char *str)

           void rechange(char *str)

               {

Int len;

char t;

len=strlen(str);

for(int i=0;len/2;i++)

{

t=str[i];

str[i]=str[len-i-1];

str[len-i-1]=t;

}

}

20:编写一个函数实现字符串比较 int strcmp(char *str1,char *str2),相等返回1,不相等返回0:

   int strcmp(char *str1,char *str2)

{

if(*str1==‘\0’||*str2==’\0’) return;

while(*str1!=’\0’&&*str2!=’\0’&&*str1==*str2)

{

str1++;

str2++;

}

if(*str1==*str2)

return 1;

else return 0;

}

}

21:进程和线程的区别:

     1:调度:线程作为调度和分配的基本单元,进程作为拥有资源的基本单位;

      2:并发性:不仅进程可以并发执行,同一进程内的线程也可以并发执行。

      3:拥有资源:进程是拥有资源的基本独立单元,线程不拥有资源,但可以访问进程内的资源;

4:在创建或撤销线程时,由于系统都要为之分配和回收内存资源,导致系统的开销明显大于创建或撤销线程时的开销。

 

 

嵌入式开发—C语言面试题 
预处理器(Preprocessor)

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 
我在这想看到几件事情: 
1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 
2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。 
3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 
4). 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2. 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。 
#define MIN(A,B) ((A) <= (B) (A) : ))

这个测试是为下面的目的而设的:

1). 标

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值