2023年12月10日發(作者:對學生會的建議)

uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
uCOS 學習隨筆 StepbyStep‐1?——構建模板(基于STM32控制的第四代圓夢小車)??一、 序?基于第四代圓夢小車?——??FIRA?設計了一個使用STM32的控制板(詳細介紹見項目中的說明:?Introduction?B?‐?Hardware?of?the?Smart??)。?既然硬件從51升級到ARM,軟件也應該相應升級,似乎不能再編寫那種簡單的輪詢調度程序,也應該相應升級到基于操作系統編程。?按STM32的規模和性能,以及小車的控制需求,實時多任務操作系統 uCOSII?應該是不二的選擇,不論從其性能和功能考慮,還是從學習角度考慮,uCOSII?都很適合。?首先,它是開源的,有豐富的資源。
其次,它是可靠的,符合正式的工業控制、產品設計需求。
小車所面對的是那些學習相關專業的大學生,作為他們學習的輔助工具,趣味性只是為了降低學習的枯燥性,不是目的。他們借助這個平臺是為了積攢應付未來工作的能力,所以,學習內容的實用性是必須考慮的。??本人從未基于操作系統編寫嵌入式程序。?開始使用 MCU 的時候,MCU 的內存太小,256字節 RAM?,2K字節 ROM,能勉強把程序裝入就不錯了,連 C 語言都不敢選擇。?而且,那時好像也沒有 RTOS(Real?Time?Operation?System),或者是由于信息交流渠道匱乏,不知道有 RTOS。?既然我提供了這個平臺,也借此機會嘗試一下,和大家一起學習使用 uCOSII。(從單片機應用升級為嵌入式應用?^_^)?第 1 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
二、Step1想要得到什么?(需求分析)?第一步我想得到的是:?1) 如何建立一個基于?uCOSII?的編程環境(目錄、文件組織);?2) 如何基于IDE(IAR或RvMDK)建立一個工程,能夠產生可以運行的程序;?3) 得到一個“干凈的”、可以作為模板的uCOSII程序組(Project);?4) 通過上述過程初步理解在?uCOSII?下如何編寫應用程序。??之所以要把“如何建立……”作為需求,而不是找一個現成的模板或示例程序修改、添加自己的功能,是因為看了許多這種程序,感覺“極不可靠”!因為程序中有太多的東西不知道為何而存在?不知道為何而被注釋掉?似乎這些東西都像“定時炸彈”,早晚會給你的程序帶來麻煩。?同時,也給自己理解程序的構成和運行機制帶來困擾,既然是學習,就應該知其然、知其所以然,否則也談不上“掌握”,更不敢在日后的工作中應用(如果是打工,也許還敢試試,如果是用自己的錢做產品、項目,我想你一定不敢用),如此則和做此事的初衷相悖了。??三、如何入手??uCOS的書有很多,也看了許多,但多數都是解析操作系統本身的,或者是如何移植,鮮有書籍、資料教你如何在操作系統下編程。?實際上,對于學習者,特別是初學者,更多需要的是學會如何在一個移植好的系統下編程,等到能基于操作系統實現自己的功能后,才會有心思去探究操作系統是如何在自己的
MCU 上運行的(移植),以及那些神秘的系統功能是如何實現的(了解系統函數及運行機制)。?而且這種探究也是有選擇性的,首先是自己用到的功能才有興趣去研究,否則如墜云霧。其次,取決于自己所扮演的角色,如果只是學習一下,那只需泛泛了解,有個定性的認識即第 2 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
可。如果要用于產品,那可能要深究,吃透其源代碼,以保證產品的可靠和高效。
所以,要想學習有效,學習的方式首先要“正確”。?在編程理念上,人們已經接受了“面向對象”的思維方式,并且承認了其優越之處。
可在學習方式上似乎并未接受,至少大多數書籍還是基于“過程”的,目前所倡導的“任務驅動”(或者稱之為“項目驅動”)模式似乎未被響應,而所謂“任務驅動”我覺得從實質上講類似于編程中的“面向對象”概念。?“面向對象”核心是將編程的關注點放在要實現的功能上,而非實現功能的方式。?“任務驅動”核心是將學習的關注點放在要完成的任務上,而非完成任務的技能。?“面向對象”的優點源于這種思維方式轉變帶來了邏輯關系的清晰,從而使程序易于理解,帶來的所有好處我認為都源于“易于理解”,如可移植性、可靠性、便于多人合作等。?而“任務驅動”同樣也是得益于“易于理解”?。ㄊ褂肙S編程也是為了“易于理解”)?以往的“教”和“學”都是先傳授知識、技能,后讓學生使用之??赏纯嘣谟?,這些知識、技能是前人為了解決某些問題而創建的,準確的說應該是解決問題后抽象出來的。學生們卻要先把抽象的“記住”、“理解”,“暫存”后再去找機會用。想象一下,學的過程會有多“枯燥”,更可悲的是,到需要用時,“暫存”的東西找不到了???。?人通常對于明確目標的事情有較強的興趣,而且目標越近,動力越大,越亢奮。對于不知為何而做的事很難投入,通常是三心二意應付了之。目前的大學多數是這個狀況。?所謂“任務驅動”就是先明確目標,再去學習實現目的所需的知識和技能。這樣學生在整個學習過程中都會主動去思考,不斷斟酌正在學的東西可以怎樣幫助自己實現目標。此時,你想讓他走神都難。?所以,本學習過程嘗試采用“任務驅動”方式。首先要確定一個合適的目標作為學習的素材,目標要可行、能提起興趣,否則無異于沒有。?第 3 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
我所選擇的目標是用?STM32去控制一個小車。小車控制涵蓋了數字輸出輸入、模擬輸入、定時器應用、通訊應用等,應該說嵌入式控制常用的知識均已包含。?因為電機驅動,轉動檢測、電機電流檢測、通訊等需求同時存在,而且這些任務都有響應時間要求,uCOS?的實時多任務特征正好可以得到應用。?小車可以擴展,控制板有I2C接口,很多傳感器都帶。但那是在小車控制自如后的事了。?本系列文章就準備在這個基礎上逐漸深入。??四、初步規劃?從03年開始關注?uCOSII?,買了邵老師的書。真正開始看是08年,我的第二代小車推出STM32擴展版之后。暈暈乎乎將書看完,結果還是無從下手,半途而廢。?這次重新啟動是因為第四代小車沒有設計51的控制器,為了演示只能編寫STM32的控制程序。?為避免再次夭折,強迫自己不再為了銷售而編寫不帶系統的示例程序。那樣雖很快捷,借助于ST的庫,初始化好硬件,直接使用原來基于51的C程序即可。?可如果那樣,或許就沒有動力和壓力去“折磨”自己,嘗試在uCOSII下編程了。不過這次我決定更章易轍,從應用入手,不再糾纏于系統本身。??1)買一個移植成功的學習板作為參考(我買的是“奮斗STM32”),期望少走些彎路。?2)買了本《基于嵌入式實時操作系統的程序設計技術》,期待得到系統的指引。?3)從uCOS的官網(/page/home)下載最新的uCOS源程序及資料。?4)以驅動小車控制板上唯一的LED為任務,自己構建編程環境和工程,作為日后深入的基礎。?因為51我是用Keil的,所以ARM決定還是用Keil,減小難度。?第 4 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
五、實施?5.1 準備工作
uCOS官網上有移植好的?Cortex‐M3?上的?uCOSII,程序包為:?Micrium‐ST‐uCOS‐II‐LCD‐?下載安裝后,里面有uCOS源程序、ST庫、基于ST學習板的示例程序、相應的說明。?看了若干資料,覺得最有價值莫過于從官網上下載的手冊:?AN-1018?:μC/OS-II?and?the?ARM?Cortex‐M3?Processors?特別是其中的這張圖:???第 5 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
對照ReadMe?文件中的目錄說明:???第 6 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
結合“程序關系圖”、“目錄文件說明”,瀏覽一下相關內容,那張“程序關系圖”最好能映射在腦中,對理解、構建程序極為有益!?通過瀏覽,在腦中形成一個uCOS實現的框架,此時不必了解細節。?再把示例程序在IDE中打開編譯、運行看看,因為我沒有ST的學習板,就以奮斗STM32板的示例為參考。?這一步主要是為了驗證IDE環境是否正確,因為示例的工程是正確的,如果此時有問題應出在IDE環境安裝環節。如果開始就建立自己的工程,出現障礙則無法判斷。??這次看這些文件似乎有些感覺,不知道是不是那些似懂非懂的閱讀從量變到質變了。?不過回想學計算機的經歷,似乎每次學習新的東西都要有個“從混沌的積累到頓悟”的過程,或許這就是計算機知識的特征:每個概念都建立在一大堆概念之上,而且都是多因素網狀關聯,需要同時“擁有”才能得到“答案”。??5.2 動手實施
示例程序還是比較“復雜”,因為它需要演示板上所有的功能。以STM3210B‐EVAL為例,它上面有LCD、按鈕、JoyStick、M25?Flash等外設,還支持了串口調試工具uC/Probe。?第一步我要的是一個“干凈”的模板,只需要驅動一個LED,即一個IO口,因為這幾乎是所有系統都會設計的。?通過這個模板,我希望理解uCOS下的程序是如何工作的。?至于調試用的?uC/Probe,相對于這一步所具備的水平,屬于“奢侈品”,暫時還無法享用,所以暫不考慮,等日后程序功能多了,編程自如了,再“錦上添花”。??第一步:構建程序目錄
首先根據自己的需要構建一個目錄。?第 7 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
因為我希望分步實現目標,將每一步都保留,而不是做完后只剩最后一步的內容,這樣別人參考就比較容易,不會像uCOS附帶的示例程序,內容太多,難以消化。?但不希望每一步的目錄中都包含ST和uCOS的庫文件,這樣一是文件太大,二是如果庫文件要升級會很麻煩。?為此,構建了以下目錄結構:??COMMON目錄是基本不用修改的,其中內容來自:??..MicriumSoftwareCPUSTSTM32??????STM32LIB??..MicriumSoftwareuC‐CPU????????????uC‐CPU?..MicriumSoftwareuC‐LIB?????????????uC‐LIB?..
MicriumSoftwareuCOS‐II????????????uCOS‐II??..
MicriumSoftwareuC‐Probe???????????uC‐Probe?雖然這一步不用?uC/Probe,但日后考慮會使用,故保留。?感到遺憾的是Micrium程序包中所附的ST庫是2.0版的,本來打算自己更換為3.0版,但發現有些困難,初學乍練,不敢造次,就放棄了,留待日后升級吧。?學習目錄目前只有?StepByStep‐1?一個,分為三個子目錄:?asp?——?用于存放應用程序,就是實現功能的程序。工程文件在這個目錄中。?bsp?——?用于存放相應的硬件驅動程序,用到什么添加什么。?out?——?存放所有編譯、鏈接產生的文件,交流時這個目錄內容可以不拷貝。?這樣每做一步都建立一個目錄,逐步豐富內容。?第 8 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
asp、bsp目錄中的文件均以上述“uCOS程序關系圖”中所描述的文件為基礎。??第二步:構建自己的bsp文件?我參考的是這個目錄:?..
MicriumSoftwareEvalBoardsSTSTM3210B‐EVALRVMDKBSP?它包含以下文件:??我不用LCD,所以去掉,bsp文件如下:??注意:除刪除了三個與LCD顯示相關的文件外,bsp.h和bsp.c?也作了相應修改,主要是刪除了不用的外設初始化和驅動程序,只保留了必須的驅動(詳見程序清單)。?bsp_int.c?和中斷初始化相關,因第一步不涉及中斷,故暫不處理。?Bsp_periph.c?初始化各外設的時鐘,因未吃透,也暫不處理。?Init.s?是啟動代碼,程序復位后的入口,因第一步無特殊要求,也沒有能力變出花樣,不去碰它。?兩個SCAT?文件是程序裝載時的定位文件,STM32在這上面有不少花樣,可以將指定程序加載到指定位置等,未來如果要實現小車遠程程序下載或許會用到,此時還一知半解。?第 9 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
按我的理解:?STM32_?文件是為了編譯生成FLASH中運行的程序用的,STM32_應該是編譯生成RAM中運行的程序用的。剛從51上來,對在RAM中運行還不熟悉,故建立工程時用的是FLASH方式。?這個目錄會隨著外設的不斷起用而豐富起來。??第三步:構建自己的應用程序
因為原來STM3210B‐Eval板就有LED顯示功能,而且是4個,我所做的就是刪除所有不用的功能,將4個LED驅動改為一個即可。(注意:是刪除,不是注釋掉)?刪除后的app相當“單純”:?????第 10 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
APP目錄下有如下文件:??其中app_cfg.h?也很“單純”:??只有一個任務,確定其優先級和所用棧尺寸即可。?includes.h?里面有許多是系統需要的頭文件,還沒有吃透,暫不處理。?os_cfg.h?是uCOSII的配置文件,日后需要裁減系統時再琢磨,第一步不去惹它,以免系統罷工。?stm32f10x_conf.h?是STM32的配置文件,不啟用的外設就注釋掉,此處不用刪除,因為恢復時太麻煩。?第一步應用部分只使用了一個IO口:PA3,所以從應用角度只需要打開GPIO、GPIOA,但AFIO似乎系統用了,去掉后系統編譯出錯,只能保留。?按我的理解,一些基礎的功能系統應該需要,如中斷、時鐘、定時器等,沒想到可以將SysTick及所有TIM注釋掉,不清楚系統是如何產生定時任務切換的,如果要深入系統,這就是一個值得探討的點。(具體保留了那些外設詳見程序)?vectors.s中定義了STM32所有外設的中斷向量,似乎沒有必要去碰它。?至此,第一步所需要的源文件已經完成,下面要拿出來“遛遛”了。??第 11 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
第四步:在MDK中構建工程?我所使用的是MDK3.5版本。構建過程如下:?1)在Project菜單中選擇“New?uVision?Project”,創建一個新工程,放在app目錄下;我所創建的工程文件名是:????YM4‐STM32‐2??2)在Project菜單中選擇“manage”,為工程設置工程目標名、文件組,并在每個文件組中添加對應的文件:???因為編譯產生的文件是在Flash上運行的,所以目標名用“Flash”,我覺得這個純粹是為了便于記憶、理解。?文件組是參考示例程序及自己的理解確定的。?確定組后,添加相應的文件,包括C、S、asm(匯編)程序,asp、bsp組的文件來自對應的目錄。其它都是系統文件,具體如下:?STM32‐LIB文件添加自:(注:我是根據STM32f10x‐conf.h確定要添加的文件的)?uCOS‐StepbyStepCOMMONSTM32LIBsrc?第 12 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
uC‐CPU?文件添加自:?uCOS‐StepbyStepCOMMONuC‐CPUARM‐Cortex‐M3RealView?uC‐LIB文件添加自:(注:因第一步未用,故沒有添加文件)?uCOS‐StepbyStepCOMMONuC‐LIB?uCOS‐StepbyStepCOMMONuC‐LIBPortsARM‐Cortex‐M3RealView?uCOSII?文件添加自:?uCOS‐StepbyStepCOMMONuCOS‐IISource?uCOS‐Port文件添加自:?uCOS‐StepbyStepCOMMONuCOS‐IIPortsARM‐Cortex‐M3GenericRealView??完成上述步驟后,在IDE的Project?Workspace?窗口顯示如下:???3)鼠標在工程目標名“Flash”上,點右鍵菜單,選擇“Option?for?Taget?Flash”?,開始配置工程選項。?打開后的主界面如下:?第 13 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
?依次選擇:?Device:?ST的STM32F103RB?Target:默認值?Output:??Listing:同Output一樣選擇輸出文件存放目錄,也放在out目錄下。?Ur:默認(還不明白有什么用處???)??C/C++:這個選項中有很多暫時沒有吃透,第一步必須做的是:首先選擇編譯的的告警提示,建議用?“All?Warning”,因為初學,多注意提示能幫助減少程序中的隱患。?其次就是配置include?目錄,將COMMON和StepbyStep目錄下所有存在?*.h的目錄全部添加進去。??如下所示:?第 14 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
??Asm:默認?Linker:??Debug:按如下內容配置???第 15 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
Utilities:這一步主要配置STM32的FLASH編程算法,如下:???至此,工程全部建立完畢,可以編譯了。???第五步:編譯、下載、調試?這部分操作沒有什么特別之處,用過Keil51就會,即使不熟悉,參考MDK的手冊即可。?JTAG工具用的是市場上最常見的JLink?V8。小車控制板較小,選用的是IDC10接口,需要一個轉接插頭。?編譯時建議先單獨編譯自己寫的程序,此處是:asp.c??bsp.c?。這樣便于出錯,因為編譯產生的提示信息相對少些。?排除錯誤后再進行“Build?Taget”?。???第 16 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
小車調試方式如下:???很幸運,uCOSII下的第一個程序如愿運行了????六、總結?這是我的第一個uCOSII應用程序,雖然簡單,但它幫助我初步理解了如何在uCOS下編寫程序,uCOS程序大概(也就達到了這個水平)是如何運行的。?有了這個基礎,就可以逐步深入,以小車的控制為需求,依次啟用STM32上的外設,編寫相應的BSP,并根據需要編寫相應的應用程序。?通過這一步,自我感覺再看uCOS源程序時容易理解多了,以前看時是被動的接受書中的概念,而這次是先有疑問,再去找答案。?第 17 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
比如說,如果對照圓夢小車二代的Step‐1程序,用延時方式控制LED閃爍,那就無法再處理其它任務,MCU全給延時循環占用了。?為解此惑,我便看了uCOS的延時源程序,理解它是如何實現延時的。我主要看了兩個與定時相關的函數:?OSTimeDly(INT16U?ticks)?OSTimeDlyHMSM(INT8U?hours,?INT8U?minutes,?INT8U?conds,?INT16U?milli)???因為有明確的需求,所以容易理解多了,同時還發現了一個小“秘密”:用后一個函數不能提高延時的精度,雖然它提供了ms?參數,看似可以精確到ms,可如果你真想用它達到ms?分辨率的延時一定會失望的,因為它是靠調用前一個函數實現的。?由此得出結論:?1)用系統延時函數最高分辨率就是系統的?ticks,通常tick為10ms,太快了系統開銷太大,所以用此方法實現?1ms?分辨率的延時不可行,雖說Step1?的tick?是1ms,但后面會改為10ms。?2)后一個函數最大的用途應該是長延時,用前一個函數最長只能?65535?個ticks。?3)如果延時小于?65535?ticks,最好用前一個,可降低開銷。?4)因為這個延時是利用任務控制塊中的延時計數實現的,所以精度不高,如果要準確延時,比如形成周期,最好還是直接用定時器中斷配合消息機制實現。?為理解OSTimeDly,順帶看了時鐘節拍函數:OSTimeTick(void),初步了解了任務切換的過程。?此文屬于隨筆,注重敘述過程和感悟,不想深入探討系統實現,等小車的控制初具雛形后再考慮是否需要對應寫一系列文章,專門探討每一步所涉及的系統函數是如何工作的。??第 18 頁 共 19 頁 uCOS 學習隨筆 StepbyStep‐1? Project:?fira‐mirosot‐robot
讀者如果有興趣可以自己先嘗試一下,我覺得Step1應該了解的是:?1)
2)
uCOSII的系統定時是如何產生的?使用的STM32什么硬件資源??看看用到的幾個OS函數源代碼,它們的功能是什么?如何實現??如:?BSP_IntDisAll()?OSInit()?OSTaskCreate()?OSTaskCreateExt()?OSTaskNameSet()?OSStart()?此外還有BSP中的一些函數?3)
?Step‐1?到此結束,準備著手根據需求構建任務了。??但愿本文能對那些和我一樣曾經蠢蠢欲動多次又無疾而終的uCOS學習者有幫助,大家共同交流、進步!?——————————??2010年10月20日星期三?參考資料:?1、《嵌入式實時操作系統?uC/OS‐II(第二版)》邵貝貝?等譯?ISBN7‐81077‐290‐2?2、《基于嵌入式實時操作系統的程序設計技術》周航慈?吳光文著?ISBN978‐7‐81077‐941‐8?3、《Cortex‐M3?+?uCOS‐II嵌入式系統開發入門與應用》陳瑤等著?ISBN978‐7‐115‐23105‐5?4、《uC/OS‐II?標準教程》楊宗德?張兵?著?ISBN978‐7‐115‐20442‐4?5、uC/OS‐II?官方網站資料?6、奮斗STM32?MINI?學習板資料?消化任務控制塊?TCB?中各個變量的作用,對理解OS函數很有幫助。?第 19 頁 共 19 頁
本文發布于:2023-12-10 23:10:49,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1702221049242268.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:一步步建立 STM32 UCOS 模板.doc
本文 PDF 下載地址:一步步建立 STM32 UCOS 模板.pdf
| 留言與評論(共有 0 條評論) |