LWIP帶freeRTOS系統移植筆記

以正點原子學習視頻為基礎的文章

LWIP帶freeRTOS系統移植

準備資料/工程

1、lwIP例程1 lwIP裸機移植? 工程? ,? ?作為基礎工程? 改名為LWIP_freeRTOS_yizhi工程

2、lwIP例程6 lwIP_FreeRTOS移植? 工程

3、freeRTO源碼??

?打開https://www.freertos.org/網址下載FreeRTOS源碼包

省出麻煩的細節移植,直接使用1、2? 兩個工程移植

? 在? ?lwIP例程6 lwIP_FreeRTOS移植?工程中? ?

1、取出 Middlewares\FreeRTOS? 把FreeRTOS系統源文件移植到

2、取出? Drivers\SYSTEM? ? delaysysusart.c文件? 移植到

3、取出?\User??FreeRTOSConfig.h文件? 移植到

LWIP_freeRTOS_yizhi工程中

在工程中新建分組

LWIP_freeRTOS_yizhi工程作為基礎工程

分組1:Middlewares/FreeRTOS_CORE

Middlewares\FreeRTOS 當前文件夾下的全部c文件

分組2:Middlewares/FreeRTOS_PORT

1、Middlewares\FreeRTOS\portable\MemMang? ?的?heap_4.c文件

2、Middlewares\FreeRTOS\portable\RVDS\ARM_CM4F port.c文件

添加頭文件路徑

1、Middlewares\FreeRTOS\include

2、Middlewares\FreeRTOS\portable\RVDS\ARM_CM4F

移植支持lwip的freeRTOS系統文件

http://savannah.nongnu.org/projects/lwip/

網址下載lwIP源碼包和contrib包

1、在 contrib-2.1.0\ports\freertos 取得sys_arch.c?/ .h??

2、移植到? LWIP_freeRTOS_yizhi工程中??Middlewares/lwip/arch

并在工程中,添加到分組和添加包含路徑

修改配置文件

?1,修改lwipopts.h

(目標:需要,符合帶操作系統的配置文件

因為基礎工程是用的裸機移植作為基礎,所以這個文件是用在裸機上的;所以需要更改找到stm提供的庫文件相關文件

FW_F4_V1.26.0\Projects\STM32469I_EVAL\Applications\LwIP \LwIP_HTTP_Server_Netconn_RTOS\Inc\? 路徑下的lwipopts.h替換本實驗的Middlewares\lwip\arch? ?lwipopts.h文件

ps:FW_F4_V1.26.0? ?stm官方資料包? ? ? ? ?

修改TCPIP的優先級 此處沒有實際的定義,所以改成5 如下

2、修改cc.h

(目標:注釋掉重復的變量

typedef int sys_prot_t”代碼注銷

3,修改lwip_comm.c/.h

(目標:刪除lwip_periodic_handle函數和修改lwip_comm_init 函數

1、刪除 lwIP 輪詢函數 lwip_periodic_handle

2、修改 lwip_comm_init 函數

?直接移植好的工程? 后期源碼分析;路徑:?Middlewares\lwip\arch

?4,修改ethernetif.c/h

(目標:修改為帶操作系統的網卡驅動

?修改low_level_init函數

修改 ethernetif_input函數

??直接移植好的工程? 后期源碼分析;路徑:?Middlewares\lwip\arch

1、創建任務ethernetif_input任務;

該任務獲取二值信號量,判斷是否接收到數據

然后在中斷函數中釋放;

2、ethernetif_input? 的相關中斷? 信號量釋放

釋放二值信號量,就是為了重復的操作

?5,修改ethrnet.c?

(目標:修改中斷優先級;修改中斷優先級,必須歸FreeRTOS內核管理

??直接移植好的工程? 后期源碼分析;路徑:?Drivers\BSP\ETHERNET

優先級為6? 子優先級0

相關中斷函數

6、修改文件stm32f407xx.h

此處是跟freeRTOS系統有關;

把無符號刪除,直接改為4

7、修改文件stm32f4xx_it.c

屏蔽如下函數,因為存在重復定義

1、SVC_Handler

2、PendSV_Handler

3、SysTick_Handler

8、修改文件malloc.h 修改SRAM內存大小

9、新建freertos_demo.c/.h文件:

User分組下,新建freertos_demo.c/.h文件、

freertos_demo.c:創建任務

freertos_demo.h:聲明入口函數

現在直接從好完成的工程中 移植? ?路徑:\User? ? ?后續源碼解析

10、main文件

現在直接從好完成的工程中 移植? ?路徑:\User? ? ?后續源碼解析

探索者/電機板三處不一樣需要修改

1、PHY復位引腳不一樣? ? 探索者:PA? 8? ? ?電機開發板 PA4

2、探索者pyh芯片:YT8512C??? ? ? ? 電機開發板芯片:PHY_TYPE

3、mac地址不一樣

LWIP帶FreeRTOS操作系統的啟動流程

啟動流程的原理,基本上和裸機移植的啟動原理流程一樣;除了裸機只能使用RAW限制外;

只不過添加了系統,觸發不一樣而已。比如二值信號量、創建任務等

1、函數?void tcpip_init(tcpip_init_done_fn initfunc, void *arg)

..\..\Middlewares\LWIP\src\api\tcpip.c??

/*** @ingroup lwip_os* Initialize this module:* - initialize all sub modules* - start the tcpip_thread** @param initfunc a function to call when tcpip_thread is running and finished initializing* @param arg argument to pass to initfunc*/
void
tcpip_init(tcpip_init_done_fn initfunc, void *arg)
{lwip_init();tcpip_init_done = initfunc;tcpip_init_done_arg = arg;if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) {  //創建一個郵箱LWIP_ASSERT("failed to create tcpip_thread mbox", 0);}
#if LWIP_TCPIP_CORE_LOCKINGif (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {   //創建一個互斥鎖LWIP_ASSERT("failed to create lock_tcpip_core", 0);}
#endif /* LWIP_TCPIP_CORE_LOCKING */sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);//創建一個線程
}

2、函數tcpip_thread? 任務

..\..\Middlewares\LWIP\src\api\tcpip.c

/*** The main lwIP thread. This thread has exclusive access to lwIP core functions* (unless access to them is not locked). Other threads communicate with this* thread using message boxes.** It also starts all the timers to make sure they are running in the right* thread context.** @param arg unused argument*/
static void
tcpip_thread(void *arg)
{struct tcpip_msg *msg;LWIP_UNUSED_ARG(arg);LWIP_MARK_TCPIP_THREAD();LOCK_TCPIP_CORE();if (tcpip_init_done != NULL) {tcpip_init_done(tcpip_init_done_arg);}while (1) {                          /* MAIN Loop */LWIP_TCPIP_THREAD_ALIVE();/* wait for a message, timeouts are processed while waiting */TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg);  //獲取一個消息  阻塞if (msg == NULL) {LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n"));LWIP_ASSERT("tcpip_thread: invalid message", 0);continue;}tcpip_thread_handle_msg(msg);//判斷消息類型   遞交網絡層   IP層	還是arp層}
}

3、添加網卡

..\..\Middlewares\LWIP\src\api\tcpip.c

函數一樣

4、tcpip_inpkt函數

/*** Pass a received packet to tcpip_thread for input processing** @param p the received packet* @param inp the network interface on which the packet was received* @param input_fn input function to call*/
err_t
tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)
{
#if LWIP_TCPIP_CORE_LOCKING_INPUTerr_t ret;LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_inpkt: PACKET %p/%p\n", (void *)p, (void *)inp));LOCK_TCPIP_CORE();ret = input_fn(p, inp);UNLOCK_TCPIP_CORE();return ret;
#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */struct tcpip_msg *msg;LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox));msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);if (msg == NULL) {return ERR_MEM;}msg->type = TCPIP_MSG_INPKT;msg->msg.inp.p = p;msg->msg.inp.netif = inp;msg->msg.inp.input_fn = input_fn;  //構建消息if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) {//用郵箱發送消息memp_free(MEMP_TCPIP_MSG_INPKT, msg);return ERR_MEM;}return ERR_OK;
#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903942.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

組網技術知識點

1.port-isloate enable命令用于實現兩個接口之間的二層數據隔離,三層數據互通。 2.交換機最多支持4096個VLAN,編號為1-4094 3.display bfd session all:查看BFD會話狀態是否UP 4.RJ45通過雙絞線連接以太網; AUI端口&#xff1…

Linux系統:進程程序替換以及相關exec接口

本節重點 理解進程替換的相關概念與原理掌握相關程序替換接口程序替換與進程創建的區別程序替換的注意事項 一、概念與原理 進程程序替換是操作系統中實現多任務和資源復用的關鍵機制,允許進程在運行時動態加載并執行新程序。 1.1 定義 進程程序替換是指用新程…

從此,K8S入門0門檻!

前言 當你想要入門K8S的時候,往往會被各種概念搞的暈乎乎的,什么API Server,Scheduler,Controller manager,Etcd,Pod,Kubelet,kube-proxy,deployment…… 哪怕你使用了…

[Python開發] 如何用 VSCode 編寫和管理 Python 項目(從 PyCharm 轉向)

在 Python 開發領域,PyCharm 一直是廣受歡迎的 IDE,但其遠程開發功能(如遠程 SSH 調試)僅在付費版中提供。為了適應服務器部署需求,很多開發者開始將目光轉向更加輕量、靈活且免費擴展能力強的 VSCode。本篇文章將詳細介紹,從 PyCharm 轉向 VSCode 后,如何高效搭建和管理…

處方流轉平臺權限控制模塊設計(基于RBAC模型)

這是基于筆者的一些經驗設計并加以完善的方案,僅供參考。 處方流轉平臺權限控制模塊設計(基于RBAC模型) 1. 需求分析 處方流轉平臺需要嚴格的權限控制,確保: 患者隱私數據保護處方開具、審核、調配、發藥等流程的合…

基于BM1684X+RK3588的智能工業視覺邊緣計算盒子解決方案

智能工業視覺邊緣計算終端技術方案書? ?1. 產品概述? 1.1 產品定位 面向工業自動化場景的高性能AI視覺處理設備集成BM1684X(8TOPS INT8)AI加速芯片 RK3588(6TOPS NPU)異構計算支持工業級多相機接入、實時缺陷檢測、高精度定…

軟件工程中的 QFD

: 軟件工程中的 QFD 在軟件工程領域,隨著市場競爭的加劇和用戶需求的日益復雜,如何有效地將用戶需求轉化為軟件產品,成為軟件開發團隊面臨的重要挑戰。而質量功能部署(Quality Function Deployment,QFD)作為一種強大的工具,為這一問題提供了有效的解決方案。 一、QF…

Vue2基礎速成

一、準備工作 首先下載vue2的JavaScript庫,并且命名為vue.min.js 下載鏈接:https://cdn.jsdelivr.net/npm/vue2(若鏈接失效可去vue官網尋找) CTRLS即可下載保存 文件目錄結構 二、使用操作原生DOM與使用VUE操作DOM的便捷性比較…

日語學習-日語知識點小記-構建基礎-JLPT-N4階段(14):かもしれません (~た?~ない)ほうがいいです

日語學習-日語知識點小記-構建基礎-JLPT-N4階段(14):かもしれません &(~た?~ない)ほうがいいです 1、前言(1)情況說明(2)工程師…

傳統銀行服務和 區塊鏈支付無縫融合的一種解決方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目標是重構全球銀行體系,并打造開放且無須許可的經營環境。”在 DeFi 的金融世界中,加密資產架構在區塊鏈上,通過各個協議實現資產之間的高效轉移和價值的實時流通,如 Metamask 錢包的自托管,Uniswap 的資產交易,…

基于深度學習的毒蘑菇檢測

文章目錄 任務介紹數據概覽數據處理數據讀取與拼接字符數據轉化標簽數據映射數據集劃分數據標準化 模型構建與訓練模型構建數據批處理模型訓練 文件提交結果附錄 任務介紹 本次任務為毒蘑菇的二元分類,任務本身并不復雜,適合初學者,主要亮點…

時間給了我們什么?

時間給了我們什么? ?春秋易逝,青春難留,轉瞬之間已過半百。 ?過往中,有得有失,這就是人生。 ?一日三餐四季,日起日落里,成就了昨天、今天和明天,在歷史長河中,皆是…

軟件工程國考

軟件工程-同等學力計算機綜合真題及答案 (2004-2014、2017-2024) 2004 年軟工 第三部分 軟件工程 (共 30 分) 一、單項選擇題(每小題 1 分,共 5 分) 軟件可用性是指( &#xff09…

數據結構*棧

棧 什么是棧 這里的棧與我們之前常說的棧是不同的。之前我們說的棧是內存棧,它是JVM內存的一部分,用于存儲局部變量、方法調用信息等。每個線程都有自己獨立的棧空間,當線程啟動時,棧就會被創建;線程結束&#xff0c…

IntelliJ IDEA 保姆級使用教程

文章目錄 一、創建項目二、創建模塊三、創建包四、創建類五、編寫代碼六、運行代碼注意 七、IDEA 常見設置1、主題2、字體3、背景色 八、IDEA 常用快捷鍵九、IDEA 常見操作9.1、類操作9.1.1、刪除類文件9.1.2、修改類名稱注意 9.2、模塊操作9.2.1、修改模塊名快速查看 9.2.2、導…

HTTP 快速解析

一、HTTP請求結構 HTTP請求和響應報文由以下部分組成(以請求報文為例): 請求報文結構: 請求行:包含HTTP方法(如GET/POST)、請求URL和協議版本(如HTTP/1.1,HTTP/2.0&…

【AI學習】李宏毅新課《DeepSeek-R1 這類大語言模型是如何進行「深度思考」(Reasoning)的?》的部分紀要

針對推理模型,主要講了四種方法,兩種不需要訓練模型,兩種需要。 對于reason和inference,這兩個詞有不同的含義! 推理時計算不是新鮮事,AlphaGo就是如此。 這張圖片說明了將訓練和推理時計算綜合考慮的關系&…

Kotlin Flow流

一 Kotlin Flow 中的 stateIn 和 shareIn 一、簡單比喻理解 想象一個水龍頭(數據源)和幾個水杯(數據接收者): 普通 Flow(冷流):每個水杯來接水時,都要重新打開水龍頭從…

【嵌入式Linux】基于ARM-Linux的zero2平臺的智慧樓宇管理系統項目

目錄 1. 需求及項目準備(此項目對于虛擬機和香橙派的配置基于上一個垃圾分類項目,如初次開發,兩個平臺的環境變量,阿里云接入,攝像頭配置可參考垃圾分類項目)1.1 系統框圖1.2 硬件接線1.3 語音模塊配置1.4 …

Linux運維中常用的磁盤監控方式

在Linux運維中,磁盤監控是一項關鍵任務,因為它能幫助我們預防磁盤空間不足或性能問題導致的服務中斷或數據丟失。讓我們來看看有哪些常用的磁盤監控方法吧! 1. 查看磁盤使用情況(df命令) df命令用于顯示文件系統的…