首先說個大概的,嵌入式軟體需要掌握什麼東西?
對微控制器的熟悉程度(包括中斷系統、各種外設模組、時鐘系統等)
對通訊協議的熟悉程度(常見的有spi、uart、i2c等)
掌握基本的資料結構(如佇列、棧、鍊錶)
掌握基本的演算法(多種排序演算法,資料結構中需要的一些演算法)
其實嵌入式的東西很龐雜,不是一下子就能說清的,只能想到哪寫到哪了。
通訊協議的話,主要不是上層的通訊協議,而是物理層面的通訊協議,比如串列埠通訊需要掌握一幀格式(起始位、資料域、奇偶校驗位、停止位等);spi通訊的四種模式,你又是如何確定使用哪種模式的?i2c通訊格式(起始訊號、結束訊號、應答訊號等)?如果說你學過usb,可能會問你usb採用什麼編碼、有幾種端點模式、簡單介紹列舉過程(但也別太簡單)?更高階的可能問你關於網路這塊的知識(具體魚鷹也不知道,因為還沒系統學過,這裡推薦《tcp/ip詳解》)
資料結構,比如最常接觸的棧、佇列、鍊錶(單向、多向鍊錶)的原理,而資料結構肯定會涉及到一些演算法操作,比如出棧、入棧;出隊、入隊;插入、刪除等操作,而比較純粹的演算法是排序演算法,其中有冒泡演算法、快速排序演算法等(這裡推薦《大話資料結構》),注意這些知識常以筆試形式出現,所以一定要能寫出來(關於筆試推薦《劍指offer》)。
魚鷹最弱的應該是筆試了,或者說演算法。在嵌入式軟體開發過程中,用到的演算法其實並不多,但是要你自己用筆寫出來還是有很大的難度的,魚鷹這方面的能力確實欠缺,因為我一般喜歡深入理解思考後就把細節記錄下來,然後選擇遺忘的(遺忘不是說全部不記得了,而是說只記得大概,細節記不住而已),所以說面試前不來個系統的刷題,臨時抱佛腳一下,基本筆試是沒戲的。
但是筆試成績我覺得只是乙個方面,一般來說筆試之後會有面試(社招一般筆試、面試緊鄰的,校招的話如果你的筆試成績不合格,那麼連面試資格都沒有),所以如果筆試成績不理想的話,一定要好好準備面試(這裡插一句,面試前,一定一定要上網查詢公司的背景資訊,起碼要知道公司是做什麼產品的,魚鷹就在這裡吃了乙個虧,之前對這個不重視,有的公司查過,有的公司沒查過,剛好沒查過的公司突然就問到這個問題,很尷尬,因為這體現了你對這次面試的尊重,而不是在浪費面試官的時間)。面試的話,就隨你發揮了,只要你對自己的技術有信心,那麼面試應該不會太難,一般來說,面試官問的都是簡歷上的東西,所以簡歷的內容不要造假,否則回答不出來就麻煩了。
現在就來具體聊聊幾個一般人不知道的知識:
你是怎麼接收、傳送串列埠資料的?
這個問題其實比較寬泛,一般經驗少的會說使用查詢方式,但是查詢方式效率是非常低下的,所以如果你只能回答這個,100分的題你只能得個30分。如果你說用中斷方式,那麼請問你具體是如何處理的?如果你回答說乙個位元組接收完之後再接收下乙個位元組,那麼可以得個50分。
緊接著又問你,你是怎麼接收一幀資料的(這個其實不應該由面試官問,而是由你自己補充全面),如果你說採用幀頭、幀尾判斷的方式接收的,那麼這道題還是給你50分,但是你說用空閒中斷,那麼70分以上,如果你說用dma+空閒中斷的方式接收的,那麼90分以上(這是我認為最好的方式了,可能會有其他更好的方式也說不定)。
那麼現在說說空閒中斷,為什麼你說了空閒中斷之後,一下子從不及格到及格了?
空閒中斷,顧名思義,就是串列埠空閒後產生的中斷。我們都知道,資料一般是按照資料幀來傳送的,即乙個資料幀乙個資料幀的傳送,如果兩幀傳送之間能間隔一段時間,那麼在接收端就可以產生空閒中斷(關於這個空閒中斷,以後可能會專門寫一篇筆記介紹),有了空閒中斷有什麼好處?
可以接收不定長資料(這是最明顯的好處)
不需要複雜的幀格式(比如幀頭、幀尾可以不要)
乙個資料幀接收錯誤,不會影響到下一幀資料的接收
有了空閒中斷,可謂好處多多(有的微控制器沒有空閒中斷,那就沒辦法,當然也可以捨棄乙個定時器資源來獲得空閒中斷的效果),所以當初了解到這個之後,就一直使用這種方式接收了。
但是空閒中斷雖好,如果你每接收乙個位元組都要cpu干預,還是效率太低,那麼這時候就得配合dma了。
怎麼配合?比如說你乙個資料幀的最大長度是10個位元組,設定串列埠接收快取區為20個位元組,那麼你可以設定dma傳輸長度為20,這樣dma每從串列埠傳輸乙個位元組,傳輸長度就會自減,當產生空閒中斷時,只要你知道開始設定的傳輸長度和剩餘的傳輸長度,那麼就可以得到你已經接收的資料長度,之後你再重新設定新的接收長度即可進行下一次資料幀的接收。
如此一來,接收乙個資料幀只要cpu干預一次就夠了,就是在接收完資料幀的時候由空閒中斷通知cpu進行後續處理即可(注意不是dma中斷),極大的減少了cpu工作時間。
有的時候,資料量很大,cpu來不及處理,那麼你可以通過以下方式解決:
增加訊息佇列(非常好的解決方式)
增加兩幀之間的傳送時間(對於實時性要求很高的可能不合適)
前面兩種方式疊加
lcd顯示屏上的按鍵有多種觸發方式,比如觸控、實體按鍵,以後還可能增加其他方式,你會怎麼設計結構,讓其相容適應不同的環境?
如果是你,你會怎麼考慮?
魚鷹當初的答案是:軟體層次上設計三層。
第二層:中間層,負責對接底層驅動和上層應用
第三層:上層呼叫介面
這個答案我不知道到底好不好,但就以我現有的知識介紹吧。
一般開發人員的軟體設計只有第一層和第三層(即應用層直接訪問底層函式),很少有第二層,事實上設計第二層很有必要,為什麼這麼說呢,就像題目所說的,一旦你將觸控換成了按鍵,那麼所有用到這個按鍵程式的地方,你都得進行修改,雖然不是很難,但是也麻煩,並且增加了出錯的可能性,但是有了中間層就不一樣了,你只要修改這個中間層的**就可以了,你的應用層根本不需要修改。所以中間層的設計很關鍵,要盡可能的把關鍵資訊抽象化,這樣才不會導致明明已經設計了中間層,還是免不了大面積修改,那麼就得不償失了(這裡的中間層可以使用函式指標或者使用乙個函式封裝乙個底層函式,而你的函式(指標)原型就得好好考慮清楚了)。
fifo佇列中,有乙個後面接收的資料,但是想讓它更快處理,應該怎麼辦?
fifo佇列的特點就是先進先出,為什麼這個問題反著來?既然你都是順序處理了,為啥你還要插隊?但是實際上確實可能出現插隊的情況,那該怎麼辦?這個問題如果是以前的自己可能回答不出來,但是當魚鷹把ucos ii 原始碼看了個遍之後,就知道該怎麼做了。
ucos ii的訊息佇列的原始碼中,有個函式的選項,就可以選擇你插入佇列的資料放在隊頭還是隊尾。按照佇列的特點,肯定是要插入到隊尾的,但是題目要求更快處理,那麼插入到隊頭是最好的方式,所以這個問題的答案是,將資料插入到隊頭,這樣既可保持佇列的特性,又能處理一些緊急的訊息,一舉兩得。
從這裡也可以知道,閱讀原始碼雖然看似費時費力,但是對你的思想、思維是有很大拓展意義的,與其停留在表明不明所以,遇到作業系統問題到處問人,不如靜下心來好好看看原始碼,對你的技術水平是會有很大的提高的。
學習除錯實時嵌入式軟體
原文 learn to debug real time embedded software嵌入式軟體開發人員面臨的最大的挑戰就是除錯軟體。嵌入式系統現在變得非常複雜,上面執行著實時作業系統 連線棧 usb,以及在涉及到應用軟體之前的各種系統安全 然而我碰到的許多任務程師仍然使用斷點來除錯軟體,而沒有...
嵌入式串列埠軟體程式設計預備知識
eia電平 rs232就採用這種電平,1 的邏輯電平在 3v 15v之間 0 的邏輯電平在 3v 15v之間。eia代指 電子工業協會 ttl電平 5v等價於邏輯 1 0v等價於邏輯 0 這被稱做ttl 電晶體 電晶體邏輯電平 這是計算機處理器控制的裝置內部各部分之間通訊的標準技術。串列埠通訊是指外...
嵌入式軟體測試
嵌入式軟體測試 嵌入式軟體測試 嵌入式測試或叫交叉測試 cross test 的日的與非嵌入式軟體是相同的。但是,在嵌入式系統設計中,軟體正越來越多地取代硬體,以降低系統的成本,獲得更大的靈活性,這就需要使用更好的測試方法和工具進行嵌入式和實時軟體的測試。通常嵌入式系統對可靠性的要求比較高。嵌入式系...