1 讀程式段,回答問題
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}
a) 寫出程式輸出
b) 在一個可移植的系統中這種運算式是否存在風險?why?
#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) 寫出程式輸出
b) 編譯器如果安排各個變數(a,b,c,d)在記憶體中的布局(eg. stack,heap,data section,bss section),最好用圖形方式描述。
2 中斷是嵌入式系統中重要的組成部分,這導致了許多編譯開發商提供一種擴充:讓標準C支援中斷,產生了一個新的關鍵字__interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程式(ISR),請評論以下這段代碼。
__interrupt double compute_area(double radius)
{
double area = PI * radius *radius;
printf("nArea = %f", area);
return area;
}
3 C/C++基礎知識問題
a) 關鍵字volatile在編譯時間有什麼含義?並給出三個不同使用情境的例子(可以虛擬碼或者文字描述)。
b) C語言中static關鍵字的具體作用有哪些 ?
c) 請問下面三種變數聲明有何區別?請給出具體含義
int const *p;
int* const p;
int const* const p;
4 嵌入式系統相關問題
a) 對於整形變數A=0x12345678,請畫出在little endian及big endian的方式下在記憶體中是如何儲存的。
b) 在ARM系統中,函數調用的時候,參數是通過哪種方式傳遞的?
c) 中斷(interrupt,如鍵盤中斷)與異常(exception,如除零異常)有何區別?
5 設週期性任務P1,P2,P3的周期為T1,T2,T3分別為100,150,400;執行時間分別為20,40,100。請設計一種調度演算法進行任務調度,滿足任務執行循環及任務周期。
6 優先順序反轉問題在嵌入式系統中是一中嚴重的問題,必須給與足夠重視。
a) 首先請解釋優先順序反轉問題
b) 很多RTOS提供優先順序繼承策略(Priority inheritance)和優先順序天花板策略(Priority ceilings)用來解決優先順序反轉問題,請討論這兩種策略。 參考答案:1 5
存在風險,因為c=c++%5;這個運算式對c有兩次修改,行為未定義,c的值不確定
int a=0; // data section
int b; // data section
static char c; // BSS
int main(int argc,char *argv[])
{
char d=4; // stack
static short e; // BSS 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=2,b=100,c=2,d=6,e=5 2 a)ISR不能返回一個值;
b)ISR不能傳遞參數;
c)浮點一般都是不可重新進入的;
d)printf函數有重入和效能上的問題。 3 a) 用volatile關鍵字定義變數,相當於告訴編譯器,這個變數的值會隨時發生變化,每次使用時都需要去記憶體裡重新讀取它的值,並不要隨意針對它作最佳化。建議使用volatile變數的場所:
(1) 平行裝置的硬體寄存器
(2) 一個中斷服務子程式中會訪問到的非自動變數(全域變數)
(3) 多線程應用中被幾個任務共用的變數 b) 在函數體,一個被聲明為靜態變數在這一函數被調用過程中維持其值不變。
在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內所用函數訪問,但不能被模組外其它函數訪問。它是一個本地的全域變數。
在模組內,一個被聲明為靜態函數只可被這一模組內的其它函數調用。那就是,這個函數被限制在聲明它的模組的本地範圍內使用。
static全域變數與普通的全域變數有什麼區別:static全域變數只初使化一次,防止在其他檔案單元中被引用;
static局部變數和普通局部變數有什麼區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在記憶體中只有一份,普通函數在每個被調用中維持一份拷貝 c) 一個指向常整型數的指標
一個指向整型數的常指標
一個指向常整型數的常指標4 a) 0x12345678
little endian big endian 剛好反過來
高地址--〉 0x12 低地址--〉 0x12
0x34 0x34
0x56 0x56
低地址--〉 0x78 高地址--〉 0x78
b)參數<=4時候,通過R0~R3傳遞,>4的通過壓棧方式傳遞c) 異常:在產生時必須考慮與處理器的時鐘同步,實踐上,異常也稱為同步中斷。在處理器執行到由於編程失誤而導致的錯誤指令時,或者在執行期間出現特殊情況(如缺頁),必須靠核心處理的時候,處理器就會產生一個異常。所謂中斷應該是指外部硬體產生的一個電訊號,從cpu的中斷引腳進入,打斷cpu當前的運行;
所謂異常,是指軟體運行中發生了一些必須作出處理的事件,cpu自動產生一個陷入來打斷當前運行,轉入異常處理流程。
非同步與同步的區別`5 6 高優先順序任務需要等待低優先順序任務釋放資源,而低優先順序任務又正在等待中等優先順序任務的現象叫做優先順序反轉
優先順序繼承策略(Priority inheritance):繼承現有被阻塞任務的最高優先順序作為其優先順序,任務退出臨界區,恢複初始優先順序。
優先順序天花板策略(Priority ceilings):控制訪問臨界資源的訊號量的優先順序天花板。
優先順序繼承策略對任務執行流程的影響相對教小,因為只有當高優先順序任務申請已被低優先順序任務佔有的臨界資源這一事實發生時,才抬升低優先順序任務的優先順序。