簡單用一句話概括這個過程就是:“一看就會,一做就廢!”這個狀態對我來說很痛苦,而且很容易勸退,但是我要時刻警告自己堅持下來,所有的事情,別人能做的,我也能做,只是我現在不知道或者不熟練而已。要逼迫自己學會苦中作樂,你所遇到的每一次BUG都是增長經驗的寶貴機會。
總結一下我入門以來遇到的困難,困難解決的辦法以及解決後分析自己犯過的錯誤和認知的盲區。
1、面對開發板感覺它在操控我,而不是我在操控它,一個有思想的牽線木偶從崩潰到反擊的過程
我接觸的第一塊兒板子是網上購買的開發板,供自己學習用,基本操作和流程都有網上影片可供參考。這個階段最大的困惑是,我按照老師的步驟只要細心操作基本不會出現問題,但是不能越界。這裡的越界就是按照自己的想法實現一些功能,人的本性就是不管做什麼都想做自己,不想做牽線風箏。更過分的狀態是我可能只能複製貼上,自己按照例程重新敲一邊都會出現error或warning。此刻我感覺板子裡面有某種排斥我的神秘力量,他不是人為可以改變的,我有很長一段時間都將板子束之高閣。
這個過度時間很長,每次我會急躁一段時間然後平復心情以後將問題複製下來到網上尋找答案,剛開始可能連問題都不會問,因為我也不知道問題出在哪裡,後來我想到了學校做實驗學習的控制變數法,簡單來說就是你出現問題後將做過的變化都還原,然後重新改變單一的操作,找到具體哪一步出現了問題,然後再到網上尋找答案。學會問問題後,我發現其實我看上去入門了,但是知識盲區還是很多,這種情況不是細心可以解決的,雖然也能一點一點積累,但是太消耗精力。所以我決定返回去系統學習C語言和基礎的資料結構,廢寢忘食的利用工作之餘的花了半個多月時間,對程式語言和結構有了完整的基礎認知。再加上每天堅持刷一些面試相關的題目,就這樣我面對開發板才感覺是我再操縱他而不是他在操縱我。
2、創造機會在工作中接觸驅動板子的事情
我總是想盡可能的快速完成自己的工作,然後找機會融入做板子的同事們那裡,聽他們探討問題,然後有意無意插一句,以前我的策略是問一些低階的問題,激發他們好為人師的特性,給我講解,但是講解完了就沒下文了,我也沒有太多收穫,只是多了幾個在自己面前趾高氣昂的傢伙。然後我就慢慢改變策略,輕蔑他們進而激怒他們。有一次他們在討論用觸發繼電器用紅外模組還是超聲模組,我上去就用很傲慢的語氣說:“用什麼模組,你討論沒有用,得做一下試驗試試啊!買個現成得模組,都用串列埠收發資料,驗證一下靈敏度和測量範圍哪一個更符合要求唄!切!!”他們開玩笑得說:“你很懂啊,要不你來”我很激動和認真得說:“可以啊!”就這樣我名正言順的接到了第一個嵌入式的活。
這個事情的驅動晶片用的就是我學習過的STM32的晶片,我就更有信心將它搞定了,後來發現有點盲目自信了。做嵌入式開發講究先實現簡單功能然後再逐步豐富,這點我懂,所以我開始用我手上有的庫函式和例程在主函式main中編寫了一個迴圈驅動他們給我的板子上帶有的繼電器,採用的是直接給GPIO口置位和復位(寫1和寫0)的方法,然後再加上延時函式做吸合的迴圈。這些邏輯上和程式上都沒有什麼問題,而且我沒用多長時間就實現了。但是詭異的事情又發生了,當我引入一個變數試圖控制繼電器吸合的頻率的時候,居然不起作用了,我又把程式復原依然不起作用,我反覆弄了半天,繼電器都安然不動。在我能用的辦法都用盡以後我就去請教我得同事了,把這個過程給他描述了一下,他幫我檢查了一下電路板,沒有問題。然後看來一下程式也沒有發現問題。因為起初我的描述誤導了他,他也排查了很多不相關的問題,實在不知找什麼問題的時候,他看了一下我KEIL中裝置的配置,發現我用的晶片型號和配置的型號根本不一樣,他說我的程式根本沒有燒錄進去。後來他給了我相關的例程,我在哪個基礎上操作就不再有問題了。第一次能燒錄進去這個事情很詭異到現在也沒弄明白怎麼回事兒。
從接手到實現當初輕鬆的說的試一試就知道的過程我還遇到很多困難比如說串列埠連結錯誤,硬體連結的是串列埠3,程式寫的是串列埠1;串列埠與晶片沒有共地導致不能正常收發資料;使用的庫函式與晶片型號不一致;資料格式不對導致資料超範圍,有符號整數範圍小於無符號整數;資料結構邏輯錯誤,導致迴圈重複進行。
有些錯誤是粗心造成的低階錯誤,有些是以為懂了其實不懂的認知盲區,總之嵌入式開發可以跟著老師把知識點過一遍並能夠復現以達到入門的階段,但是如果要精通還需要把那些知識點在大腦裡反覆推敲,在手頭上反覆實現,當遇到困難可以分析問題解決問題。知識是學不完的,但是查詢知識,並利用知識解決問題的方法學會後剩下的就是時間和經驗的積累了。