1 onps棧移植說明——onps棧的配置及裁剪

onps棧的移植涉及幾個部分:1)系統配置及裁剪;2)基礎數據類型定義;3)RTOS適配層實現;4)編寫網卡驅動并注冊網卡 。本文作為onps棧移植的指導性文件將給出一般性的移植說明及建議 , 具體的移植樣例工程及說明請移步碼云下載:

  • 《onps網絡協議棧移植及使用說明v1.0》
  • 目標os為rt-thread的移植樣例工程(STM32F407VET6及STM32F103RCT6兩個平臺)
  • 目標os為ucos-ii的移植樣例工程(硬件平臺同上)
關于onps棧的前世今生請移步上一篇博文《開源網絡協議棧onps誕生記》 。
1. onps棧的配置及裁剪協議棧源碼(碼云/github)port/include/port/sys_config.h文件是協議棧的配置文件 。它提供了一系列的配置宏用于裁剪、配置協議棧 。我們可以根據目標系統的具體情況對協議棧進行裁剪,調整配置,以減少或增加對系統資源的占用率 。配置文件主要涉及幾方面的內容:
1)打開或關閉某個功能模塊;
2)指定mmu(內存管理單元)管理的內存大?。?
3)協議層相關配置項 , 如缺省ttl值、路由表大小、arp緩存表大小等;
onps棧在數據鏈路層支持兩種類型的網絡接口:ethernet有線以太網絡接口;ppp點對點撥號網絡接口 。用戶必須選擇其中至少一個接口:
#define SUPPORT_PPP1 //* 是否支持ppp:1,支持;0,不支持#define SUPPORT_ETHERNET 1 //* 是否支持ethernet:1,支持;0,不支持注意,你的目標系統要么支持ppp,要么支持ethernet,要么二者都支持,不能兩個都選擇不支持,否則協議棧將無法正常工作 。另外協議棧還提供了幾個常用的網絡工具供用戶選擇使用,用戶可以根據具體應用情形選擇打開或關閉相關工具:
//* 網絡工具配置項,0:不支持;1:支持 , 協議棧將編譯連接工具代碼到目標系統//* ===============================================================================================#define NETTOOLS_PING1 //* ping工具 , 確定目標網絡地址是否能到達#define NETTOOLS_DNS_CLIENT 1 //* dns查詢客戶端,通過指定的dns服務器查詢請求域名對應的ip地址#define NETTOOLS_SNTP1 //* sntp客戶端,通過指定的ntp服務器進行網絡校時//* ===============================================================================================考慮協議棧的目標系統可能無法提供pc下常見的文件存儲系統,所以協議棧的調試日志等信息是通過標準輸出提供的:
#define SUPPORT_PRINTF 1 //* 是否支持調用printf()輸出相關調試或系統信息#if SUPPORT_PRINTF#define PRINTF_THREAD_MUTEX 1 //* 是否支持使用printf線程互斥鎖 , 確保不同線程的調試輸出信息不被互相干擾,值為1則支持互斥鎖#define DEBUG_LEVEL1 //* 共5個調試級別://* 0 輸出協議棧底層嚴重錯誤//* 1 輸出所有系統錯誤(包括0級錯誤)//* 2 輸出協議棧重要的配置、運行信息 , 同時包括0、1級信息//* 3 輸出網卡的原始通訊通訊報文(ppp為收發 , ethnernet為發送) , 以及0、1、2級信息//* 4 輸出ethernet網卡接收的原始通訊報文 , 被協議棧丟棄的非法(校驗和錯誤、通訊鏈路不存在等原因)通訊報文,以及0、1、2、3級信息(除ethernet發送的原始報文)#endif基本上所有單片機系統均會提供幾個串行口 , 我們只需選擇其中一個將其作為printf函數的標準輸出口 , 我們就可以使能協議棧支持日志輸出功能,通過printf()函數輸出的日志信息對目標系統進行調試 。如果你的目標系統支持某個串口作為printf()函數的標準輸出口,建議將SUPPORT_PRINTF宏置1,打開協議棧的日志輸出功能 。PRINTF_THREAD_MUTEX宏用于解決多線程環境下日志輸出的沖突問題 。如果你的目標系統互斥資源夠用,建議打開該功能,否則你在標準輸出口看到的日志會出現亂序問題 。
協議棧在很多情形下需要動態申請不同大小的內存以供接下來的邏輯處理過程使用 。所以,為了最大限度地提高協議棧運行過程中的內存利用率并盡可能地減少內存碎片,我們還單獨設計了一個獨立的內存管理單元(mmu) ??紤]協議棧的目標系統為資源受限的單片機系統,這種系統的內存資源往往都是極度緊張的,因此我們提供了配置宏讓用戶決定分配多少字節的內存空間給協議棧的mmu:
//* 內存管理單元(mmu)相關配置項,其直接影響協議棧能分配多少個socket給用戶使用//* ===============================================================================================#define BUDDY_PAGE_SIZE32//* 系統能夠分配的最小頁面大小 , 其值必須是2的整數次冪#define BUDDY_ARER_COUNT 9//* 指定buddy算法管理的內存塊數組單元數量#define BUDDY_MEM_SIZE8192 //* buddy算法管理的內存總大小 , 其值由BUDDY_PAGE_SIZE、BUDDY_ARER_COUNT兩個宏計算得到://* 32 * (2 ^ (9 - 1)),即BUDDY_MEM_SIZE = BUDDY_PAGE_SIZE * (2 ^ (BUDDY_ARER_COUNT - 1))//* 之所以在此定義好要管理的內存大?。?原因是buddy管理的內存其實就是一塊提前分配好的靜態存儲時期的字節型//* 一維數組,以此來確保協議棧不占用寶貴的堆空間//* ===============================================================================================

推薦閱讀