文章目錄
- 教程目錄
- 1.1 FreeRTOS目錄結(jié)構(gòu)
- 1.1 FreeRTOS目錄結(jié)構(gòu)
- 1.2 核心文件
- 1.3 移植時涉及的文件
-
1.4 頭文件相關(guān)
- 1.4.1 頭文件目錄
- 1.4.2 頭文件
- 1.5 內(nèi)存管理
- 1.6 Demo
-
1.7 數(shù)據(jù)類型和編程規(guī)范
- 1.7.1 數(shù)據(jù)類型
- 1.7.2 變量名
- 1.7.3 函數(shù)名
- 1.7.4 宏的名
-
1.8 安裝Keil
- 1.8.1 下載Keil
- 1.8.2 安裝Keil
- 1.8.3 安裝Pack
- 1.9 使用模擬器運行第1個程序
- 1.10 使用邏輯分析儀
?
需要獲取更好閱讀體驗的同學,請訪問我專門設(shè)立的站點查看,地址:http://rtos.100ask.net/
教程目錄
本教程連載中,篇章會比較多,為方便同學們閱讀,點擊這里可以查看文章的 目錄列表,目錄列表頁面地址:https://blog.csdn.net/thisway_diy/article/details/121399484
1.1 FreeRTOS目錄結(jié)構(gòu)
以Keil工具下STM32F103芯片為例,它的FreeRTOS的目錄如下:
1.1 FreeRTOS目錄結(jié)構(gòu)
以Keil工具下STM32F103芯片為例,它的FreeRTOS的目錄如下:
主要涉及2個目錄:
- Demo
- Demo目錄下是工程文件,以"芯片和編譯器"組合成一個名字
- 比如:CORTEX_STM32F103_Keil
- Source
- 根目錄下是核心文件,這些文件是通用的
- portable目錄下是移植時需要實現(xiàn)的文件
- 目錄名為:[compiler]/[architecture]
- 比如:RVDS/ARM_CM3,這表示cortexM3架構(gòu)在RVDS工具上的移植文件
1.2 核心文件
FreeRTOS的最核心文件只有2個:
- FreeRTOS/Source/tasks.c
- FreeRTOS/Source/list.c
其他文件的作用也一起列表如下:
FreeRTOS/Source/下的文件 | 作用 |
---|---|
tasks.c | 必需,任務(wù)操作 |
list.c | 必須,列表 |
queue.c | 基本必需,提供隊列操作、信號量(semaphore)操作 |
timer.c | 可選,software timer |
event_groups.c | 可選,提供event group功能 |
croutine.c | 可選,過時了 |
1.3 移植時涉及的文件
移植FreeRTOS時涉及的文件放在FreeRTOS/Source/portable/[compiler]/[architecture]
目錄下,
比如:RVDS/ARM_CM3,這表示cortexM3架構(gòu)在RVDS或Keil工具上的移植文件。
里面有2個文件:
- port.c
- portmacro.h
1.4 頭文件相關(guān)
1.4.1 頭文件目錄
FreeRTOS需要3個頭文件目錄:
- FreeRTOS本身的頭文件:FreeRTOS/Source/include
- 移植時用到的頭文件:FreeRTOS/Source/portable/[compiler]/[architecture]
- 含有配置文件FreeRTOSConfig.h的目錄
1.4.2 頭文件
列表如下:
頭文件 | 作用 |
---|---|
FreeRTOSConfig.h |
FreeRTOS的配置文件,比如選擇調(diào)度算法:configUSE_PREEMPTION 每個demo都必定含有FreeRTOSConfig.h 建議去修改demo中的FreeRTOSConfig.h,而不是從頭寫一個 |
FreeRTOS.h |
使用FreeRTOS API函數(shù)時,必須包含此文件。 在FreeRTOS.h之后,再去包含其他頭文件,比如: task.h、queue.h、semphr.h、event_group.h |
1.5 內(nèi)存管理
文件在FreeRTOS/Source/portable/MemMang
下,它也是放在portable
目錄下,表示你可以提供自己的函數(shù)。
源碼中默認提供了5個文件,對應內(nèi)存管理的5種方法。
參考文章:FreeRTOS說明書吐血整理【適合新手+入門】
后續(xù)章節(jié)會詳細講解。
文件 | 優(yōu)點 | 缺點 |
---|---|---|
heap_1.c | 分配簡單,時間確定 | 只分配、不回收 |
heap_2.c | 動態(tài)分配、最佳匹配 | 碎片、時間不定 |
heap_3.c | 調(diào)用標準庫函數(shù) | 速度慢、時間不定 |
heap_4.c | 相鄰空閑內(nèi)存可合并 | 可解決碎片問題、時間不定 |
heap_5.c | 在heap_4基礎(chǔ)上支持分隔的內(nèi)存塊 | 可解決碎片問題、時間不定 |
1.6 Demo
Demo目錄下是預先配置好的、沒有編譯錯誤的工程。目的是讓你可以基于它進行修改,以適配你的單板。
這些Demo還可以繼續(xù)精簡:
-
Demo/Common
中的文件可以完全刪除 - main函數(shù)中只需要保留2個函數(shù):
- prvSetupHardware()
- vTaskStartScheduler()
- 如下圖所示
1.7 數(shù)據(jù)類型和編程規(guī)范
1.7.1 數(shù)據(jù)類型
每個移植的版本都含有自己的portmacro.h
頭文件,里面定義了2個數(shù)據(jù)類型:
- TickType_t:
- FreeRTOS配置了一個周期性的時鐘中斷:Tick Interrupt
- 每發(fā)生一次中斷,中斷次數(shù)累加,這被稱為tick count
- tick count這個變量的類型就是TickType_t
- TickType_t可以是16位的,也可以是32位的
- FreeRTOSConfig.h中定義configUSE_16_BIT_TICKS時,TickType_t就是uint16_t
- 否則TickType_t就是uint32_t
- 對于32位架構(gòu),建議把TickType_t配置為uint32_t
- BaseType_t:
- 這是該架構(gòu)最高效的數(shù)據(jù)類型
- 32位架構(gòu)中,它就是uint32_t
- 16位架構(gòu)中,它就是uint16_t
- 8位架構(gòu)中,它就是uint8_t
-
BaseType_t通常用作簡單的返回值的類型,還有邏輯值,比如
pdTRUE/pdFALSE
1.7.2 變量名
變量名有前綴:
變量名前綴 | 含義 |
---|---|
c | char |
s | int16_t,short |
l | int32_t,long |
x |
BaseType_t, 其他非標準的類型:結(jié)構(gòu)體、task handle、queue handle等 |
u | unsigned |
p | 指針 |
uc | uint8_t,unsigned char |
pc | char指針 |
1.7.3 函數(shù)名
函數(shù)名的前綴有2部分:返回值類型、在哪個文件定義。
函數(shù)名前綴 | 含義 |
---|---|
vTaskPrioritySet |
返回值類型:void 在task.c中定義 |
xQueueReceive |
返回值類型:BaseType_t 在queue.c中定義 |
pvTimerGetTimerID |
返回值類型:pointer to void 在tmer.c中定義 |
1.7.4 宏的名
宏的名字是大小,可以添加小寫的前綴。前綴是用來表示:宏在哪個文件中定義。
宏的前綴 | 含義:在哪個文件里定義 |
---|---|
port (比如portMAX_DELAY) | portable.h或portmacro.h |
task (比如taskENTER_CRITICAL()) | task.h |
pd (比如pdTRUE) | projdefs.h |
config (比如configUSE_PREEMPTION) | FreeRTOSConfig.h |
err (比如errQUEUE_FULL) | projdefs.h |
通用的宏定義如下:
宏 | 值 |
---|---|
pdTRUE | 1 |
pdFALSE | 0 |
pdPASS | 1 |
pdFAIL | 0 |
1.8 安裝Keil
本教程的所有程序,都是使用Keil開發(fā),運行在Keil的模擬器上。
1.8.1 下載Keil
Keil-MDK(Keil ARM Microcontroller Development Kit)前生是德國Keil公司,后被ARM收購,是ARM官方的集成開發(fā)環(huán)境。
打開Keil官網(wǎng)(https://www.keil.com/download/product/),點擊“MDK-Arm”進行下載。
隨后進入個人信息完善頁面,按提示填寫所有的信息,如下圖所示,填寫完后,點擊“Submit”提交。
隨后進入下載頁面,點擊“MDK532.EXE”即可下載。
1.8.2 安裝Keil
下載完后,點擊運行該文件,進入安裝界面,選擇“Next >>”。
接著進入用戶協(xié)議界面,勾選同意協(xié)議,點擊“Next >>”。
然后設(shè)置安裝路徑,如下圖所示:
第一個“Core”是軟件的安裝路徑,
第二個“Pack”是芯片的硬件支持包的安裝路徑,
保持默認路徑或者設(shè)置為如下圖所示一樣的即可。
如果是自定義設(shè)置,建議為全英文路徑,不建議為包含有中文的路徑。
選擇好之后點擊“Next >>”。
隨后需要設(shè)置個人信息,隨便填寫即可,如下圖所示。
之后便進入安裝進度界面,等待安裝完成。
安裝過程中,回彈出驅(qū)動安裝界面,勾選“始終信任來自‘ARM Ltd’的軟件”,然后點擊“安裝”,如下圖。
之后會自動進入“Pack Installer”界面,這里會檢查安裝的編譯器、CMSIS等是否是最新的,由于我們安裝的是官網(wǎng)提供的最新的MDK,所以這里一般情況下都是不需要更新的。
1.8.3 安裝Pack
一個Keil的開發(fā)環(huán)境,除了Keil軟件,還需要安裝對應的Pack。
比如這里目標機的MCU是STM32F103ZET6,就需要下載該系列的的Pack,如果是STM32F4系列,就需要下其它系列Pack。
使用“Pack Installer”可以方便的對Pack安裝和管理。
在左上角搜索框輸入“STM32F103”,展開搜索結(jié)果,可以看到STM32F103ZE,點擊右邊的簡介鏈接即可跳轉(zhuǎn)到Pack下載頁面。
?
下載完成得到“Keil.STM32F1xx_DFP.2.3.0.pack”。
直接雙擊該文件,隨后彈出如下圖所示界面,點擊“Next”進行安裝。
至此,Keil和Pack就安裝完成了。
1.9 使用模擬器運行第1個程序
先獲取配套示例代碼。
雙擊"FreeRTOS_01_create_task\FreeRTOS\Demo\CORTEX_STM32F103_Keil\RTOSDemo.uvprojx"打開第一個示例。
打開之后,首先要編譯工程,才能使用模擬器運行,點擊"Build"圖標進行編譯,如下圖所示:
?
編譯完成后,點擊"Debug"按鈕進行仿真,如下圖所示:
?
第一個程序里面創(chuàng)建了兩個任務(wù),兩個任務(wù)一直打印各自的信息。
這里需要打開串口顯示模擬窗口,顯示任務(wù)的打印內(nèi)容。
點擊左上角菜單的“View”,然后選擇“Serial Windows”,點擊“UART #1”,如下圖所示:
最后,點擊“Run”運行程序,右下角串口顯示窗口將打印兩個任務(wù)的信息。
如果想退出模擬器仿真,再次"Debug"按鈕退出,如下圖所示:
1.10 使用邏輯分析儀
本課程的程序有兩種輸出方式:
- 串口:查看打印信息
- 邏輯分析儀:觀察全局變量的波形,根據(jù)波形解析任務(wù)調(diào)度情況
下面舉例說明邏輯分析儀的用法。
雙擊"FreeRTOS_06_taskdelay\FreeRTOS\Demo\CORTEX_STM32F103_Keil\RTOSDemo.uvprojx"打開該示例。
打開之后,首先要編譯工程,點擊"Build"圖標進行編譯。
編譯完成后,點擊"Debug"按鈕進行仿真。
本實例使用模擬器的邏輯分析儀觀察現(xiàn)象。
首先在“main.c”的主函數(shù)加入斷點,在代碼行前的灰色處,點擊一下就會有一個紅色小點,就是設(shè)置的“斷點”。
然后點擊“Run”運行,程序運行到斷點位置,就會停下來等待下一步操作:
- 在代碼中找到全局變量flag
- 鼠標選中flag,然后點擊鼠標右鍵,在彈出的菜單里選擇"Add ‘flag’ to…",選擇“Analyzer”,
如下圖所示:
?
此時在代碼框上面,就會出現(xiàn)邏輯分析儀“Logic Analyzer”顯示窗口,里面分析的就是變量flag。
點擊這個flag,然后右鍵,選擇“Bit”,以便觀察,如下圖所示:
?
再點擊一下“Run”,繼續(xù)運行,此時邏輯分析儀窗口顯示變量flag的bit值變化,如下圖所示:
?
在邏輯分析儀窗口,可以使用鼠標滾輪放大、縮小波形。
需要獲取更好閱讀體驗的同學,請訪問我專門設(shè)立的站點查看,地址:http://rtos.100ask.net/
審核編輯:符乾江
評論
查看更多