學會Zynq(3)Zynq的軟體開發基礎知識

FPGADesigner發表於2019-03-10

上一篇簡單解釋了Zynq配置的相關概念,本文將對Zynq-7000的軟體開發進行簡單介紹。如果設計者已經對ARM的開發方法很熟悉,上手Zynq的軟體開發也會更快,相關概念理解起來也更快。


平臺架構選擇

Zynq-7000內部有雙核ARM Cortex-A9處理器,設計者在開始嵌入式開發前,要先考慮使用非對稱多處理(AMP)還是對稱多處理(SMP)。還要考慮是否使用作業系統、或使用哪個作業系統。

1.多處理模式的選擇

非對稱多處理AMP模式下,多處理器系統中的每個處理器可以執行不同的作業系統映象,但是共享相同的實體記憶體。採用不同的作業系統主要是為了優勢互補,比如一個處理器想要使用網路服務而使用Linux,另一個處理器可以使用一個輕量級的小型作業系統如FreeROTS,提高效率和實時性。AMP模式有兩個重要問題:

  • 系統裝置的劃分,比如串列埠、定時器、乙太網等。總的來說,大多數裝置必須專用於它們指定的處理器。中斷控制器的設計可以使其被多個處理器共享,但是需要指定一個處理器作為主機,來初始化中斷控制器。
  • 處理器間的通訊,讓不同作業系統更有效率地工作,可以用內部處理器中斷、共享記憶體、訊息傳遞等方法實現。

對稱多處理SMP模式下,多處理器系統中的每個處理器共同執行一個單獨的作業系統映象,作業系統的排程程式負責排程每個處理器上的程式。如果一個作業系統即可滿足系統需求,則採用SMP更有效率。作業系統可以自動地使用多個處理器的處理能力,設計者也可以程式設計實現:

  • 設定一個特定的處理器來執行某個程式。
  • 使用任何可用的處理器來處理中斷。
  • 指派一個處理器作為主機,完成系統初始化,啟動其它處理器。

2.作業系統的選擇

如果一個軟體系統不需要依賴太多作業系統提供的特性(如網路),那麼完全可以在沒有作業系統的環境中工作,這就是裸機(Bare-metal)。作業系統會消耗少量處理器的吞吐量,比裸機也增加了更多的不確定性。當然隨著嵌入式處理速度的不斷提高,作業系統的開銷已經微乎其微。

某些設計中可能還是無法容忍作業系統的不確定性,或者某些設計者由於系統複雜性不會使用作業系統。通常可選的作業系統有:

  • Linux:嵌入式設計中最常用的一個開源作業系統,有許多釋出版本。Linux雖然本身不是實時作業系統,但也具有了很多實時特性。Linux的優點是功能齊全,可以發揮處理器的記憶體管理單元MMU的優勢。Linux對SMP模式也有很好地支援。
  • 實時作業系統,RTOS可以為對時間敏感的應用或系統提供所需的確定性和可預測的響應。FreeRTOS就是一個常用的實時作業系統。

裸機裝置驅動架構

裸機的裝置驅動採用分層架構設計,提供了跨作業系統、跨工具集、跨處理器的可移植性,如下圖所示:
在這裡插入圖片描述
Layer2是RTOS和裝置驅動之間的介面卡,將Layer1層的裝置驅動轉換為一個介面,與RTOS的驅動模型的需求匹配。

Layer1是一個抽象的裝置驅動程式介面,保護設計者免受底層硬體的更改,通常由巨集和函式實現,允許設計者使用裝置的所有功能。裝置驅動程式與作業系統和處理器保持獨立,具有高度可移植性。

Direct Hardware Interface通常以巨集和清單常量的形式實現,這樣設計者可以建立小型應用程式或建立自定義的裝置驅動程式。


裸機應用程式開發

嵌入式設計工具建立的硬體平臺資料檔案包括:

  • 基於XML的硬體描述檔案,描述了處理器、外設、記憶體對映等系統資料;
  • bit流檔案,包括PL部分的程式設計資料
  • 塊RAM記憶體對映(BMM)檔案
  • Zynq第一階段引導裝載(FSBL)所需的PS配置資料

構成應用程式最底層的庫與驅動的集合,稱為裸機的板級支援包BSP。裸機程式的應用環境是一個簡單的、半托管的單執行緒環境,提供了一些基本特性,包括:啟動程式碼、快取函式、異常處理、基本的檔案I/O、支援記憶體分配和其它呼叫的C語言庫、處理器硬體訪問巨集、定時器函式,以及其它一些支援裸機應用所需的函式。

下面是使用SDK進行裸機應用開發的典型流程圖:
在這裡插入圖片描述

1. 匯入硬體平臺資訊

Xilinx硬體配置工具可以建立硬體平臺資料,設計者需要將這些資料匯出到SDK,建立一個硬體平臺工程。

2. 建立裸機BSP

建立好硬體平臺工程後,用SDC建立一個裸機BSP工程。驅動程式和庫的原始檔基於硬體平臺(處理器、IP特性集、硬體配置設定)進行組織和引數配置,建立標頭檔案進行引數定義,之後再編譯。BSP反映了在PS中啟用的IP,包括MIO配置和PL中的自定義邏輯。設計者可以修改和重新生成BSP設定。

3. 建立裸機應用

SDK提供了幾個示例程式,從簡單的“Hello World”到複雜的LWIP測試等。在應用程式嚮導中可以選擇並生成這些應用程式。當然也可以建立空白程式,或者將現有的程式匯入到裸機BSP中。每個應用程式都要有個相關聯的BSP。程式碼開發工具基於Eclipse平臺和CDT外掛,支援編輯、搜尋、重構等基本功能。

4. 構建應用工程

SDK應用工程可以選擇使用者管理或自動管理。使用者管理需要自己建立makefiles並維護。自動管理SDK會建立makefiles,當新增或刪除原始檔時自動更新makefiles,原始檔在儲存改動時會自動編譯,還會自動構建ELF檔案。SDK可以根據硬體平臺和使用的BSP,推測和設定預設的構建選項,包括編譯器、連結器和庫路經。

5. 器件程式設計與應用執行

構建完裸機應用後,用SDK配置PS、對PL程式設計、執行應用。SDK使用系統級配置暫存器SLCR配置PS,同時配置資料也會用於FSBL。Bit流和塊記憶體對映資料也會下載到Zynq中,將自定義的設計邏輯載入到PL中,如果僅需要在PS中執行應用,這步便可省略。下載和執行應用程式的ELF檔案時,SDK的Terminal視窗可以通過STDIN和STDOUT和應用程式進行互動。

6. 除錯應用程式

除錯應用程式與執行應用程式步驟基本相同,只不過後者建立的是“執行配置”,前者建立的是“除錯配置”。一組視窗提供了完整的除錯環境,包括呼叫堆疊狀態、原始檔檢視、分解器、記憶體、暫存器、其它一些檢視,還有控制檯。設計者可以設定斷點,控制程式執行。對於熟悉Eclipse和CDT外掛的程式設計師來說,該步驟應該相當熟悉。

7. 新增支援自定義IP的驅動程式

Xilinx硬體配置工具建立的硬體平臺資料會捕獲PL部分使用的Xilinx IP模組,裸機的BSP也會自動包含支援這些模組的驅動程式。包含硬體描述後設資料檔案的自定義塊也可以被捕獲,作為硬體平臺的一部分傳遞給SDK。

此外,可以通過指定包含自定義驅動程式和後設資料的路徑,讓SDK將其包含在裸機BSP中。也可以建立庫工程,管理和構建自定義驅動程式的原始檔。當硬體平臺發生改變時,設計者可以通過MDD檔案和Tcl檔案重新配置自定義IP驅動程式。MDD檔案設定了設定的驅動程式引數;Tcl檔案則記錄了生成.h和.c檔案的過程。

8. 部署應用程式

在SDK中開發和除錯完裸機應用後,設計者可以為應用程式建立一個boot映象,用於部署在開發板上。SDK包含一個FSBL的應用程式模板,可以通過修改該模板來建立和構建最終的FSBL。FSBL、裸機應用程式、PL程式設計的bit流組合在一起生成一個boot映象,用SDK Flash Wrier對支援的器件進行程式設計。


Linux應用程式開發

Linux是一個開源的作業系統,Xilinx提供了PS外設的驅動程式。使用硬體平臺資料和Linux核心(Kernel),設計者可以用SDK對Linux使用者程式進行程式設計、除錯和部署。但是SDK不支援對Linux核心的除錯,Linux核心的配置和構建過程需要用其它軟體完成,或者可以用現成的Linux核心。
在這裡插入圖片描述
下面著重介紹以下與裸機程式開發不同的步驟,

1. 啟動Linux

啟動Linux有多種方法:(1).將boot映象下載到Flash中,開發板上電或復位;(2).依次下載和執行FSBL、U-Boot和Linux核心;(3).使用U-Boot載入和執行映象。當在Zynq上執行Linux時,SDK會把PS平臺當作一個遠端的Linux主機,實現的功能取決於檔案系統中包含的元件。

啟動過程中,首先會執行FSBL來設定PS,然後執行U-Boot來載入Linux映象和啟動Linux。實際的啟動順序和Flash映象建立取決於Flash的型別和其它需求。比如FSBL可以用來配置包含自定義邏輯的PL、U-Boot映象也可以包含FSBL。

2. 建立應用工程

與裸機應用工程相同,也是在SDK中完成。此外,SDK還提供了一個Bootgen程式生成可引導的映象(.bin或.mcs)。設計者向Bootgen提供所有映象和載入地址,即可建立boot映象。SDK還提供一個程式,可以將映象傳送到Flash器件中。

3. 構建與執行應用程式

構建過程與裸機完全相同。執行時先建立一個SDK執行配置,將編譯好的應用程式複製到檔案系統中。當Zynq中執行Linux時,如果Linux環境中包含SSH,執行配置會用sftp把可執行檔案複製到檔案系統中。

4. 除錯應用程式

除錯時,Linux中的gdbserver會執行應用程式,SDK偵錯程式通過TCP和其通訊。其它除錯特性與裸機時相同。

5. 新增支援自定義IP的驅動程式

SDK支援為PS中的外設和PL中的自定義IP生成Linux BSP。生成Linux BSP時,SDK會生成一個裝置樹。裝置樹本質上就是一種資料結構,描述了硬體系統,在啟動時會傳遞給核心。裝置驅動程式作為核心的一部分,或作為單獨的模組使用;裝置樹定義了一組可用的硬體功能和啟用的特性。PL中的自定義IP是高度可配置的,裝置樹引數定義了系統中可用的IP集,以及每個IP中啟用的硬體特性。

6. 分析應用程式

在構建應用程式時加上-pg選項,可以分析Linux使用者程式,基於gprof單元和一個附帶的檢視器來顯示呼叫圖和其他資料。SDK包含一個OProfile外掛,可以在分析使用者應用程式、核心、中斷處理程式和其他模組中所有正在執行的程式碼時,做到視覺化。OProfile是一個Linux系統範圍內的開源分析器,通過核心驅動程式和守護程式來收集示例資料。

7. 向Linux檔案系統新增應用

編譯後的使用者應用程式和所需的共享庫可以新增到Linux檔案系統中,可以通過如下三種方法實現:

  • 當Linux執行在Zynq-7000 AP SoC上時,如果Linux環境包含SSH,可以使用sftp複製檔案。
  • 在SDK中,遠端系統資源管理器(RSE)外掛允許使用拖放來複制檔案。
  • 在SDK外部的工作流中,在建立檔案系統映像並將其程式設計到flash之前,將應用程式和庫新增到檔案系統資料夾。

本系列會先介紹裸機應用程式的開發,再介紹帶作業系統的應用程式開發,屆時再對作業系統的相關概念做詳細介紹。

相關文章