約定:資料型別 int 四個位元組(32位系統,認為整型是4個位元組),char 乙個位元組
1.計算結果
char str = "hello"; sizeof(str) = 6;
char *p = str sizeof(p) = 4;
void *pbuf = malloc(100); sizeof(pbuf) = 4;
void func(char string[100])
2.typedef structtest_struct;
test_struct g_test_arry[5];
請問以下語句的值為多少?
sizeof(test_struct) = 12;
sizeof(g_test_array) = 60;
3.下面的程式能夠編譯通過?如果不能通過,應該如何修改才能編譯通過?
如果可以編過,輸出結果是?
int sim2_is_active = 0;
int sim1_is_active ;
int sim3_is_active;
int mmi_is_sim2_active(void)
int main()
if(sim3_is_active)
//mmi_is_sim2_active 函式位址,位址不為0,所以if判斷為真
if(mmi_is_sim2_active)
return 0;
}
答案:可以編譯通過,結果為
sim2 active!
4.#ifdef 和 #if 的區別
#if (5*3)
#define __mmi_show_wall*****_in_submenu
#endif
#define cfg_mmi_bug_fix 0
int main()
輸出結果為:
1 3 4 5
5.程式實現:已知從1-100範圍內選出99個整數,沒有順序的存放在全域性陣列中,
請程式設計找出缺少的那個整數。
//假定99個陣列存放在arra陣列中
int searchdata(int array[99])
return 5050 - sum;
}
思路:將1-100總和算出,再減去99個選取的數
6.嵌入式系統總是要使用者對變數或者暫存器進行位操作,給定乙個整型變數a,寫兩段**,
第乙個設定a的bit 3,第二個清楚a的bit 3,在以上的兩個操作中,要保持其他位不變,另外
**要對16bit和32bit通用。
#define bit3 (0x1<<3)
static int a;
void set_bit3(void)
void clear_bit3(void)
7.下面的函式有問題嗎?volatile關鍵字在什麼情況下使用?
int square(volatile int *ptr)
有問題,這段**的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向乙個volatile型引數,由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不是你所期望的平方值!
正確的**如下:
long square(volatile int *ptr)
乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,
優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在
暫存器裡的備份。下面是volatile變數的幾個例子:
1). 並行裝置的硬體暫存器(如:狀態暫存器)
2). 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)
3). 多執行緒應用中被幾個任務共享的變數
8.linux 中mutex_lock函式作用是什麼?spin_lock 函式作用是什麼?兩者的區別是什麼?
mutex_lock:從 實現原理上來講,mutex屬於sleep-waiting型別的鎖,mutex_lock是用來保護資源.比如某乙個變數,多個函式
都會對該變數進行操作,為了保證在同一時間,只能有同乙個函式對該變數的操作,需要對該變數進行加鎖和解鎖操作,用來防止不
可預知的錯誤.而自旋鎖spin lock是busy-waiting。就是說當沒有可用的鎖時,就一直忙等待並不停的進行鎖請求,直到得
到這個鎖為止。這個過程中cpu始終處於忙狀態,不能做別的任務。
區別:(1)mutex適合對鎖操作非常頻繁的場景,並且具有更好的適應性。儘管相比spin lock它會花費更多的開銷(主要是上下文切換)
,但是它能適合實際開發中複雜的應用場景,在保證一定效能的前提下提供更大的靈活度。
(2)spin lock的lock/unlock效能更好(花費更少的cpu指令),但是它只適應用於臨界區執行時間很短的場景。而在實際軟體開發
中,除非程式設計師對自己的程式的鎖操作行為非常的了解,否則使用spin lock不是乙個
好主意(通常乙個多執行緒程式中對鎖的操作有數以萬次,如果失敗的鎖操作(contended lock requests)過多的話就會浪費很多的時
間進行空等待)。
9.linux 驅動中有platform,bus,device,driver 四個概念,例如經常使用的函式介面,platform_driver_register,bus_add_driver
和bus_add_device等,如何理解platform,bus,device,driver四個概念?他們分別的作用是什麼?他們之間有什麼關係?
在linux2.6核心引入了bus_type、device_driver、device分別描述匯流排,驅動和裝置,這就是所謂的「匯流排裝置驅動模型」。匯流排是
三者聯絡起來的基礎,通過一種匯流排型別,將裝置和驅動聯絡起來。匯流排型別中的match函式用來匹配裝置和驅動,當match操作完成之
後就會呼叫device_driver中的probe函式。典型的bus type有usb \ pci \ i2c \ spi等。platform匯流排是2.6 kernel中最近引入的一種
虛擬匯流排,主要用來管理cpu的片上資源,具有更好的移植性,因此在2.6 kernel中,很多驅動都用platform改寫了。在資料結構設計上,
匯流排、裝置及驅動三者相互關聯。platform device包含device,根據device可以獲得相應的bus及driver。裝置新增到匯流排上後形成乙個
雙向迴圈鍊錶,根據匯流排可以獲得其上掛接的所有device,進而獲得了 platform device。根據device也可以獲得驅動該匯流排上所有裝置
的相關driver。platform driver包含driver,根據driver可以獲得相應的bus,進而獲得bus上所有的device,進一步獲得platform device
,根據name對driver與platform device進行匹配,匹配成功後將device與相應的driver關聯起來,即實現了platform device和platform
driver的關聯。匹配成功後呼叫driver的probe進而呼叫platform driver的probe,在probe裡實現驅動特定的功能。
bd測試開發筆試題
1.如果有個字串mary存在其字母轉換位置後的另乙個單詞存在,例如army,就說其存在兄弟單詞,設計資料結構與演算法,在單詞詞典中找到某單詞的所有兄弟單詞。2.c c 動態分配記憶體的方式,區別是什麼?3.程序與執行緒的區別與聯絡,什麼是 執行緒安全 4.網路爬蟲演算法,鍊錶的建立規則,比較兩個鍊錶...
百度移動開發筆試題
它是在cisc 指令系統 基礎上發展起來的。各種指令的使用頻度相當懸殊,最常使用的是一些比較簡單的指令,它們僅佔指令總數的20 但在程式中出現的頻度卻佔80 複雜的指令系統必然增加 微處理器 的複雜性,使處理器的研製時間長,成本高。並且複雜指令需要複雜的操作,必然會降低計算機的速度。risc的 指令...
天地遊公司遊戲開發筆試題
不能宣告為虛函式的函式是 不能做switch 的引數型別是 氣泡排序演算法的時間複雜度是 導致堆疊溢位的原因是 平衡二叉樹是指 float x 與 零值 比較的if語句是 static的用途是 請至少說明兩種 internet採用的網路協議是 該協議的主要層次結構是 全域性變數和區域性變數在記憶體中...