C語言筆試題目

 

1. 用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)

#define SECONDS_PER_YEAR   (60 * 60 * 24 * 365)UL
我在這想看到幾件事情:
     1). #define
語法的基本知識(例如:不能以分號結束,括號的使用,等等
     2).
懂得預處理器將爲你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
     3).
意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
     4).
如果你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。
 
2. 寫一個標準MIN,這個宏輸入兩個參數並返回較小的一個。
#define   MIN(A,B)    ((A) <=  (B)   (A) : (B))
這個測試是爲下面的目的而設的:
     1).
標識#define在宏中應用的基本知識。這是很重要的,因爲直到嵌入(inline)操作符變爲標準C的一部分,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,爲了能達到要求的性能,嵌入代碼經常是必須的方法。
     2).
三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,瞭解這個用法是很重要的。
     3).
懂得在宏中小心地把參數用括號括起來
     4).
我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什麼事?
          least = MIN(*p++, b);
 
3. 嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置abit 3,第二個清除a bit 3。在以上兩個操作中,要保持其它位不變。
     #define BIT3    (0x1<<3)
     static int a;
     void set_bit3(void)
     {
            a |= BIT3;
     }
     void clear_bit3(void)
     {
             a &= ~BIT3;
     }


4. 嵌入式系統經常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求設置一絕對地址爲0x67a9的整型變量的值爲0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。
     int *ptr;
    ptr = (int *)0x67a9;
   *ptr = 0xaa55;
 
5. 中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展讓標準C支持中斷。具代表事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一箇中斷服務子程序(ISR),請評論一下這段代碼的。
__interrupt double compute_area  (double  radius)
{
  double area = PI * radius * radius;
   printf(" Area = %f", area);
   return area;
}
     這個函數有太多的錯誤了,以至讓人不知從何說起了:
     1). ISR
不能返回一個值。如果你不懂這個,那麼你不會被僱用的。
     2). ISR
不能傳遞參數。如果你沒有看到這一點,你被僱用的機會等同第一項。
     3).
在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。此外,ISR應該是短而有效率的,在ISR中做浮點運算是不明智的。
     4).
與第三點一脈相承,printf()經常有重入和性能上的問題。
 

軟中斷:
    編程異常通常叫做軟中斷。軟中斷是通訊進程之間用來模擬硬中斷的一種信號通訊方式。 中斷源發中段請求或軟中斷信號後,CPU或接收進程在適當的時機自動進行中斷,處理或完成軟中斷信號對應的功能。UPCC(雜食動物)對軟中斷解釋的很好!硬件中斷就是硬件設備在運行時實現的中斷,與軟中斷是有本質區別的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章