日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 華清遠見武漢中心
[導讀]高端IT就業(yè)培訓專家-15年口碑積累,20萬名研發(fā)工程師從這里走出 ????????很多時候,我們因為關注最終的結果,而總是忽略其它的情況。所以我們寫的代碼并不是那么的健壯。這篇文章屬于程序員內功修煉,值得一看。寫代碼的時候,有幾個階段可以參考一下(魚鷹經(jīng)


高端IT就業(yè)培訓專家-15年口碑積累,20萬名研發(fā)工程師從這里走出



        很多時候,我們因為關注最終的結果,而總是忽略其它的情況。所以我們寫的代碼并不是那么的健壯。這篇文章屬于程序員內功修煉,值得一看。寫代碼的時候,有幾個階段可以參考一下(魚鷹經(jīng)歷并總結):



 階段一 

只要最終的結果


        處于這個階段的一般都是初學者,眼里只有一個目標,那就是程序運行成功,從不考慮其他因素。比如一個簡單的 SPI 驅動程序,最終的目標只要一個,通信成功。所以當需要延時時就會采用死等方式等待結果,而不會考慮其他可能出現(xiàn)的結果,比如因為某種原因導致引腳電平被持續(xù)一個電平不變,導致死循環(huán);比如因為你的延時,導致其他人功能無法及時處理。這個時候的思考總是過于理想化,不是因為自己太理想,太樂觀,而是因為沒有足夠的經(jīng)歷告訴你,這樣寫是有問題的。因為沒有經(jīng)歷過,所以初學者也就考慮不了那么多,所以你看初學者的代碼會很簡單,是一條直線,邏輯很清晰,沒有岔路。



 階段二 

做一些常見的異常處理


        隨著經(jīng)歷越多(不管是網(wǎng)上看到的還是自己經(jīng)歷的),漸漸地,自己的代碼變得多了一些,功能還是那個功能,只是這時候的你考慮的更多,更全面,你漸漸的增加了各種異常處理。比如你不再使用死等方式延時,而是增加了一個等待時間的超時處理;又比如你寫的程序不再只有if里面的內容(條件為真),還有else(條件為假)。這個時候的你眼里不再只有最終的結果,還有在運行過程中可能出現(xiàn)的其他情況,并且會對這些情況做處理。



 階段三 

懷疑一切


        這個階段的你不再相信任何東西了,即使它是那么的可靠。你總是在函數(shù)開始處檢查傳入的參數(shù)(如果有的話),判斷指針是否為空,判斷數(shù)據(jù)是否在需要的范圍內,等等。總是在使用指針、數(shù)組的時候小心翼翼,深怕一不小心就越界了,而這種BUG只有經(jīng)歷的人才懂到底有多難查。總是在異常的地方做出一些動作,如返回錯誤代號、如打印錯誤消息等。不管怎樣,在出現(xiàn)問題后,你總是能夠快速的定位問題,而這,得益于你對異常的處理。



 階段四 

做好善后工作


        階段三可能讓你很快的定位問題,但是一旦出現(xiàn)問題,程序還是無法正常執(zhí)行下去,比如申請的資源(內存、信號量等)沒釋放,又比如關閉的中斷在異常后未重新打開等等。所以異常處理代碼除了能很快定位BUG外,還要做好善后處理,這樣才能讓程序健壯的一直運行下去。

        魚鷹曾在《代碼寫完了,你要花多少時間測試?》一文中介紹了一些調試方法,今天,繼續(xù)更深入的探討。


(uCOS II代碼片段)
          很多人其實不明白,為什么一定要在函數(shù)開頭檢查參數(shù),這不是很浪費時間的嗎(從上面可以看到,參數(shù)檢查有時候比真正需要執(zhí)行的代碼還要多)? 不說指針,就說一些普通變量,為什么要檢查? 檢查的意義又在哪里?

 浪費時間?
        首先說說浪費時間的問題,確實,因為總是在開頭檢查參數(shù),會浪費CPU的時間(魚鷹一開始也非常不喜歡),但是當你經(jīng)歷了各種難查的BUG之后,你會發(fā)現(xiàn),這點時間還是浪費的起。 而事實上,軟件開發(fā)一般都會有兩個版本,一個是Debug版本,一個是Release版本,只要通過宏進行控制,那么就可以在穩(wěn)定之后,不再檢查這些參數(shù)了。 但是有些重要的數(shù)據(jù),即使穩(wěn)定了,也不能放棄對它的檢查,否則一旦出現(xiàn)問題,就是災難。 所以在檢查時,還要考慮這些檢查是否在Release版本也是需要的,即按重要性分開檢查。

 為什么要檢查?檢查的意義又在哪里?
        這些檢查就像是 函數(shù)的護城河 ,保證即使參數(shù)錯誤,也不會導致異常問題,比如數(shù)組越界,計算出錯等。 那么我們要問了,參數(shù)怎么會錯誤,代碼都是固定死的,有經(jīng)驗的都知道,參數(shù)是保存在 ?;蚣拇嫫?/span> 的,怎么會錯呢? 你說內存數(shù)據(jù)保存時有問題? 保存時為1,讀出時為0? 別逗了,如果真是這樣,那還怎么玩? 程序根本沒辦法跑好吧(遇到強干擾可能會出現(xiàn)這種情況,甚至可能CPU執(zhí)行流程都是亂的,最終只能重啟,這個魚鷹倒還沒遇到過)。 我們可以認為存在RAM和FLASH的數(shù)據(jù)在存儲和讀取方面沒有問題,那么又是什么導致了參數(shù)出錯呢?

 棧溢出 
        前面說過,參數(shù)有可能保存在棧里面,如果有些棧溢出了,參數(shù)被破壞也就可以理解了。(關于棧,可參考筆記《 今天,你的棧溢出了嗎? 》)

 數(shù)組越界、野指針等指針問題 
        一旦越界,那么產(chǎn)生的破壞力不可想象。 所謂越界,就是修改了不屬于你的變量。 比如一個數(shù)組,你操作了數(shù)組外的數(shù)據(jù)(不管是數(shù)組前面的還是數(shù)組后面的)。 而越界根據(jù)位置又可以分為三種情況。


第一種, 棧(stack) ,比如你在棧里面申請了一個數(shù)組,越界了,那么修改的就是棧內容。
第二種: 堆(Heap) 。你通過malloc申請的內存,如果操作失誤,那么就會修改不屬于你的空間。
第三種。 全局變量(data) 。如果操作失誤,也會出現(xiàn)問題。

        其實, 越界這種問題不一定就只會修改這些單獨的區(qū)域,可能是兩個區(qū)、三個區(qū)一起修改了 ,畢竟指針可不管修改的地址到底屬于哪個區(qū),還有一種是 野指針 導致的異常操作,那么它修改的位置只有鬼知道了(鬼好像不懂程序)。 比如你申請了一個數(shù)組,通過傳入的參數(shù)修改數(shù)據(jù),如果不限制參數(shù)大小,你確定它不會把你數(shù)組后所有的內存都給清零?


        如果硬要為上面三種情況劃分處理難度等級,那么最容易也最快解決的就是全局變量的修改,為什么?因為地址比較固定,而ARM內核有神器處理這種情況,如果出現(xiàn)概率高的話,一查一個準,所以魚鷹都不怎么苦惱這種問題。
        最難解決的是堆的修改,這種問題比棧更難找。原因就在于, 內存動態(tài)申請和釋放 ,可能這次修改的是這個位置,沒出現(xiàn)問題,下次修改另一個地址,就出現(xiàn)了問題,這種是最難查的。而棧的空間一般不會太大,而且他的存取都是有規(guī)律的,要稍微好查一些。
        可能你會問,參數(shù)會保存在寄存器里面,那么寄存器的數(shù)據(jù)有可能被異常修改嗎? 異常修改的可能性很小,因為對于C語言而言,寄存器是透明的,用戶很難操作這個。 但是,雖然說參數(shù)傳入之后被修改的可能性很小,但是傳入前修改的可能性還是很大的,比如你傳入的參數(shù)是一個全局變量,那么這個全局變量是可能被異常修改的??! 所以,參數(shù)檢查,是一個健壯程序必須要有的,這是防止產(chǎn)生重大問題最重要的護城河。 而越早檢查出問題,那么越容易定位問
        蝴蝶效應大家都知道,千里之堤毀于蟻穴大家也知道,用在程序里面也是很合適的。 可能你會說,我對自己有信心,我的技術杠杠的,絕對不會出問題。 真的是這樣嗎?


 01 
時間久了自己都忘了

        工作時,常常完成了一個項目,下一個項目馬上來了,如果老項目需要維護,不需要一兩年,只要一兩個月,如果你沒有參數(shù)檢查、異常處理的好習慣,一旦你修改了代碼,那么很可能因為某些疏忽,導致難以發(fā)現(xiàn)的BUG,而解決這些BUG的時間,比你寫這些異常處理代碼更多。 但是在你剛開始寫這份代碼的時候,因為思路清晰,考慮的比較多,有哪些異常很清楚,那么很容易寫出那些異常處理代碼。 比如魚鷹去年寫了一份通過位綁定地址,批量配置引腳的時鐘、寄存器信息的代碼,那么今年再復用代碼的時候,因為自己的疏忽,很可能需要大量的時間解決BUG,那我寫這份代碼的意義就不存在了(寫這份代碼就是為了在標準庫中通過端口和引腳號快速配置引腳),而如果說,一旦因為疏忽導致的問題,程序會自動幫你檢查,那么解決問題就很快了。


 02 
維護

        不管是別人維護,還是自己維護,當項目需要更改需求時,如果因為某些疏忽,導致了BUG,那么解決起來費時費力,而且即使你這次解決了,難道下次還要重蹈覆轍嗎?


 03 
合作開發(fā)

        一個項目可能不是一個人完成的,而是多人合作。而每個人的水平有高有低, 你敢說別人不會寫出有問題的代碼?你敢說自己一定不會寫出有問題的代碼? 而且即使別人沒有寫出BUG,但因為某些原因,需要修改或屏蔽你的代碼,如果你的代碼能自動提醒出這些異常,那么定位問題也就不難了。 而魚鷹為什么寫代碼的時間會比測試長,除了掌握大量的調試技巧外,就是因為在寫的時候,會考慮很多,并且這些考慮,大部分會以代碼的形式存在,少量的會以注釋或者#warning、#error 形式存在,而其中,最好的方式是代碼形式,因為它能保證程序正常運行,即使不能正常運行,也應該打印消息以提醒用戶問題在何處。 所以,魚鷹總是很慶幸自己當初花了不少時間去寫異常處理代碼,而這些代碼,如果需要事后彌補的話,相信花的時間會更多(定位問題、回想當初自己如何思考、補充異常處理代碼,這些都要時間)。


END

免責聲明:整理文章為傳播相關技術,版權歸原作者所有

如有侵權,請聯(lián)系刪除




  專業(yè)始于專注  

  卓識始于遠見  




# 往期干貨 #

點擊下方圖片即刻前往





   瞅一瞅看一看 ↘ 

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉