FreeRTOS系列(一) STM32 FreeRTOS移植,不就是打個勾嗎?

此係列以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點了,今天就到這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章