最近在學習物聯(lián)網(wǎng)相關的知識,打算用ST的開發(fā)板STM32F407ZGT6作為控制中心,上面搭載FreeROTS實時系統(tǒng),STM32F407開發(fā)板作為 TCP client,網(wǎng)絡調(diào)試助手作為TCP server,利用串口獲取兩者的連接狀態(tài)。在用原子的lwip工程移植到自己的STM32F407開發(fā)板時,可以正常獲取DHCP分配的IP,也能通過網(wǎng)絡和網(wǎng)絡工具正常通信,但是串口一直提示錯誤:
從port.c文件中,定位到該行。
從文件中來看,應該是和中斷有關的,從網(wǎng)上查閱了很多資料發(fā)現(xiàn),首先懷疑串口的中斷的優(yōu)先級超過FreeRTOS的管理最高優(yōu)先級,需要將串口中斷的優(yōu)先級降為FreeRTOS的管理最高優(yōu)先級以下就可以。
據(jù)此,分別確認以下中斷配置:主函數(shù)中,(1)系統(tǒng)中斷優(yōu)先級分組,位于main.c文件(2)串口中斷,位于usart.c文件(3)FreeRTOS系統(tǒng)可以管理的中斷最高優(yōu)先級,位于freertosconfig.h文件
可以發(fā)現(xiàn),串口中斷的優(yōu)先級為3,freeRTOS最大可管理的中斷優(yōu)先級是5(中斷級小于等于5,freeRTOS無法管理),中斷優(yōu)先級更改為6,發(fā)現(xiàn)不行。再繼續(xù)查閱資料。
發(fā)現(xiàn)在ethernetif.c源碼中,low_level_input中有一個pbuf_alloc,而源碼中恰恰有sys_arch.c的sys_arch_protect()和sys_arch_unprotect()的臨界保護
而low_level_input是在中斷中調(diào)用的。
發(fā)現(xiàn)參考DEMO的sys_arch.c中的sys_arch_protect()和sys_arch_unprotect()是使用的任務級的臨界保護,所以芯片會出現(xiàn)未知的異常。
發(fā)現(xiàn)編譯下載到板卡中,串口還是會出現(xiàn)同樣的問題。
此外sys_mbox_trypost也要用中斷級入隊函數(shù)。
修改后,重新編譯下載,串口打印ok.
出現(xiàn)這個問題應該就是在中斷中調(diào)用了任務級臨界保護,建議逐條查看中斷中調(diào)用的函數(shù)中是否用到了任務級臨界保護。
-
FreeRTOS
+關注
關注
12文章
484瀏覽量
62344 -
LwIP協(xié)議
+關注
關注
0文章
11瀏覽量
8942 -
串口中斷
+關注
關注
0文章
67瀏覽量
13979 -
DHCP網(wǎng)絡
+關注
關注
0文章
2瀏覽量
4936 -
STM32F407ZGT6
+關注
關注
4文章
4瀏覽量
4866
發(fā)布評論請先 登錄
相關推薦
評論