嵌入式笔试

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

   IntCheckCpu()

      {

union

{

int a;

char b;

}c;

c.a=1;

if(c.b==1)

printf(“小端”)

else printf(“大端”);

}

2volatile的作用有哪些?

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

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

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

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

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

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

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

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

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

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

      6static函数与普通函数的区别: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接口主要应用在EEPROMFlash,实时时钟,A/D转化器,数字信号处理,是一种全双工同步通讯总线,该接口一般使用四条线:串行时钟线(sck),主出从入线,主入从出线,低电平有效地的从机选择线。

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

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

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

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

      defineBIT3 (oxo1<<3)

        staticint a ;

     voidset_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:写出floatboolint 类型与零的比较,假设变量为X

       Int     ifx==0

       Float    ifx>0.0000001&&x<0.0000001

       Bool:      if(x==false)

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

   TCP/IP协议

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

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

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

18:编写一个字符串复制函数:strcpyconst char *strconstchar *str1

         voidstrcpy(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 rechangechar *str

           voidrechangechar *str

               {

Int len

char t

len=strlenstr);

forint i=0len/2i++

{

t=str[i];

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

str[len-i-1]=t;

}

}

20:编写一个函数实现字符串比较 int strcmpchar *str1char *str2,相等返回1,不相等返回0

   intstrcmpchar *str1char *str2

{

if*str1==/0||*str2==’/0’ return;

while(*str1=’/0’&&*str2=’/0’&&*str1==*str2)

{

str1++

str2++

}

if(*str1==*str2)

return1;

elsereturn 0;

}

}

21:进程和线程的区别:

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

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

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

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

 

1、将一个字符串逆序
2、将一个链表逆序
3、计算一个字节里(byte)里面有多少bit被置1
4、搜索给定的字节(byte)
5、在一个字符串中找到可能的最长的子字符串
6、字符串转换为整数
7、整数转换为字符串


#include
using namespace std;
//#define NULL ((void *)0)
char * mystrrev(char * const dest,const char * const src)
{
if (dest==NULL && src==NULL)
   return NULL;

char *addr = dest;
int val_len = strlen(src);
dest[val_len] = ''/0'
int i;
for (i=0; i
{
   *(dest+i) = *(src+val_len-i-1);  
}

return addr;


}
main()
{
char *str="asdfa";
char *str1=NULL;
str1 = (char *)malloc(20);
if (str1 == NULL)
   cout<<"malloc failed";

cout<
free(str1);
str1=NULL;//杜绝野指针
}

 

p=head;
q=p->next;
while(q!=NULL)
{
temp=q->next;
q->next=p;
p=q;
q=temp;
}
这样增加个辅助的指针就行乐。

 

ok 通过编译的代码:
#include
#include
#include

typedef struct List{
int data;
struct List *next;
}List;

List *list_create(void)
{
struct List *head,*tail,*p;
int e;
head=(List *)malloc(sizeof(List));
tail=head;
printf("/nList Create,input numbers(end of0):");
scanf("%d",&e);
while(e){
p=(List *)malloc(sizeof(List));
p->data=e;
tail->next=p;
tail=p;
scanf("%d",&e);}

tail->next=NULL;
return head;
}

List *list_reverse(List *head)
{
List *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}

head->next=NULL;
head=p;
return head;
}

void main(void)
{
struct List *head,*p;
int d;
head=list_create();
printf("/n");
for(p=head->next;p;p=p->next)
printf("--%d--",p->data);

head=list_reverse(head);
printf("/n");
for(p=head;p->next;p=p->next)
printf("--%d--",p->data);
}

 

 

       编写函数数NBYTE的数据中有多少位是1
解:此题按步骤解:先定位到某一个BYTE数据;再计算其中有多少个1。叠加得解。

#incluede
#define N 10
//定义BYTE类型别名
#ifndef BYTE
typedef unsigned char BYTE;
#endif

int comb(BYTE b[],int n)
{
int count=0;
int bi,bj;
BYTE cc=1,tt;

//历遍到第biBYTE数据
for(bi=0;bi
{
//计算该BYTE8bit中有多少个1
tt=b[bi];
       for(bj=0;bj<8;bj++)
{
         //1相与或模2结果是否是1?测试当前bit是否为1
         //if(tt%2==1)
       if((tt&cc)==1)
{
           count++;
         }
         //右移一位或除以2,效果相同
//tt=tt>>1;
tt=tt/2;
}
}
return count;
}

//测试
int main()
{
BYTE b[10]={3,3,3,11,1,1,1,1,1,1};
cout<<<ENDL;
return 0;
}

 

1。编写一个 C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char * search(char *cpSource, char ch)
{
char *cpTemp=NULL, *cpDest=NULL;
int iTemp, iCount=0;
while(*cpSource)
{
if(*cpSource == ch)
{
iTemp = 0;
cpTemp = cpSource;
while(*cpSource == ch)
++iTemp, ++cpSource;
if(iTemp > iCount)
iCount = iTemp, cpDest = cpTemp;
if(!*cpSource)
break;
}
++cpSource;
}
return cpDest;
}

 

#include
#include

//

// 自定义函数MyAtoI

// 实现整数字符串转换为证书输出

// 程序不检查字符串的正确性,请用户在调用前检查

//

int MyAtoI(char str[])
{
int i;
int weight = 1; // 权重
int rtn = 0; // 用作返回

for(i = strlen(str) - 1; i >= 0; i--)
{
   rtn += (str[i] - ''0'')* weight; //
   weight *= 10; // 增重
}

return rtn;
}

void main()
{
char str[32];

printf("Input a string :");
gets(str);

printf("%d/n", MyAtoI(str));
}

 

 

#include
#include
void reverse(char s[])
{   //字符串反转
    int c, i=0, j;
    for(j=strlen(s)-1;i
    {    c=s[i];
        s[i]=s[j];
        s[j]=c;
        i++;
    }
}
void IntegerToString(char s[],int n)
{    int i=0,sign;
    if((sign=n)<0)//如果是负数,先转成正数  
        n=-n;
    do //从个位开始变成字符,直到最高位,最后应该反转
    {    s[i++]=n%10+''0'
    }while((n=n/10)>0);
    //如果是负数,补上负号
    if(sign<0)
        s[i++]=''-'
    s[i]=''/0'//字符串结束
    reverse(s);
}
void main()
{    int m;
    char c[100];
    printf("请输入整数m:");
    scanf("%d",&m);
    IntegerToString(c,m);
    printf("integer = %d string = %s/n",m, c);
}

1c51单片机的串口异步通信和同步通信的区别,说说他们的优缺点。

2C51单片机的数据总线和地址总线是如何复用的,说明原理。

3C51单片机的绝对寻址范围是多少k

4、说明下面的寻址方式

    (1)MOV A ,#30H                                         (2)MOV A,@R0

     (3)ADDA ,R4                                               (4)MOV  A+@DPTR

5、写出下面分别是什么指针? 

    (1)int*a[10];                                               (2)int  (*a)[10];   

     (3)int (*P)(int) ;                                           (4)int (*a[10])(int);

6

void swapint aint b

{

      int temp

      temp = a;

       a=b;

       b=temp

}

main(void)

{

        int x="3"y=4;

        swap(x,y)

}

 上面程序执行完后 x= ?,y=?

7typedefstruct  test{

            int i;

             short s

             char c

            union{

                  int a

                  short b;

           }

   }example 

    int y 

    y =sizeof(example)

请问在TC环境下,y=?

8、编程实现数组的逆置,例如,“hello,world!”  逆置后为“!dlrow,olleh”

9、你认为嵌入式操作系统包括哪些部分?说说实时操作系统有哪些特点。

10、冯诺依曼结构的计算机由哪几部分组成?

11、说说程序,进程,线程的区别。

12、说说你怎样理解

        程序 = 数据 + 结构 + 算法

13、根据函数原型编程实现 一个数组,按从大到小的冒泡排序。

      void tibbuleint a[],int n;//a[]为数组,n为数组长度

14OSI有哪几层?tcp/ip包括哪几层?

15、编程实现一个双链表的节点插入和删除

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值