韋東山freeRTOS系列教程之【第一章】FreeRTOS概述與體驗


需要獲取更好閱讀體驗的同學,請訪問我專門設立的站點查看,地址:http://rtos.100ask.net/

教程目錄

本教程連載中,篇章會比較多,為方便同學們閱讀,點擊這里可以查看文章的 目錄列表,目錄列表頁面地址:https://blog.csdn.net/thisway_diy/article/details/121399484

1.1 FreeRTOS目錄結構

以Keil工具下STM32F103芯片為例,它的FreeRTOS的目錄如下:

1.1 FreeRTOS目錄結構

以Keil工具下STM32F103芯片為例,它的FreeRTOS的目錄如下:

在這里插入圖片描述

主要涉及2個目錄:

  • Demo
    • Demo目錄下是工程文件,以"芯片和編譯器"組合成一個名字
    • 比如:CORTEX_STM32F103_Keil
  • Source
    • 根目錄下是核心文件,這些文件是通用的
    • portable目錄下是移植時需要實現的文件
      • 目錄名為:[compiler]/[architecture]
      • 比如:RVDS/ARM_CM3,這表示cortexM3架構在RVDS工具上的移植文件

1.2 核心文件

FreeRTOS的最核心文件只有2個:

  • FreeRTOS/Source/tasks.c
  • FreeRTOS/Source/list.c

其他文件的作用也一起列表如下:

FreeRTOS/Source/下的文件 作用
tasks.c 必需,任務操作
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架構在RVDS或Keil工具上的移植文件。

里面有2個文件:

  • port.c
  • portmacro.h

1.4 頭文件相關

1.4.1 頭文件目錄

FreeRTOS需要3個頭文件目錄:

  • FreeRTOS本身的頭文件:FreeRTOS/Source/include
  • 移植時用到的頭文件:FreeRTOS/Source/portable/[compiler]/[architecture]
  • 含有配置文件FreeRTOSConfig.h的目錄

1.4.2 頭文件

列表如下:

頭文件 作用
FreeRTOSConfig.h FreeRTOS的配置文件,比如選擇調度算法:configUSE_PREEMPTION
每個demo都必定含有FreeRTOSConfig.h
建議去修改demo中的FreeRTOSConfig.h,而不是從頭寫一個
FreeRTOS.h 使用FreeRTOS API函數時,必須包含此文件。
在FreeRTOS.h之后,再去包含其他頭文件,比如:
task.h、queue.h、semphr.h、event_group.h

1.5 內存管理

文件在FreeRTOS/Source/portable/MemMang下,它也是放在portable目錄下,表示你可以提供自己的函數。

源碼中默認提供了5個文件,對應內存管理的5種方法。

參考文章:FreeRTOS說明書吐血整理【適合新手+入門】

后續章節會詳細講解。

文件 優點 缺點
heap_1.c 分配簡單,時間確定 只分配、不回收
heap_2.c 動態分配、最佳匹配 碎片、時間不定
heap_3.c 調用標准庫函數 速度慢、時間不定
heap_4.c 相鄰空閑內存可合並 可解決碎片問題、時間不定
heap_5.c 在heap_4基礎上支持分隔的內存塊 可解決碎片問題、時間不定

1.6 Demo

Demo目錄下是預先配置好的、沒有編譯錯誤的工程。目的是讓你可以基於它進行修改,以適配你的單板。

這些Demo還可以繼續精簡:

  • Demo/Common中的文件可以完全刪除
  • main函數中只需要保留2個函數:
    • prvSetupHardware()
    • vTaskStartScheduler()
    • 如下圖所示

在這里插入圖片描述

1.7 數據類型和編程規范

1.7.1 數據類型

每個移植的版本都含有自己的portmacro.h頭文件,里面定義了2個數據類型:

  • TickType_t:
    • FreeRTOS配置了一個周期性的時鍾中斷:Tick Interrupt
    • 每發生一次中斷,中斷次數累加,這被稱為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位架構,建議把TickType_t配置為uint32_t
  • BaseType_t:
    • 這是該架構最高效的數據類型
    • 32位架構中,它就是uint32_t
    • 16位架構中,它就是uint16_t
    • 8位架構中,它就是uint8_t
    • BaseType_t通常用作簡單的返回值的類型,還有邏輯值,比如pdTRUE/pdFALSE

1.7.2 變量名

變量名有前綴:

變量名前綴 含義
c char
s int16_t,short
l int32_t,long
x BaseType_t,
其他非標准的類型:結構體、task handle、queue handle等
u unsigned
p 指針
uc uint8_t,unsigned char
pc char指針

1.7.3 函數名

函數名的前綴有2部分:返回值類型、在哪個文件定義。

函數名前綴 含義
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開發,運行在Keil的模擬器上。

1.8.1 下載Keil

Keil-MDK(Keil ARM Microcontroller Development Kit)前生是德國Keil公司,后被ARM收購,是ARM官方的集成開發環境。

打開Keil官網(https://www.keil.com/download/product/),點擊“MDK-Arm”進行下載。

在這里插入圖片描述

隨后進入個人信息完善頁面,按提示填寫所有的信息,如下圖所示,填寫完后,點擊“Submit”提交。

在這里插入圖片描述

隨后進入下載頁面,點擊“MDK532.EXE”即可下載。

在這里插入圖片描述

1.8.2 安裝Keil

下載完后,點擊運行該文件,進入安裝界面,選擇“Next >>”。

在這里插入圖片描述

接着進入用戶協議界面,勾選同意協議,點擊“Next >>”。

在這里插入圖片描述

然后設置安裝路徑,如下圖所示:

  • 第一個“Core”是軟件的安裝路徑,

  • 第二個“Pack”是芯片的硬件支持包的安裝路徑,

保持默認路徑或者設置為如下圖所示一樣的即可。

如果是自定義設置,建議為全英文路徑,不建議為包含有中文的路徑

選擇好之后點擊“Next >>”。

在這里插入圖片描述

隨后需要設置個人信息,隨便填寫即可,如下圖所示。

在這里插入圖片描述
之后便進入安裝進度界面,等待安裝完成。

安裝過程中,回彈出驅動安裝界面,勾選“始終信任來自‘ARM Ltd’的軟件”,然后點擊“安裝”,如下圖。

在這里插入圖片描述
之后會自動進入“Pack Installer”界面,這里會檢查安裝的編譯器、CMSIS等是否是最新的,由於我們安裝的是官網提供的最新的MDK,所以這里一般情況下都是不需要更新的。

1.8.3 安裝Pack

一個Keil的開發環境,除了Keil軟件,還需要安裝對應的Pack。

比如這里目標機的MCU是STM32F103ZET6,就需要下載該系列的的Pack,如果是STM32F4系列,就需要下其它系列Pack。

使用“Pack Installer”可以方便的對Pack安裝和管理。

在左上角搜索框輸入“STM32F103”,展開搜索結果,可以看到STM32F103ZE,點擊右邊的簡介鏈接即可跳轉到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"按鈕進行仿真,如下圖所示:
在這里插入圖片描述

第一個程序里面創建了兩個任務,兩個任務一直打印各自的信息。

這里需要打開串口顯示模擬窗口,顯示任務的打印內容。

點擊左上角菜單的“View”,然后選擇“Serial Windows”,點擊“UART #1”,如下圖所示:

在這里插入圖片描述

最后,點擊“Run”運行程序,右下角串口顯示窗口將打印兩個任務的信息。

在這里插入圖片描述

如果想退出模擬器仿真,再次"Debug"按鈕退出,如下圖所示:

在這里插入圖片描述

1.10 使用邏輯分析儀

本課程的程序有兩種輸出方式:

  • 串口:查看打印信息
  • 邏輯分析儀:觀察全局變量的波形,根據波形解析任務調度情況

下面舉例說明邏輯分析儀的用法。

雙擊"FreeRTOS_06_taskdelay\FreeRTOS\Demo\CORTEX_STM32F103_Keil\RTOSDemo.uvprojx"打開該示例。

打開之后,首先要編譯工程,點擊"Build"圖標進行編譯。

編譯完成后,點擊"Debug"按鈕進行仿真。

本實例使用模擬器的邏輯分析儀觀察現象。

首先在“main.c”的主函數加入斷點,在代碼行前的灰色處,點擊一下就會有一個紅色小點,就是設置的“斷點”。

在這里插入圖片描述

然后點擊“Run”運行,程序運行到斷點位置,就會停下來等待下一步操作:

  • 在代碼中找到全局變量flag

  • 鼠標選中flag,然后點擊鼠標右鍵,在彈出的菜單里選擇"Add ‘flag’ to…",選擇“Analyzer”,

    如下圖所示:
    在這里插入圖片描述
    此時在代碼框上面,就會出現邏輯分析儀“Logic Analyzer”顯示窗口,里面分析的就是變量flag。

點擊這個flag,然后右鍵,選擇“Bit”,以便觀察,如下圖所示:
在這里插入圖片描述

再點擊一下“Run”,繼續運行,此時邏輯分析儀窗口顯示變量flag的bit值變化,如下圖所示:
在這里插入圖片描述

在邏輯分析儀窗口,可以使用鼠標滾輪放大、縮小波形。

需要獲取更好閱讀體驗的同學,請訪問我專門設立的站點查看,地址:http://rtos.100ask.net/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM