最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

如何寫出好的代碼(二) - 編程技巧

2021-09-16 22:27 作者:奧大梨呀  | 我要投稿

????????前幾回說到"怎么寫好代碼之編程規(guī)范",其實應(yīng)該叫"怎么寫出好看的代碼",這是極為關(guān)鍵的,一段工整的代碼肯定是能讓讀代碼的人產(chǎn)生想讀下去、想去了解這段代碼的欲望。就好比第一眼看到一個美女,一般都會令人產(chǎn)生想要和她交個朋友的想法吧。我相信應(yīng)該沒有誰會在只有第一印象的情況下,想去和一位邋遢的人交朋友吧。

????????不過編程規(guī)范也只是其一,一段好的代碼還需要看內(nèi)涵,代碼是否做到高效、簡潔、盡可能減小bug出現(xiàn)的可能性等等,這就是所謂的看內(nèi)在,就像看人一樣,光長得好看還不夠,還需要看性格、優(yōu)點、特長等。由于我主要是做嵌入式C開發(fā),在嵌入式和C語言這方面有些許經(jīng)驗,那么就從這兩個方面來分享一些我的經(jīng)驗吧。

首先是C語言

·盡可能避免使用全局變量

????????全局變量用起來很方便,但增大了程序模塊之間的耦合性,對于后續(xù)的程序維護和移植非常不方便。如果必須使用全局變量,最好使用static將其作用域限制在單個文件中,對外則提供接口進行獲取。

·if-else與switch-case的選擇

????????當程序中使用到多個if-else結(jié)構(gòu)時,若使用switch-case更簡潔,則盡可能地轉(zhuǎn)換為switch-case結(jié)構(gòu),比如針對單個變量的不同值進行不同的操作。當然有些情況下使用switch-case較為復(fù)雜,反而if-else更方便,需要視情況而定。

·成對操作申請與釋放資源

????????當使用到資源申請時,可以先在結(jié)尾寫上釋放的操作再完成中間的內(nèi)容,比如內(nèi)存的申請,如果忘記釋放則會導(dǎo)致內(nèi)存泄露。

·反復(fù)檢查數(shù)組越界情況

????????C語言是不安全的,程序員稍微一不注意就容易出現(xiàn)內(nèi)存的非法訪問,典型的就是數(shù)組越界訪問,可能導(dǎo)致程序跑飛。

·善用面向?qū)ο蟮木幊趟枷?/strong>

????????C語言盡管是面向過程的編程語言,但稍加封裝一下即可具備簡單的面向?qū)ο蠊δ?。實現(xiàn)面向?qū)ο笞钪饕牟糠质墙Y(jié)構(gòu)體和函數(shù)指針,當一個文件使用到很多相關(guān)聯(lián)的變量時,盡可能使用結(jié)構(gòu)體進行封裝。在函數(shù)參數(shù)傳遞時使用結(jié)構(gòu)體指針傳遞,能減小函數(shù)形參的傳遞數(shù)量。

·項目較復(fù)雜時盡可能采用多線程

????????當一個項目比較復(fù)雜時,使用單線程方式可能會導(dǎo)致系統(tǒng)響應(yīng)緩慢。這時可以采用多線程編程,各個線程分配任務(wù)和優(yōu)先級,使用操作系統(tǒng)提供的線程通信和同步機制對各個線程進行合理地調(diào)度。

?

其次是嵌入式編程

????對于嵌入式編程,我將分享我個人的一些底層驅(qū)動代碼的寫法和一些基于RTOS的開發(fā)經(jīng)驗。

·按鍵驅(qū)動

為了程序的通用性,按鍵的驅(qū)動代碼一般分為3部分:

?????????????????????①芯片的IO輸入配置

?????????????????????②按鍵動作的處理判斷代碼(消抖、長短按判斷等)

???????????????????? ③按鍵的應(yīng)用代碼(按下后做什么)

其中:

是與芯片相關(guān),除非可以整合全部芯片的IO驅(qū)動代碼,否則基本上是需要改動的。?

是按鍵處理通用的代碼,這部分是可以只寫一次的,因為與硬件完全無關(guān)。為了提高CPU的利用率,一般按鍵的響應(yīng)采用IO口的中斷,而消抖則采用定時器進行消抖。

應(yīng)用代碼則是需要根據(jù)需求而定,根據(jù)面向?qū)ο蟮木幊趟枷?,這里可以選擇使用函數(shù)指針,對外提供一個函數(shù)接口用于注冊按鍵的應(yīng)用代碼。這樣一個通用的按鍵驅(qū)動就完成了,移植的時候僅需要移植底層的芯片IO驅(qū)動即可。

·總線式芯片驅(qū)動

????????對于一些I2C和SPI等使用總線進行通訊的設(shè)備,且總線下可以掛載多個設(shè)備。此時驅(qū)動通常分為3部分:

????????????????①芯片的總線驅(qū)動,如SPI驅(qū)動。

????????????????②設(shè)備器件的驅(qū)動。

????????????????③設(shè)備驅(qū)動提供給上層的接口。

其中:

是與芯片相關(guān),在更換芯片時需要移植的。通常單獨編寫一個模塊,即一個獨立的.c文件和.h文件,提供給設(shè)備器件總線數(shù)據(jù)讀寫等接口函數(shù)。

則是設(shè)備器件的驅(qū)動,使用提供的總線數(shù)據(jù)讀寫函數(shù)對器件進行操作,如果可以的話,使用上函數(shù)指針進行讀寫函數(shù)注冊是最佳的。同樣通常只需要寫一次即可,作為一個獨立的模塊,這樣移植時直接復(fù)制,不需要修改任何邏輯。

則是提供器件功能的接口函數(shù)到應(yīng)用層,比如一個MPU6050姿態(tài)傳感器就是提供給應(yīng)用層獲取當前的角度、角速度的函數(shù)。

·使用信號量(semphore)或者進行任務(wù)同步

????????在使用RTOS進行開發(fā)時,任務(wù)之間的操作可以使用信號量進行同步,比如某一個任務(wù)需要等待有按鍵按下才需要執(zhí)行,此時可以使用信號量使該任務(wù)阻塞(進入休眠態(tài)),直到有按鍵按下后,在按鍵的應(yīng)用代碼中向該任務(wù)發(fā)送一個信號量來使該任務(wù)進入就緒態(tài)開始執(zhí)行。這樣可以極大的使任務(wù)切換頻率降低。

·使用互斥體(mutex)或信號量(semphore)對設(shè)備互斥訪問

????????當一個總線下掛載多個設(shè)備時,同一時刻只能允許一個設(shè)備訪問總線,這時可以使用互斥體或者信號量(值為1)對總線進行保護,在設(shè)備使用總線前先嘗試獲取互斥體或者信號量,如果獲取不到則表示當前總線被占用,任務(wù)阻塞(進入休眠態(tài)),直到使用總線的設(shè)備釋放信號量后,才會喚醒被阻塞的任務(wù)開始使用總線。

·任務(wù)間通信采用消息機制而非全局變量

????????任務(wù)間的通信盡管采用全局變量會更方便,但同時也帶來了隱患,因為全局變量多個任務(wù)都可以訪問,在沒有資源保護的情況下,容易造成競爭發(fā)生數(shù)據(jù)錯誤。采用消息機制則是在任務(wù)之間進行數(shù)據(jù)的發(fā)送,操作系統(tǒng)會自動同步,確保這個任務(wù)寫入完畢,另一個任務(wù)開始讀取,不會造成競爭的關(guān)系,而且采用消息機制,任務(wù)之間的耦合性也降低了。

·中斷服務(wù)程序快進快出

????????中斷服務(wù)程序的優(yōu)先級往往是最高的,如果占用太多時間會導(dǎo)致其他任務(wù)被阻塞無法及時得到執(zhí)行。因此中斷服務(wù)函數(shù)中只處理一些設(shè)置和清除標志位的操作就立刻退出。剩下的操作則是作為線程(任務(wù))與其他線程(任務(wù))一起參與系統(tǒng)的調(diào)度,這里同樣可以使用信號量做一個同步,當中斷退出時,發(fā)送一個信號量到處理中斷的任務(wù),使任務(wù)轉(zhuǎn)入就緒態(tài)開始執(zhí)行。

?

????????由于時間和篇幅的關(guān)系,暫時寫這么多吧??偟膩碚f,一段好代碼就像一個絕世傾城的美女一般,首先看外表,其次看內(nèi)在,二者缺一不可。


如何寫出好的代碼(二) - 編程技巧的評論 (共 條)

分享到微博請遵守國家法律
腾冲县| 天峨县| 蒙城县| 洛阳市| 井研县| 永吉县| 揭西县| 集贤县| 三台县| 新沂市| 永昌县| 敖汉旗| 洛隆县| 祁门县| 寿光市| 靖江市| 格尔木市| 阳春市| 巩义市| 广宗县| 乌审旗| 敦化市| 象山县| 永仁县| 乐清市| 郎溪县| 琼结县| 青田县| 稻城县| 襄汾县| 青河县| 泗阳县| 巢湖市| 龙州县| 璧山县| 藁城市| 札达县| 通辽市| 循化| 上饶市| 普陀区|