手把手教你學單片機進階-框架篇(上)_第1頁
手把手教你學單片機進階-框架篇(上)_第2頁
手把手教你學單片機進階-框架篇(上)_第3頁
手把手教你學單片機進階-框架篇(上)_第4頁
手把手教你學單片機進階-框架篇(上)_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、手把手教你學單片機進階教程框架篇(上本篇里我們聊一聊軟件框架,那么什么是框架呢?它又有什么用處呢?軟件框架,說簡單一點就是我們組織軟件的方式,沒有框架的代碼,模塊是亂添的,寫程序的人也不知道要添在哪里,只知道加在這里可以用,放在這里就行。有框架的代碼,模塊應該添加到哪里是清楚的。曾經看過一句話說的挺有道理,“一個好的程序架構,是一個有經驗的工程師和一個初學者的分水嶺”,我們在單片機軟件中用的最多的結構莫過于下面這樣的:1While(123Led_on(;4i = 1000;5While(i-;6Led_off(;7當我們剛開始學習的時個,程序比較簡單,這樣單純的結構還是可以應付的。但是如果當我

2、們真的要做一個系統級的工程的時候,有很多功能要處理,這樣的結構顯然就不能適應了,只那一個“while(i-”就不知道耽誤了多少事兒。到這里有人要說了,工程復雜的時候我可以跑個OS。可以說RTOS對于功能復雜的嵌入式系統來說是個非常好的解決方案,如比較出名的RT-Thread (我們以后會推出這個的專題,uc/os-ii。不過,可惜的是,操作系統對于51來說有點太,系統的開銷有可能比應用占用的資源的還要多。那么我們就自己動手來打造一個小資源單片機適用的框架吧。我們將實現兩個版本,其內在思想都是一樣的,一個簡單點,占用資源更小。一個稍復雜些,pzq但更靈活。大家可以根據情況選用。easy_fram

3、ework我們把這個框架暫時命名為easy_framework,這里我們僅提供思想和基本的代碼。完整的代碼可以在我們提供代碼包(下載地址見文章最后里找到。這里測試和實驗的硬件環境是Spark51學習板。大家如果有需要,可以到我們工作室店鋪購買或直接通過QQ聯系我們首先使用一個Timer來產生一個1m的定時中斷。在51單片機上,這里選用Timer01init_sys_timer(23/*T0 1方式*/4TMOD |= 0x01;5/*設定1m的計時*/6TL0 = (u8SYS_TIMER_INIT_VALUE;7TH0= (u8(SYS_TIMER_INIT_VALUE >> 8

4、;8/*允許中斷*/9ET0 = 1;10TR0 = 1;11通過上面這個函數產生一個1m的中斷,在其“中斷服務函數”里我們對一些時間標志量進行記數1/*Timer 0中斷服務程序*/2void proc_sys_tick( interrupt 134TR0 = 0;5Cnt5ms+;pzq6Cnt10ms+;7Cnt20ms+;8Cnt50ms+;9Cnt100ms+;10/*處理1ms 任務*/11task_1ms_period(;12/*如果需要非常精確的1ms,這里需要做初值的修正*/13TL0 = (u8SYS_TIMER_INIT_VALUE;14TH0= (u8(SYS_TIME

5、R_INIT_VALUE >> 8;15TR0 = 1;16每中斷一次,這些時間示志量會加1,在主程序里我們會用到這些標志。主程序如下:1void main(void23/* 要用到1秒的任務,放到100ms里計時*/4u8 cnt_1000ms = 0;5/*硬件相關初始化*/6init_somthing(;7init_sysclk(;8EA = 1;9while (11011/*5 ms 定時到,執行10ms周期任務*/12if (Cnt5ms >= 51314Cnt5ms = 0;15task_5ms_period(;16pzq17/*10 ms 定時到,執行10ms周

6、期任務*/18if (Cnt10ms >= 101920Cnt10ms = 0;21task_10ms_period(;2223/*100ms 定時到,執行10ms周期任務*/24if (Cnt100ms >= 1002526Cnt100ms = 0;27task_100ms_period(;28cnt_1000ms+;2930/*在100ms的任務里為1000ms的任務計時*/31if (cnt_1000ms >= 103233cnt_1000ms = 0;34/* 1000ms */35task_1000ms_period(;36373839到這里,easy_framew

7、ork已經完全浮出水面了。我們把系統劃分成若干個周期性運行的任務,只需要完成相應的任務函數即可,這種“劃分任務,分時運行”的方式也是RTOS的基本思想。通過這種劃分,我們對整個系統的運行情況了解的非常清楚,再也不用發愁新加的模塊放到哪里合適了。而easy_framework的使用的資源僅僅是一個定時器和幾個變量而已。pzqpzq實驗下面就用這個框架寫個簡單的流水燈的的例子看一下(完整的例子在代碼包里可以找到,我們的實驗平臺如下:實驗平臺: Spark51開發板編程環境:TKStudio + KEIL 9.0Spark51學習板上有 8個LED 燈,其連接的原理圖如下,也可以參考學習板的整體原理

8、圖(學習板的資料里有這8個LED 是按共陽級連接的,公共端通過74HC138的一個輸出來控制,使公共輸出控制端即LEDS6輸出低,三極管導通,相應選擇端輸出低即可點亮對應的LED 燈了。下面是流水燈的代碼Spark 嵌入式工作室 www.sparkcn.co.cc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 P0 = p1_value; p1_value <<= 1; if (0 = p1_value p1_value = 0x01; void led_test( static u8 p1_value = 0x01; ADDR2 = 1; ADDR

9、1 = 1; ADDR0 = 0; ADDR3 = 1; ENLED = 0; 任務代碼: 1 2 3 4 void task_100ms_period( led_test(; 是不是見不到討厭的 while(i-了,把程序編譯好下到 Spark51 學習板里看一 下效果。如果想調整流水燈的頻率,把這段代碼放到另一個 task_XXms_period( 里就可以了,是不是很方便。 思考 一個方便、精簡的框架搭建好了,我們寫程序就方便了。但我們高興的同時 還需要思考一下幾個問題: QQ : pzq 6/8 Spark 嵌入式工作室 www.sparkcn.co.cc 1 這樣框架有什么局限性?

10、a 思路一:怎么實現一個可變流水速度的流水燈 b 思路二:各任務運行的時機效率是否達到最高 2 代碼中有一句注釋“ /*如果需要非常精確的 1ms,這里需要做初值的修 正*/” ,應該怎樣修正? 歡迎就以上問題與我們交流、 討論, 我們的聯系方式 QQ: pzq 或 csh 下篇預告 在下一篇文章我們將和大家一起構建另一個軟件框架 mini_framework。比 easy_framework 靈活、方便。Are U Ready ?Lets Go! 作者簡介 Spark 嵌入式工作室,成立于 2010 年,致力于嵌入式方面的軟、硬件開發和 研究,團隊成員都是有經驗的開發工程師,擅長使用 51 單片機、STM32。 聯系方式 QQ:pzq csh QQ 技術交流群:186232047

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論