1. 程式人生 > >LWIP 無作業系統的移植

LWIP 無作業系統的移植

導讀:
本文移植是以STM32F4開發板為例,PHY物理層採用的LAN8720。除了少數程式碼需要更改之外,對於其他的開發板是通用的步驟。
詳細內容可以參考 STM32F4 LWIP開發手冊
第一部分:移植前準備
第二部分:移植過程
移植前準備

1.準備好基礎工程

我選擇具有記憶體管理功能的模板。在ST乙太網驅動庫中 DMA快取區 採用陣列實現,陣列實現存放與RAM中太浪費記憶體,而我採用了記憶體管理使用外部SRAM來分配空間。
如下:(stm324x7_eth.c)中就是陣列,可以註釋掉。
ETH_DMADESCTypeDef  DMARxDscrTab[ETH_RXBUFNB] __attribute__ ((aligned (4
))); /* Ethernet Rx DMA Descriptor */ ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB] __attribute__ ((aligned (4))); /* Ethernet Tx DMA Descriptor */ uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] __attribute__ ((aligned (4))); /* Ethernet Receive Buffer */ uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE] __attribute__ ((aligned (4
))); /* Ethernet Transmit Buffer */

2.下載ST乙太網驅動庫

STM32F4x7_ETH_LwIP_v1.1.0中的STM32F4x7_ETH_Driver裡面一共三個檔案:
    1.stm32f4x7_eth.h 標頭檔案
    2.stm32f4x7_eth.c 驅動
    3.stm32f4x7_eth_conf.h 乙太網配置檔案(需要重新命名,原名:stm32f4x7_eth_conf_template.h)

3.下載LWIP檔案

lwip-1.4.1.zip 是LWIP原始碼
contrib-1.4.1.zip 含官方例程和一些標頭檔案

移植
1.st乙太網驅動庫的移植
  1. 將乙太網庫的3個檔案包含進工程。
  2. 遇到找不到main.h直接註釋掉
  3. 因為我們採用預設的軟體延時函式,所以直接註釋掉USE_Delay//#define USE_DELAY
  4. 將官方對於DP83848 PHY改為LAN8720(使用者使用的PHY)

下面將講解一下需要的配置conf.h

//前部分和原來的內容一致,最下面PHY方面是關於LAN8720的,ST驅動庫需要讀取外部PHY來讀取速度和雙工狀態
#ifndef __STM32F4x7_ETH_CONF_H
#define __STM32F4x7_ETH_CONF_H
#include "stm32f4xx.h"

#define USE_ENHANCED_DMA_DESCRIPTORS

//如果使用自己定義的延時函式的話就登出掉下面一行程式碼,否則使用
//預設的低精度延時函式

//#define USE_Delay     //使用預設延時函式,因此登出掉
#ifdef USE_Delay
    #include "main.h"               
    #define _eth_delay_    Delay     //Delay為使用者自己提供的高精度延時函式

#else
    #define _eth_delay_    ETH_Delay //預設的_eth_delay功能函式延時精度差
#endif

#ifdef  CUSTOM_DRIVER_BUFFERS_CONFIG
    //重新定義乙太網接收和傳送緩衝區的大小和數量
    #define ETH_RX_BUF_SIZE    ETH_MAX_PACKET_SIZE //接收緩衝區的大小
    #define ETH_TX_BUF_SIZE    ETH_MAX_PACKET_SIZE //傳送緩衝區的大小
    #define ETH_RXBUFNB        20                  //接收緩衝區數量
    #define ETH_TXBUFNB        5                   //傳送緩衝區數量
#endif

//*******************PHY配置塊*******************
#ifdef USE_Delay
    #define PHY_RESET_DELAY    ((uint32_t)0x000000FF)   //PHY復位延時
    #define PHY_CONFIG_DELAY   ((uint32_t)0x00000FFF)   //PHY配置延時
    #define ETH_REG_WRITE_DELAY ((uint32_t)0x00000001)  //向乙太網暫存器寫資料時的延時
#else
    #define PHY_RESET_DELAY    ((uint32_t)0x000FFFFF)   //PHY復位延時
    #define PHY_CONFIG_DELAY   ((uint32_t)0x00FFFFFF)   //PHY配置延時
    #define ETH_REG_WRITE_DELAY ((uint32_t)0x0000FFFF)  //向乙太網暫存器寫資料時的延時
#endif

//LAN8720 PHY晶片的狀態暫存器
#define PHY_SR              ((uint16_t)31)      //LAN8720的PHY狀態暫存器地址
#define PHY_SPEED_STATUS    ((uint16_t)0x0004)  //LAN8720 PHY速度值掩碼
#define PHY_DUPLEX_STATUS   ((uint16_t)0x00010) //LAN8720 PHY連線狀態值掩碼  
#endif 

修改eth.c

註釋掉四個陣列,採用記憶體分配使用外部SRAM

2.新增LAN8720和MAC/DMA驅動

  1. LAN8720.c複製到工程中
出現錯誤:..\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol lwip_pkt_handle (referred from lan8720.o).
這個函式在後面新增的檔案中,暫時提示沒有定義,不要心急!
3.新增LWIP原始檔
  1. 工程中建立LWIP資料夾,複製lwip-1.4.1資料夾來
  2. 工程中增加檔案分組 LWIP-API,LWIP-NETIF,LWIP-CORE
  3. 新增原始檔和頭路徑
4.新增中間檔案(起橋樑作用)

以上幾個步驟僅僅是添加了LWIP原始檔和st乙太網驅動。將乙太網驅動和st驅動連線起來需要一種中間檔案。
1. 新增arch,新增5個檔案。其中cc.h根據元件定義了一些變數 u8_t。LWIP內部也採用printf來除錯資訊。cpu.h 定義大小端模式,stm32為小端。 perf.h。sys_arch.c .h全域性變數獲取當前系統時間。
2. 新增LWIP通用檔案-ALLETEK編寫的。
3. 新增ethernetif.h檔案(LWIP原始碼是沒有的ALIENTEK提供)

5.修改LWIP原始碼

中間檔案連線底層驅動和LWIP,需要進行一些修改。

1.修改LWIP檔名

core中的sys.c和sys.h與原來的檔案重名,這裡修改為lwip_sys。注意修改.c中#include “lwip_sys.h”

修改完畢後報錯:..\LWIP\arch\sys_arch.c(37): error: #5: cannot open source input file “timer.h”: No such file or directory

  • lwip需要提供一種系統時鐘,有一些週期性事務來處理。因為現在沒有作業系統,則需要自己實現定時器,並且新增到HARDWARE中。 所以這裡我們使用定時器3,並且設定週期為10ms。新增“timer.c”檔案到工程中,內容為定時器3。中斷服務函式中,進行lwip_loacltime+=10;//10ms中斷,所以+10。具體程式碼看DEMO

新增timer後報錯:..\OBJ\MALLOC.axf: Error: L6407E: Sections of aggregate size 0x3524 bytes could not fit into .ANY selector(s).

  • 這裡提示空間不足,解決辦法在malloc.h中,修改可以管理的內部Ram的大小
#define MEM1_MAX_SIZE           60*1024  //從100k修改為60k,這裡是malloc可以管理的大小,不宜過大。
  • 之後會報錯一些函式沒有定義,暫時不去管它。

2.修改ethernetif.c

暫時不講解原始碼,所以直接用例程的替代。

3.修改mem.c memp.c

在LWIP內部採用動態記憶體管理技術,LWIP記憶體堆ram_heap和記憶體池memp_memory。我們用MALLOC進行動態記憶體分配(也可以使用attribute),註釋掉陣列。
* mem.c 註釋181,182行。定義一個指標

/** the heap. we need one struct mem at the end and some room for alignment */
u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT];
u8_t * ram_heap; //定義指標
  • memp.c中是169~173
  • memp_get_memorysize()用於獲取memp_memory陣列的大小。memp_memory會在lwip_comm.c中使用動態記憶體管理來分配記憶體

4.修改icmp.c, ping使用的icmp協議

  • st有一個預設硬體幀校驗
    修改為下面的部分
6.LWIP的裁剪與配置
  • LWIP中opt.h是可以裁剪和配置LWIP的。但是不建議opt.h中修改,其中的配置都是條件編譯。那麼在其他地方定義就行了。
  • 在lwip_common下的lwipopts.h進行了配置。
  • 開發板連線路由器是會DHCP自動分配地址的。如果DHCP設定為0,是使用靜態IP地址的。

相關推薦

LWIP 作業系統移植

導讀: 本文移植是以STM32F4開發板為例,PHY物理層採用的LAN8720。除了少數程式碼需要更改之外,對於其他的開發板是通用的步驟。 詳細內容可以參考 STM32F4 LWIP開發手冊 第一部分:移植前準備 第二部分:移植過程

移植EMWIN STM32F103VET的一些問題(作業系統

學習經歷 起因:因為貪便宜買了塊STM32F103VE的開發板,到貨後發現的問題 1.資料不全;導致學習困難度,“挫敗度”大大加深; 2.網上查詢的資料與板子不對應,對初學者來說困難度變大; 3.視訊教程過於龐大,學習過程中若沒有動力支援,放棄的可能性很大 參考意見:如果

[微控制器經驗] 【mk_欣馳】emWin移植筆記——STemWin5.22在STM32F103上的移植步驟(帶觸控,作業系統

一、硬體要求小系統 (無視窗管理器)       •RAM:100位元組      • 堆疊:600位元組      •ROM:10-25 kb(取決於所使用的功能)  大系統 (包含視窗管理器和小工具)       •RAM:2-6 kb(取決於所需的視窗數)      •

lwip協議棧移植(1)

程序編寫 編程 進行 pop call 創建 nbsp err raw   lwip移植分為兩類:   1,只移植內核核心,用戶應用程序編寫只能基於raw/callback api進行   2,移植內核核心和上層API函數模塊,用戶可以使用所有三種API編程,即 raw/c

淺談裝置驅動的作用與本質,有作業系統Linux裝置驅動的區別

  一、驅動的作用 任何一個計算機系統的執行都是系統中軟硬體協作的結果,沒有硬體的軟體是空中樓閣,而沒有軟體的硬體則只是一堆廢鐵。硬體是底層基礎,是所有軟體得以執行的平臺,程式碼最終會落實為硬體上的組合邏輯與時序邏輯;軟體則實現了具體應用,它按照各種不同的業務需求而設計,滿足了使用

轉 有或作業系統的Linux裝置驅動區別

 1)無作業系統(即裸機)時的裝置驅動     並不是任何一個計算機系統都一定要執行作業系統,在許多情況下作業系統是不要的。對於功能比較單一、控制並不複雜的系統,如公交車刷卡機、電冰箱、微波、簡單的手機和小靈通等,

嵌入式Linux作業系統移植IMX6開發板之實現USB 自動掛載

本篇文章講述如何實現USB自動掛載,U盤即插即用,不用手動掛載的方法,以及給出U盤自動掛載的原理。 目前做的IMX6開發板,移植Linux系統,原始碼(linux核心為3.0.35)由廠家提供(後面會提供核心,uboot,檔案系統原始碼)。主要功能是實現機器人

DM365 spi_norflash作業系統啟動和sys_bios啟動(一)

專案需要:在TI的多媒體處理器DM365上跑SYS/BIOS系統,而不是通常的linux系統,而啟動方式採用spi 的norflash啟動。開發環境是CCS5.5 TI 官方在SPI flash啟動上所提供的資料並不是很多,而且網上查詢到的一些資料也基本上都是用來啟動li

rtmp向IR601移植過程(功能步驟,只有移植步驟)

安裝 crypto usr 默認 flag arch librtmp AR www 1.main.c中添加頭文件: #include "rtmp_sys.h" #include "log.h" #include "rtmp.h" 2.功能代碼編寫 3.添加頭文件地址 交

手把手教你移植LWIP(ENC28J60)

2016年07月11日 15:00:38 hwj666 閱讀數:13160 標籤: 移植網路 更多 個人分類: 微控制器 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/he_wen

【轉載】筆記:os的LwIP在TCP server歷程中網路資料傳送,串口出現tcp_write及tcp_receive錯誤。

  2016年09月07日 22:13:58 新野-新野 閱讀數:6180 標籤: LWIP 更多 個人分類: 轉載筆記 做一個,串列埠收到資料然後通過tcp主動傳送出去的東西,但是目前遇到以下問題,當tcp初始化後連

移植linux核心到s3c6410(kernel 列印:Uncompressing Linux ... done , booting the kernel.後響應問題的解決。)

轉載地址: https://blog.csdn.net/roadtoforest/article/details/6652280 U-boot網口問題解決後,uImage和ramdisk終於可以上傳到單板上去驗證了。指令碼為: MINI6410 # setenv serverip

5、 LwIP協議棧規範翻譯——作業系統模擬層

  為了使lwIP可移植,作業系統特定的函式呼叫和資料結構不直接在協議的程式碼中使用。相反,當需要這樣的函式呼叫和資料結構時,直接使用作業系統模擬層。 作業系統模擬層為作業系統服務提供統一的介面,如定時器,程序同步和訊息傳遞機制。 原則上,當移植lwIP到其他作業系統時,只需要實

STemWin移植到MiCO物聯網作業系統筆記-基於秉火STM32F429開發板【2】

把 MiCO 移植到了 STM32F429上,並移植了 emWin到 MiCO 上 原始碼Git地址https://github.com/zhaojuntao/MiCO-STM32F429-emWin 本DEMO所在目錄為:demos\application\LTDC_LCD em

STemWin移植到MiCO物聯網作業系統筆記-基於秉火STM32F429開發板【1】

這段時間,因為客戶要用WiFi模組來更新LCD螢幕圖片內容,但是傳統的WiFi模組都是基於串列埠透傳的,於是乎就看到秉火挑戰者開發板上有EMW1062 WiFi模組,SDIO通訊介面,於是就索性用秉火現成的STemWin DEMO來做了。 之前也沒有移植過STemwin,網上簡單查了下,簡單

ubuntu作業系統,虛擬機器掛起,繼續執行虛擬機器後,網路連線,該怎麼辦?

每次把虛擬機器關機後,網路就可以通了,但是很多時候,我們需要它能在我們下次再來的時候能夠保持原樣。 我的虛擬機器是ubuntu作業系統,所以開啟終端 輸入命令:vim /etc/network/interfaces 然後發現自己沒有許可權 這時候我們給這個檔案新增可執行,讀寫,

STM32F107移植LWIP

lln support 推薦 lai rip pic 內容 odi 官方 STM32F107上移植LWIP2.0.3  因為最近需要在STM32F107上實現TCP/IP協議棧,所以網上查了一下,準備使用LWIP,雖然大多數用的是1.4.1版本但是官方說2系大版

STM32F4XX LWIP+freeRTOS移植(三)

移植好之後,很多朋友不清楚lwipopts.h的配置,這裡把各欄位含義貼出來,供大家參考 #ifndef LWIPOPTS_H #define LWIPOPTS_H //*************************************************

移植LWIP MQTT出現Assertion "sys_timeout: timeout !錯誤

使用LWIP的mqtt_example.c移植到stm32f407上,執行出現 Assertion "sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEO

【RTX作業系統教程】第5章 RTX作業系統庫方式移植(超級簡單)

第5章      RTX作業系統庫方式移植(超級簡單) 原文來源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16596&highlight=RTX%B2%D9%D7%F7%CF%B5%CD%B3