微控制器嵌入式程式設計的五個注意事項

2021-07-22 07:55:23 字數 2120 閱讀 3661

在微控制器程式設計的過程中,如果一名設計者能夠同時掌握多門程式語言,那麼這名設計者肯定是一位非常優秀的人才。但是想要同時精通彙編、c語言、c++這三門語言實在是太難了,很多初學者在其中一門的學習中就已經到處碰壁,苦不堪言。本文特意為大家整理了擁有嵌入式程式設計領域多年工作經驗的工程師意見,彙總成了一篇能夠對嵌入式程式設計經驗有著指導意義的注意事項,感興趣的朋友快來看一看吧。

在微控制器嵌入式程式設計中,最難的兩部分是interrupt和mm(memory manage),之所以有人覺得並不困難,那是因為太多數情況下晶元製造商都已經直接寫好,但是如果設計者本身就在為晶元製造商工作,那就必須自己會寫配置檔案。

這兩個東西之所以比較難是因為要用彙編或類c來寫,屬於比較低層的東西,中斷有外部中斷和內部中斷,外部中斷有兩種實現模式,硬體中斷模式和軟體中斷模式,相對來說比較簡單,屬於應用層面的,相比之下,內部中斷就要複雜得多,內部中斷主要是發生重起,匯流排出錯、溢位、校驗出錯等情況產生的,很多軟體開發人員基本上不寫對應的中斷服務程式,因為它太難了而且一般也用不到。但是一旦發生,那就是致命錯誤,因此從整個系統健壯性來考慮必須要有相應的isr才行,這也是freescale的專家建議的,因所以下面就談一下嵌入式程式設計應該注意的問題。

延時

嵌入式程式設計經常會涉及到硬體的操作,如adc,開啟或者關閉乙個電流源,這些都是需要時間的,因此當在發出這些指令的時候立即讀取暫存器的值是得不到想要的結果的,而且還找不出原因,有時候需要的延時還比較長,達到ms級,一般情況下us級就夠了,根據各晶元的時鐘頻率而定,不單指mcu的匯流排時鐘頻率。

變數

一般來說如果非常明確某個變數的作用域和生命週期就應該定義相對的變數,如const、static等,這樣不容易出錯,不建議將所有變數都定義成全域性變數,這樣管理起來比較麻煩,程式一旦出錯,破壞性也比較大,函式也是如此,全域性變數和通用函式一定要申明,這樣在呼叫的時候不容易出錯,而且有些編譯器對於未申明的函式是不會報錯的,但在呼叫的時候又會發出型別隱含轉換的警告,在這裡就不舉例子了,總之這點要特別小心。

巨集定義

在程式編寫過程對於一些特定的數字應該盡量使用巨集定義,這樣做有個好處就是比較直觀,便於日後維護,要不然時間久了看到那個數字根本就想不起它代表什麼意思,巨集定義並不會給程式帶來任何負擔,因為它在編譯的時候就已經全部替代了,所以盡可以廣而用之。值得一提的是巨集定義並不侷限於使用常量,它可以定義函式,因為它是直接替換,因此避免了入棧和出棧,提高了程式執行的效率,但是同時增加了**量,因此一般用比較簡單的函式,它還有乙個缺點是在替換的過程不檢查引數型別是否正常,從而增加了安全隱患,解決此問題的方法是使用乙個稱之為inline的內聯函式,它繼承了巨集定義的優點,又彌補了它的缺點,是個最佳的選擇,但是這個屬於c++的範疇,有一定的難度,在這裡也不多講,有興趣的朋友可以參考一下相關資料。

浮點運算

大多數低檔次的微控制器都是不支援浮點運算的,因此在實際使用過程中也很少用到,因此為了降低成本,一般都去掉了浮點運算模組,這就帶來了乙個問題,如果萬一要用到浮點運算怎麼辦?細心的朋友可能會發現,即使不具有浮點運算的微控制器在**除錯過程依然可以使用float or double的資料型別進行計算,而且結果也很準確,這是為什麼呢?這個因為編譯器自動呼叫了庫函式來實現的,一般是通過迭代的方法,因此它的執行效率非常慢,不建議採用此方法,而通常採用的是「定點

」的方法來解決這個問題,比如說乙個32bit的資料,可以假定它的低8位是小數字,然後移位計算,類似於整數運算,這種方法比較複雜,但是可以非常精確,還有一種方法就是直接放大10的n次方倍進行整數的計算,可以得出近似值,因此為了不增加不必要的麻煩,應該總是盡量避免使用浮點運算,一般情況也都是可以避免的。

watch dog

以三重watch dog為例,watch dog1檢查時鐘頻率,watch dog2監視一小段**,它必須在乙個比較短的時間裡喂一次,一般要求在250us到650us之間喂一次,watch dog3監視一大段**,要求在比較長的時間內喂一次,一般是100ms以內,三個條件必須同時滿足才行,這要求對**的執行過程非常清楚,或者將導致餵狗出錯重起。

這裡需要向大家強調的是,在微控制器嵌入式的程式設計過程中程式的好壞往往是由細節決定的,乙個程式寫的是否詳細、靈活,是與日積月累的知識積累與實際磨練成正比的。雖然程式設計是意見非常枯燥甚至乏味的過程,但成功後的喜悅能夠讓大家相信這份付出是值得的。

微控制器選用注意事項

在實際的工作中,經常出現因為rd人員的設計 疏忽 導致試產失敗。這個疏忽要加上引號,是因為這並不是真正的粗心造成的,而是對生產工藝的不熟悉而導致的。為了避免各位做rd的朋友出現同樣的錯誤,或為了更好的完成試產我對一些常見的問題點做一些總結,希望能對大家有所幫助。1 ic封裝的選擇。現在電子產品都在向...

微控制器裸機程式設計注意事項總結

微控制器程式設計和pc端程式設計有所不同,筆者根據已有的粗淺的程式設計經驗,列寫幾個認為比較重要的點。首先對文中的名詞作適當的約定。文章的 事件 可理解為 中斷 每乙個 中斷 發生時,isr將傳送對應於該 事件 的 訊息 事件 通常理解為 非同步事件 為了方便,即使是固定週期的定時中斷,亦稱為 非同...

8051核心微控制器程式設計注意事項

1 巨集定義。例如 define debug log printf define degug log printf 2 51核心的堆疊空間只在pdata區。程式設計中,對於函式巢狀較多層,容易引起堆疊溢位的情況 程式執行至0xffff位址 因而需要減少函式的巢狀。3 51核心程式設計注意區域性變數和...