上海傳音控股驅動開發筆試題

2021-07-23 17:25:37 字數 3666 閱讀 9300

約定:資料型別  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採用的網路協議是 該協議的主要層次結構是 全域性變數和區域性變數在記憶體中...