第9章
初識瑞薩FSP固件庫
9.1瑞薩FSP庫簡介
FSP全稱為“Flexible Software Package”,中文譯為“靈活配置軟件包”。
FSP旨在以較低的內存占用量提供快速高效的驅動程序和協議棧。FSP集成了中間件協議棧、獨立于RTOS的硬件抽象層(HAL)驅動程序,以及最基礎的板級支持包(BSP)驅動程序。FSP還支持FreeRTOS實時操作系統(RTOS)。
如圖所示為FSP的軟件架構。
FSP由瑞薩公司維護和提供支持,開發人員可以從集成開發環境(e2s)或FSP的GitHub倉庫查看或下載FSP的源代碼,從而全面地了解FSP。(您可復制下方鏈接至瀏覽器,或掃描二維碼進行查看)
FSP的GitHub倉庫
https://github.com/renesas/fsp
提示
FSP是使用C99(C語言標準)編寫的開源軟件,提供完整的源代碼,但僅限用于瑞薩的硬件。
9.2瑞薩FSP庫架構分析
下面簡單分析一下瑞薩FSP庫架構。本小節內容當中的一些概念可能會讓初學者覺得較難理解,對此,建議是大概瀏覽然后跳過即可,這不影響后面的章節閱讀,現在只需要大概、初步地了解一遍,不求甚解,等到學習到了后期再回過頭來看,或對FSP庫架構會有新的體會。
9.2.1FSP庫層次結構
如圖所示,展示了FSP庫的層次劃分,我們可以很直觀地看到進行層次劃分之后的軟件結構。
RA MCU
位于最底層的是RA系列微控制器硬件。不同系列的RA微控制器之間具有非常一致、高度兼容的外設硬件,這為軟件開發人員提供了極大的便利。
BSP
往上一層是板級支持包(BSP)。BSP處于FSP軟件的底層,是FSP的功能基礎。BSP負責MCU復位后初始化系統使程序執行進入main函數,并為上層軟件提供其他服務。
BSP函數名稱以R_BSP_開頭,BSP宏以BSP_開頭,數據類型定義以_bsp開頭,以便于與FSP的其他部分區分開來。
HAL
在BSP之上是硬件抽象層(Hardware Abstraction Layer(HAL)),它以較小的內存占用量為外設提供高效的設備驅動程序,實現易于使用的接口,使開發人員不必直接處理單片機的寄存器組,并使處于HAL層以上的軟件更容易在整個RA產品家族中移植。它是模塊(Modules)的集合,每個模塊都是RA系列微控制器中可用的外設的驅動程序(比如SPI、I2C、ADC),其名稱以r_開頭。所有這些模塊本質上均與RTOS無關。HAL層除了“模塊”以外還有:“接口”、“實例”等關鍵概念。
HAL層的函數的名稱以R_開頭,格式一般為R_
操作系統和中間件
FSP庫首選支持FreeRTOS,可以通過軟件快速配置。FreeRTOS是非常流行的實時操作系統,支持多任務調度、任務通知、隊列、互斥、信號量和軟件計時器等功能,其系統開銷非常小,占用的內存也很小,性能可靠,經常被用于內存資源十分有限且需要實時響應處理的操作環境。
中間件介于HAL硬件抽象層和用戶應用層之間,為應用層提供服務。FSP的中間件支持包括:TCP/IP協議棧、USB協議棧、WiFi和藍牙BLE協議棧、電容式觸摸、FAT文件系統、圖形庫、加密等等。FSP中間件函數的名稱命名格式一般為:RM_
應用層
該層為FSP層次劃分的最頂層,包含了用戶的應用代碼。用戶通過FSP底層提供的直觀、簡單和統一的API接口調用下面各層,從而訪問FSP的所有功能,這樣用戶就能以非常簡單和直接的方式編寫易于理解、維護簡單、移植方便的代碼。
9.2.2FSP庫工程結構
我們再來看由軟件自動生成的FSP庫工程的結構究竟是什么樣子的。
列表1:FSP庫工程結構
左右滑動查看完整內容
Project ├─ ra │ ├─ arm 包含 ARM CMSIS 代碼 │ └─ fsp 包含 FSP 庫本體 │ ├─ inc │ │ ├─ api FSP 接口 (FSP Interfaces)(接口包含 API 定義) │ │ └─ instances FSP 實例 (FSP Instances)(接口的實例) │ └─src │ ├─ bsp BSP 層 (Board Support Package) │ │ ├─ cmsis 包含寄存器定義文件和啟動文件 │ │ └─ mcu 包含 BSP 代碼 │ └─ r_FSP 模塊 (FSP Modules)(接口由模塊實現,模塊通過接口提供通 用功能) ├─ ra_cfg 包含 FSP 庫的配置(包括 BSP 和 HAL 層的配置) ├─ ra_gen 包含用戶的 FSP 配置數據(包括時鐘、引腳、各個外設、中斷向量等 配置數據) ├─ Debug/Release 包含編譯后生成的中間文件和最終可執行文件等 └─src └─hal_entry.c包含了用戶裸機應用程序的入口函數 hal_entry。 當沒有使用 RTOS 的時候,hal_entry 函數由 C 語言main函數 調用, 所以其作用基本等同于main
上面的FSP庫工程的結構其實非常的簡單。只要我們把“Project”下的內容分為三部分:
第一部分為FSP庫及其配置,包括ra、ra_cfg、ra_gen這3個文件夾,它們由軟件生成。
第二部分為用戶代碼,包括src文件夾。
第三部分為編譯輸出文件,包括Debug或Release文件夾。
那么,我們便不需要深入地理解FSP庫的架構也可以很好的上手FSP庫進行開發,因為我們在配置FSP庫的時候,是通過軟件的圖形界面(FSP配置器)來配置的。
警告
注意:任何由軟件生成的文件用戶都不應該去編輯!因為在每次進行FSP配置之后單擊“生成項目內容(Generate Project Content)”圖標按鈕時,軟件都會自動重新創建這些文件,因此任何的更改都將被覆蓋。
對于想要深入理解FSP庫的讀者,可以嘗試閱讀其源碼。同時,要想清晰地理解FSP庫的架構,需要掌握以下幾個相關的重要概念。
1.模塊(Modules):模塊可以是外設驅動程序、純軟件或介于這兩者之間,并且是FSP的構建模塊。模塊通常是獨立的單元,但它們可能依賴于其他模塊。可以通過組合多個模塊來構建應用程序,為用戶提供所需功能。
2.模塊實例(Module Instance):模塊的單個、獨立實例化(模塊配置)。例如,USB端口可能需要使用r_dmac模塊的兩個實例與其他端口之間來回傳輸數據;又例如,當應用程序需要使用兩個GPT定時器時,每一個這個定時器都是r_gpt模塊的實例。
3.接口(Interfaces):接口包含API定義,具有相似功能的模塊可以共用這些API定義。模塊通過這些定義提供通用功能。通過這些API定義,使用相同接口的模塊可以互換使用。可以將接口視為兩個模塊之間的合同,兩個模塊均同意使用合同中達成一致的信息進行協作。接口只是定義,并不會增加代碼的大小。
4.實例(Instances):接口規定所提供的功能,而接口的實例則真正實現了這些功能。每個實例都與特定的接口關聯,并使用接口中的枚舉、數據結構和API原型。這樣,應用程序便可以在需要時交換實例。
5.堆疊(Stacks):FSP架構所采用的設計方式是,模塊可以堆疊起來協同工作,從而形成了一個FSP堆。將一個模塊所能提供的功能與另一個模塊所需要的功能相匹配,這就是堆疊過程。堆由頂層模塊及其所有依賴項組成。
6.應用程序(Application):歸用戶所有并由用戶維護的代碼。
7.回調函數(Callback Functions):當有事件發生時(例如,USB接收到一些數據時),中斷服務程序(ISR)將調用這些函數。中斷回調函數是應用程序的組成部分,如果是在中斷使用,應盡量簡短,因為它們將在中斷服務程序內運行,會阻礙其他中斷執行。
關于接口與實例的概念:接口規定所提供的功能,而實例則真正實現了這些功能。每個實例都與特定的接口關聯,并使用接口中的枚舉、數據結構和API原型。這樣,使用接口的應用程序便可以根據需要交換實例,從而在需要更改代碼或所用外設時節省大量的時間。在RA產品家族MCU上,一些外設(例如IIC)將具有一對一的映射關系(只映射到IIC接口),而其他外設(例如SCI)將具有一對多的映射關系(實現三個接口:IIC、UART、SPI)。如下圖所示展示了這種映射關系。
-
瑞薩
+關注
關注
36文章
22386瀏覽量
88053 -
驅動程序
+關注
關注
19文章
862瀏覽量
49119 -
固件庫
+關注
關注
2文章
98瀏覽量
15278 -
FSP
+關注
關注
0文章
45瀏覽量
7429
原文標題:初識瑞薩FSP固件庫——瑞薩RA系列FSP庫開發實戰指南(22)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論