嵌入式Linux C筆試題積累

 1.   嵌入式系統中斷服務子程序(ISR) c++

 中斷是嵌入式系統中重要的組成部分,這致使了很 多編譯開發商提供一種擴展—讓標準C支持中斷。具表明事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一箇中斷服務子程序(ISR),請評論一下這段代碼的。數組

 __interrupt double compute_area (double radius)多線程

{ double area = PI * radius * radius;函數

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

return area;ui

}spa

1). ISR 不能返回一個值。線程

2). ISR 不能傳遞參數。指針

3). 在許多的處理器/編譯器中,浮點通常都是不可重入的。有些處理器/編譯器須要讓額處的寄存器入棧,有些處理器/編譯器就是不容許在ISR中作浮點運算。此外,ISR應該是短而有效率的,在ISR中作浮點運算是不明智的。code

 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;

 

六、

#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.二、不使用庫函數,編寫函數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.一、在數組定義int a[2][2]={{3},{2,3}};則a[0][1]的值爲0。(對)
9.二、

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 }

十一、寫一函數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 }
相關文章
相關標籤/搜索