多做練習,如果你現在用的C語言開發單片機,想提高自己的演算法能力,那建議你多看看C語言的常用演算法,然後用單片機板子上的LCD,LED等來驗證自己的演算法程序。

舉一些常用演算法例子吧,你可以試試在單片機上實現。

一、嵌入式C語言常用演算法舉例

演算法就是為解決某一特定問題而採取的具體有限的操作。具有有窮性、確定性、可執行性、領個或多個輸入以及一個或多個輸出。

1、冒泡排序演算法

將一串數據使用冒泡法進行排序。

將排序後的數據按照從大到小或者從小到大的順序在LCD液晶上顯示出來。

2、迴文演算法

檢測字元串是否是迴文字元串,如果是迴文字元串,則點亮LED,如果不是,則蜂鳴器響一下。

3、冪運算

程序中隨意定義一個無符號整型數據N,然後計算出1*2*3*4*......*N的結果,通過液晶顯示出來結果。

4、加法運算

程序中隨意定義一個無符號整型數據N,然後計算出1+2+3+4+......+N的結果,通過液晶顯示出來結果。

5、求直角三角形邊長

用正弦函數,餘弦函數,通過已知的斜邊長度計算出兩個直角邊的長度,通過液晶顯示出來。

6、在排序好的數組中插入元素

程序中先定義一個排好序的數組,然後用隨機數產生函數產生一個隨機數,把這個轉數組原有的排序方案插入到數組中,通過液晶顯示該隨機數位於數組的第幾個元素。

7、字元串的拼接

程序中定義兩個字元串,然後將它們拼接為一個字元串,通過液晶顯示出來。

8、閏年判斷

編寫一個判斷閏年的程序。

9、字元串查詢

在一個現有字元串中查找另一個字元串,如果找到則點亮LED,否則蜂鳴器響。

10、輸出三位水仙花數

所謂水仙花數,是指一個三位數,其各位數字立方和等於該數本身。

例如,153是一個水仙花數,因為153=1的3次方+5的3次方+3的3次方。

11、計算某個日期對應該年的第幾天

例如:編寫程序計算2018年5月1日對應2018年的第幾天。

12、輸出月份對應的英文名稱

例如:編寫程序計算2018年5月對應的英文名稱。

二、常用數字濾波演算法

編寫一個AD轉換程序,分別使用下面的濾波演算法實現濾波功能。

1、程序判斷濾波2、中值濾波3、算術平均濾波4、去極值平局濾波5、滑動平均濾波6、滑動加權濾波7、一階滯後濾波
利益相關,從業十年的高級固件工程師,主持設計多個爆款智能硬體,歡迎關注。

0x01 演算法只有合適不合適,沒有簡單複雜的區分。

單片機資源有限,稍微大容量的單片機也不過512K的RAM空間,並不適合特別複雜的演算法,保證演算法可靠的運行,在性能受限的工作頻率下實現需求的功能才是第一要務。

舉個簡單的例子,將一個長度為10的數組清零,很多同學習慣使用memset這個函數,然而使用這個函數需要調用函數庫,編譯出來的bin文件需要包含庫,所以會大大增大bin文件的大小,這個時候使用一個for循環來賦值看起來「low」,但是卻是最合適的做法。

0x02 邊讀源碼邊實戰才是王道

書籍推薦《數據結構》,代碼推薦FreeRTOS的源碼,後面會做一個嵌入式軟體演算法的學習連載教程,歡迎關注。FreeRTOS的代碼很多精妙的設計,讀懂吸收之後,可以在自己的項目中模仿實現,徹底掌握,比如學到消息管理機制的時候可以在自己的單片機上實現一個隊列控制器,用定時器來觸發分發任務,做完之後可以說消息管理對你來說不在話下了。

歡迎關注「嵌入式瘋狗」,更多乾貨歡迎關注!


    單片機控制大部分是面向硬體的,關於這些物理硬體的控制,最重要的就是調節速度和精度,表現在單片機內部演算法上,我認為就是時間和空間的合理運用,而這些對演算法的要求是什麼呢,或者說作為單片機開發者來說,應該怎麼樣考慮自己的單片機程序呢?

    第一,程序結構

    我知道你肯定不會想去仔細研究數據結構,那太抽象了。在這裡我直接告訴你,基於「狀態機」的程序結構更加適合單片機,確切的說是有限狀態機。狀態機編程技術將直接促使你解決程序的時間問題,並且程序結構可大可小,普通狀態機和層次式狀態機能讓你對絕大多數項目手到擒來。當然狀態機編程技術也是需要學習的,但這比你直接去學數據結構要輕鬆的多。

    第二,使用適合的演算法

    我們編程時要明白一個道理,再多複雜的演算法也不能證明你的程序是一個好程序,那什麼才是呢?是簡潔明了和可靠穩定。大道至簡放在編程上不是一句空話,同樣一個冒泡排序演算法,有的人寫出來死板的很,有的人卻能獨具效率,這是對演算法的理解高度不同。我認為與其學習更為複雜的控制演算法,不如加深自己對現有演算法的理解。通樣的PID演算法程序,有的人能加上積分分離,有的人能用上環境自適應,這裡面差別不可謂不大啊。

    最後希望你能早日從自己的工作中形成自己獨到的理解,精益求精。


    單片機中優質的演算法,是時間和空間平衡的演算法,即考慮運行空間和運行效率。空間少頻率低是單片機的致命硬傷,對於演算法來說。

    如何提高單片機的演算法質量?首先要充分理解需求,即演算法要解決什麼問題。其次要充分運用手法,即怎樣用最適合的指令實現功能。最後要充分優化,即怎樣精簡演算法,從邏輯方面,數據方面,語句表達方面,多思考多實踐。

    系統頻率低,則註定不能在單片機上跑複雜的運算,怎麼辦?通常運用對比的方法,即把運算部分放到PC程序上運行,將結果形成一個表,單片機上只需做對錶運算即可,根據輸入直接匹配輸出結果。

    如果你想喜歡演算法,可以考慮換個平台,跳槽到演算法公司,那裡才是施展拳腳的天地。

    謝謝大家。


    推薦閱讀:
    相关文章