此係列以F103VET6芯片爲例
使用CubeMx 移植FreeRTOS,簡直傻瓜式!!!!不懂Cube使用的先去學習學習吧!
一、新建工程
只需要把這裏勾上就OK了,其它都是常規配置,記得把時鐘配置上,我這裏添加了一個串口,用於測試演示,LED都懶得配置了,哈哈!!
FreeRTOS的配置在這裏,先不用管它,直接跳過,以後用到再說
直接點擊生成,發現有警告:
是說FreeRTOS和HAL庫的時鐘源由衝突,然後強烈建議我們把時鐘源改爲其它的,既然這麼強烈建議,那我們就改唄!
我這裏隨便改成了定時器8,大家隨意改就可以了,沒什麼關係的!
改好之後就可以生成代碼了
二、測試程序
1、先不管程序怎麼寫,先看看官方的代碼是怎麼整的
130行的註釋告訴我們,131、132定義並且生成了一個默認任務(StartDefaultTask);
135的註釋又告訴我們在此處添加隊列
139,添加隊列
144,看函數名稱是說啓動內核
146,我們永遠不會到達這裏,因爲有調度器(scheduler)的控制
一大堆亂七八糟的新名詞,先不管,看看怎麼寫測試代碼在說。
2、分析
FreeRTOS是多任務系統,我們要寫代碼,其實就是要增加任務,那怎麼增加任務呢?
剛好例程給了我們一個默認任務,看看它是怎麼添加的,直接全局搜索一下這個默認任務(StartDefaultTask)
發現源代碼就在這裏:
什麼都沒有,就只有一個延時函數,那就依樣畫葫蘆唄,直接複製粘貼(記得printf的重定向弄好):
任務定義好了,那就添加任務唄!還記得不?135的註釋告訴我們在此處添加隊列
編譯一下就報錯了!
說是os_thread_def_defaultTask重定義了,不過好像我們也沒用到這個東西吖!全局搜索一下它!(全局搜索是個好東西吖!)
結果ri了gou了,一查沒有吖!找不到這個鬼東西,再查一下defaultTask,也TM找不到,沒定義就使用的變量,沒理由啊,難道我的C語言學錯了???
好了答案揭曉,C語言肯定沒有不定義就可以使用的變量,這裏的 defaultTask,根本就不是一個變量。
要弄清楚爲什麼這裏可以使用defaultTask,那就要看看osThreadDef到底是個什麼東西了:
osThreadDef不是個函數,而是個宏定義,它就是定義了一個名字叫 os_thread_def_##name 的osThreadDef_t類型的變量,並且把這個變量賦值了。
這裏看起來這麼複雜,我寫簡單點就可以看懂了:
osThreadDef的宏定義跟我寫這個測試的宏定義其實差不多。
那os_thread_def_##name又是怎麼回事?那就要知道“##”和“#”的用法了,兩個都是預編譯的命令:
1、##是把宏參數合併到前面的一個字符
2、#是把宏參數直接轉換爲字符串
可以測試一下:
可以看到,我從來就沒有定義過一個變量叫ABCDEFGH,或者a0的變量,但我的程序卻可以完美的運行!
認真看看##和#的作用,這就是預編譯+宏定義的魅力了(是不是有學到了,哈哈)
清楚了##和#的作用後,我們就知道了,編譯後錯誤警報說是os_thread_def_defaultTask重定義了,就是因爲這個東西作祟,所以,我們改一下:
編譯,通過了!有兩個警報:
這兩個變量,就是osThreadDef這個宏定義裏面幫我們定義了的變量。
既然運行通過,那就燒錄代碼看看唄!
結果懵了,爲何沒東西輸出呢?查了一下,printf是正常的,那麼是怎麼回事呢?
想想那兩個警告,沒道理說這兩個變量沒使用吖,根據複製後的對應原則,檢測一下代碼,發現問題了
原來是後面的忘記改了,這下編譯一下,居然兩個警告沒了,看看這個osThread是何方神聖?
原來也是個宏定義,而且也用了##,還是個引用,這下知道爲何兩個警告沒了,就是因爲這裏使用了它們
好了,終於可以下載程序了!下載看看:
我ca,爲何就只有任務2?我的1呢?去哪了????
PS:同事早就下班了,快12點了,今天就到這裏