嵌入式程式設計方面的問題:
1、找出下面程式的錯誤 (乙個中斷服務子程式isr)
interrupt double compute_area(double radius)
double area = pi *radius * radius;
printf("\narea=%f",area);
return area;
解答:a、isr不能返回乙個值。
b、isr不能傳遞引數。
c、在許多處理器編譯器中,浮點一般都是不可衝入的。有些處理器編譯器需要讓額外的暫存器入棧,有些處理器編譯器就不允許在isr中做浮點運算。此外isr應該是短而有效率的。在isr中做浮點運算是不明智的。
d、printf經常是有衝入性和效能上的問題,所以一般不使用printf函式。
2、volatile關鍵字的意義和用途
volatile的語法和const的語法是一樣的,但是volatile的意思是「在編譯器認識的範圍外,這個資料可以被改變」。環境在不知原因的條件下改變資料,所以,volatile在告訴編譯器不要擅自做出有關資料的任何假定,在優化期間這是特別重要的。
通俗的說,volatile的乙個定義為:定義為volatile的變數是說這個變數可能會被異想不到的改變,這樣編譯器就不會去假設這個變數的值了。精確的說,優化器在用到這個變數的時候必須每次都小心的重新讀取這個變數的值,而不是使用暫存器中備份的值。
下面是使用volatile變數的幾個例子:
a、並行裝置的硬體暫存器,如狀態暫存器,處理器的狀態不停的在變化,所以暫存器的值也在不斷的隨處理器狀態的變化而變化。
b、乙個中斷服務子程式中會訪問到得非自動變數
c、多執行緒應用中被幾個任務共享的變數。每個執行緒都有可能會修改變數的值。
下面乙個關於volatile的問題:
乙個引數既可以是const也是volatile嗎?乙個指標可以使volatile嗎?
第乙個問題:是的,最好的例子就是唯讀的狀態暫存器。他是volatile,因為它可能會被意想不到的改變;他又是const,因為程式不應該試圖去修改它。
第二個問題:是的。儘管這並不常見,乙個例子就是當中斷服務子程式修改乙個指向乙個buffer的指標時。
再看乙個例項:
下面的函式有什麼錯誤?
int square(volatile int *ptr)
return *ptr * (*ptr);
解析:程式的目的是想用來返回指標*ptr指向值的平方,但是由於*ptr是指向乙個volatile型引數,編譯器將產生下面類似的**:
int square(volatile int *ptr)
int a,b;
a = *ptr;
b = *ptr;
return a*b;
由於*ptr的值可能被意想不到地改變,因此a和b可能是不相同的。結果是可想而知的。
正確的**如下:
long square(volatile int *ptr)
int a;
a = *ptr;
return a*a;
3、訪問特定位置的記憶體特點
要求設定一絕對位址為0x67a9的整型變數的值為0xaa66.編譯器是乙個純粹的ansi編譯器。
典型的答案為:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;
一種不合理的方法:
*(int *const)(0x67a9) = 0xaa66;
4、寫兩段**,乙個設定a的bit 3,乙個清楚a的bit 3
最佳答案:
#define bit3 (0x1 << 3)
static int a;
void set_bit3(void)
a |= bit3;
void clear_bit3(void)
a &= bit3;
嵌入式筆試題
考查逗號表示式 main 這段程式的輸出是 a c 3 d 3 b c 5 d 3 c c 3 d 5 d c 5 d 5 應該選c。c語言提供一種特殊的 運算子,逗號運算子,優先級別最低,它將兩式聯接起來,如 3 5,6 8 稱為逗號表示式,其求解過程先表示式1,後表示式2,整個表示式值是表示式2...
嵌入式 筆試題
指出下列程式的執行結果 int main memcpy a 3,a,5 for int i 0 i 10 i return 0 解答 0 1 2 0 1 5 6 7 8 9 注意 1 陣列a作為引數時,轉化為普通指標 a 3 按照char長度計算 2 memcpy的原型是 void memcpy v...
嵌入式筆試題(3)
1 設float a 2,b 4,c 3 以下c語言表示式與代數式 a b c計算結果不一致的是 a.a b c 2 b.1 2 a b c c.a b c 1 2 d.c 2 a b 2 為了向二進位制檔案尾部增加資料,開啟檔案的方式應採用 a.ab b.rb c.wb d.wb 參 d r代表r...