嵌入式軟體 2020 Q3面試題

2021-10-08 23:03:55 字數 1038 閱讀 4895

2.如何涉及減少棧溢位的風險?1.減少遞迴呼叫次數或用非遞迴代替遞迴。2.不使用「超大型」結構體或者陣列做區域性變數,或者使用static變數取代nonstatic變數。3.增加執行緒預設的堆疊空間。

這裡面試官主要想知道的是巨集定義中字串拼接,通過 ## 來做的。#把巨集引數替換為字串,##把2個巨集引數貼上在一起。

1.巨集的替換,是通過在巨集中空格後面字串和前面的出現的字串是否匹配來進行替換。

如某巨集的定義為:#define add(a, b) ((a)+(b)),那麼 add(x,y) 《==》 x + y;因為((a)+(b))中的a和add(a,b)中的a匹配,所以要被替換;

2. #,巨集引數替換為字串,如#define str(s)     #s,那麼str(device) 《==》「device」,因為#s中的s和str(s)的s匹配,s要被替換為device,而且前面加了#號,所以最終被替換為了「device」

3.##,2個巨集引數貼上在起來。 如#define atype(name, type)  type name##_##type##_type,預處理時會將 name##_##type##_type分成4部分:name|##_ |##type|##_type; 這樣在巨集的使用時就能清楚會替換哪些字元了;那麼 atype(a, int)

《==》type| name|##_|##type|##_type|

《==》int|   a|_|int|_type|

可重入(reentrant)函式可以由多於乙個任務併發使用,而不必擔心資料錯誤。

不可重入(non-reentrant)函式不能由超過乙個任務所共享,除非能確保函式的互斥(或者使用訊號量,或者在**的關鍵部分禁用中斷)

注意事項:

可重入函式要麼使用本地變數,要麼在使用全域性變數時保護自己的資料。

不為連續的呼叫持有靜態資料。 

不返回指向靜態資料的指標;所有資料都由函式的呼叫者提供。 

使用本地資料,或者通過製作全域性資料的本地拷貝來保護全域性資料。 

如果必須訪問全域性變數,記住利用互斥訊號量來保護全域性變數。 

絕不呼叫任何不可重入函式。 

嵌入式軟體面試題一

1 請寫出你所知道的c 語言關鍵字。auto 宣告自動變數 switch 用於開關語句 case 開關語句分支 break 跳出當前迴圈 default 開關語句中的 其它 分支 goto 無條件跳轉語句 do 迴圈語句的迴圈體 while 迴圈語句的迴圈條件 if 條件語句 else 條件語句否定...

嵌入式軟體經典面試題

用預處理命令 define宣告乙個常數,用以表明一年中有多少秒 忽略閏年問題 define year 60 60 24 365 ul考點 1 define語法的基礎知識 2 懂得預處理器將為你計算常數表示式的值,因此,直接寫出你是何年機斷一年中有多少秒而不是計算出實際的值,是更清晰沒有代價的。3 意...

嵌入式面試題

15 typedef 在c語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子 define dps struct s typedef struct s tps 以上兩種情況的意圖都是要定義dps 和 tps 作為乙個指向結構s指標。哪種方法更好呢?...