嵌入式题目
1、strcmp函數的用法
頭文件為string.h,函數原型為:
extern int strcmp(const char *s1,const char *s2);設這兩個字符串為s1,s2,
若s1=s2,則返回零; 若s1<s2,則返回負數; 若s1>s2,則返回正數。 函數實現為:int strcmp(const char *string1, const char *string2) {for (; *string1 == *string2; string1++, string2++){if (*string2 == '\0'){return 0;}}return (*(unsigned char *)string1) < (*(unsigned char *)string2) ? -1:+1; }
另外一種方式實現:
int strcmp(const char *string1, const char *string2) {int ret;while (*string1 == *string2){assert((string1 != NULL) && (string2 != NULL));if (*string1 == '\0')return 0;string1++;string2++;}ret = *string1 - *string2;if (ret > 0)return 1;elsereturn 0; }2、strcpy函數的用法
strcpy把含有'\0'結束符的字符串復制到另一個地址空間,返回值的類型為char*,函數原型為:
char *strcpy(char* dest, const char *src); 函數實現為: char* strcpy(char *string1, const char *string2) {char *str = string1;assert((string1 != NULL) && (string2 != NULL));while (*string2 != '\0'){*string1 = *string2;string1++;string2++;}*string1 = '\0';return str; }3、編程實現Socke?
?socket相當于進行網絡通信兩端的插座,只要對方的socket和自己的socket有通信連接,雙方就可以進行通信
服務端程序編寫:
1)調用serversocket(int port)創建一個服務器端的套接字,并綁定到指定的端口號;
2)調用accept(),監聽連接請求,有連接請求,則接收連接,返回通信套接字;
3)調用socket的getOutStream()和getinputStrem()獲取輸出流和輸入流,開始網絡的輸入與輸出;
4)關閉通信套接字socket.close()。
客戶端的程序編寫:
1)調用socket創建一個套接字,并連接到服務器;
2)調用socket類的getoutputstream()和getinputstream獲取輸出流和輸入流,開始網絡的數據發送和接收;
3)關閉通信套接字socket.close()。
4、C++中explict關鍵詞的作用?
C++提供了關鍵詞explicit,可以阻止不應該允許的經過轉換構造函數進行的隱式轉換的發生。聲明為explicit的構造函數不能在隱式轉換中使用。
5、寫一個函數實現字符串壓縮功能,例如”abbcccaaaa“能被壓縮成”a1b2c3a4“?
?
6、共模電路和差模電路的結構?共模信號和差模信號的區別?
?
7、三相四線電力矢量圖?有用功率的計算公式理解?
?
8、有一副撲克牌,共54張,大小王2張,剩余的花色四種:方塊、梅花、紅桃、黑心。
(1)用熟悉的語言去描述這副撲克牌;
(2)撲克牌有缺失,寫出找出缺失撲克牌的算法(程序方框圖)
?
?9、Linux線程與進程的區別?
1)線程與進程的定義:
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程是進程的一個實體,行的基本單位。線程自己基本不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器、一組寄存器和棧),但是它可與同屬一個進程的其他線程共享進程所擁有的全部資源,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的單元。
2)線程與進程的關系:
一個線程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以并發執行。相對于進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
3)線程與進程的區別:
主要差別在于它們是不同的操作系統資源管理方式。進程擁有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其他進程產生影響,而線程只是一個進程中的不同執行路徑。線程擁有自己的堆棧和局部變量,但是線程之間沒有獨立的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比線程的的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
總結:
- 一個程序至少有一個進程,一個進程至少有一個線程
- 線程的劃分尺度小于進程,使得多線程的程序并發性高
- 進程在執行的過程中擁有獨立的內存單元,而多個線程共享內存,從而極大提高了程序的運行效率
- 線程在執行過程中和進程是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制
- 從邏輯角度的意義看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。
?4)線程與進程的優缺點:
線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。
?10、Linux進程運行狀態圖?
圖:Linux進程運行狀態
- 運行狀態(TASK_RUNNING):當進程正在被CPU執行,或已經準備就緒隨時可以由調度程序執行,則該進程處于運行狀態(running)
- 可中斷睡眠狀態(TASK_INTERRUPTIBLE):進程收到一個信號,都可以喚醒進程轉換到就緒狀態(運行狀態)
- 不可中斷睡眠狀態(TASK_UNINTERRUPTIBLE):處于該狀態只有被使用wake_up()函數喚醒才能轉換到可運行的就緒狀態
- 暫停狀態(TASK_STOPPED):進程收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時就會進入暫停狀態
- 僵死狀態(TASK_ZOMBIE):進程已經停止運行,但其父進程還沒有詢問其狀態時,則進程處于僵死狀態
11、下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程序(ISR),請評論以下這段代碼。
__interrupt double compute_area(double radius){double area = PI * radius *radius;printf("nArea = %f", area);return area;}答:
1)ISR不能返回一個值;
2)ISR不能傳遞形參;
3)浮點一般都是不可重入的;
4)printf函數有重入和性能上的問題。
12、用變量a給出下面的定義?
a) 一個整型數(An integer)?
b) 一個指向整型數的指針(A pointer to an integer)?
c) 一個指向指針的的指針,它指向的指針是指向一個整型數(A pointer to a pointer?
to an integer)?
d) 一個有10個整型數的數組(An array of 10 integers)?
e) 一個有10個指針的數組,該指針是指向一個整型數的(An array of 10 pointers to?
integers)?
f) 一個指向有10個整型數數組的指針(A pointer to an array of 10 integers)?
g) 一個指向函數的指針,該函數有一個整型參數并返回一個整型數(A pointer to a fu?
nction that takes an integer as an argument and returns an integer)?
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型?
數( An array of ten pointers to functions that take an integer argument and r?
eturn an integer )
答:
a) int a;
b) int *a;
c) int **a;
d) int a[10];
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int b)
h) int (*a[10])(int b)
12、 用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)?
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL?
13、關鍵字static的作用是什么?
C語言中,static關鍵詞有三個作用:
1)在函數體內,一個被聲明為靜態的變量,函數被調用過程中維持其值不變;
2)在模塊內(但在函數體外),一個被聲明為靜態的變量,能被模塊內的所用函數進行調用;
3)在模塊內,一個被聲明為為靜態的函數只可被這一模塊內的其他函數進行調用。靜態函數被聲明模塊內的本地范圍內使用。
14、關鍵詞const是什么含義?
1)只讀
2)告訴用戶這個參數的應用目的
3)給優化器一些附加的信息,產生更緊湊的代碼
4)防止不希望改變的參數被無意的代碼修改
下面的聲明是什么意思?
a)const int a; b)int const a; c)const int *a; d)int * const a; e)int const * a const;a)a是一個整形常量;
b)a是一個整形常量;
c)a指向一個整形常量;
d)a是一個常量指針,指向一個整形數;
e)a是一個指向整形常量的常指針。
15、volatile關鍵字有什么含義?并給出三個不同的例子
定義為volatile的變量說明這個變量可能會被意想不到地改變,編譯器不會去假設這個值。優化器在用到這個變量時必須每次小心地讀取這個變量的值,而不是使用保存在寄存器里面備份的值。
下面是volatile變量的幾個例子:
1)并行設備的硬件寄存器(如:狀態寄存器);
2)一個中斷服務子程序中會訪問到的非自動變量;
3)多線程應用中被幾個任務共享的變量。
16、嵌入式系統總是要用戶對變量或寄存器進行位操作,給定一個整形變量a,寫兩段代碼,第一個設置a的bit3,第二個清除a的bit3,在以上兩個操作中,要保持其他位不變
#define BIT3 (0x1<<3)void set_bit3(void) {a|=BIT3; }void clear_bit3(void) {a &=~BIT3; }17、嵌入式系統經常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求
設置一絕對地址為0x67a9的整型變量的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫?
代碼去完成這一任務。
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/Cqlismy/p/10513008.html
總結
- 上一篇: Leetcode 921. Minimu
- 下一篇: idea 与springboot 快捷键