CH32V307 以太網(wǎng)接近滿速后,幾秒或幾十秒后就死機(jī)

?CH32V307內(nèi)置PHY,使用RT Thread? 系統(tǒng),其它全部采用默認(rèn)配置,主任務(wù)只有一個(gè)以太網(wǎng)任務(wù),不管是只接收、只發(fā)送、回傳,數(shù)據(jù)量大了(接近滿速)后,幾秒或幾十秒后就死機(jī)。

請(qǐng)幫忙分析是什么問題,謝謝。



代碼:

while(1)
????{
????????rt_thread_delay(500);???//*?wait?eth?phy?enable

????????host?=?(struct?hostent*)gethostbyname(url);

????????serveraddr.sin_family?=?AF_INET;
????????serveraddr.sin_port?=?htons(port);
????????serveraddr.sin_addr?=?*((struct??in_addr?*)host->h_addr);
????????rt_memset(&(serveraddr.sin_zero),?0,?sizeof(serveraddr.sin_zero));

????????if((sock=socket(AF_INET,SOCK_STREAM,0))?==?-1)
????????{
????????????rt_kprintf("Socket?error?sock=%d\n",sock);
????????????break;
????????}

????????if?(connect(sock,?(struct?sockaddr?*)&serveraddr,?sizeof(struct?sockaddr))?==?-1)
????????{
????????????rt_kprintf("Connect?fail!\n");
????????????closesocket(sock);
????????????continue;
????????}
????????else
????????{
????????????rt_kprintf("Connect?sock_%d??successful\n",sock);
????????}

????????while(1)
????????{
????????????/*bytes_received?=?recv(sock,?rx_buffer,?sizeof(rx_buffer)?-?1,?0);

????????????if?(bytes_received?<?0)
????????????{
????????????????//?receive?timeout,?continue?the?receiving?of?next?socket
????????????????break;
????????????}

????????????else?{
????????????????rx_buffer[bytes_received]?=?0;
????????????}*/
???????????//int?err?=?send(sock,?rx_buffer,?strlen(rx_buffer),?0);
????????????int?err?=?send(sock,?rx_buffer,?100,?0);
????????????//rt_thread_mdelay(100);
????????????if?(err?<?0)?{
????????????????rt_kprintf("Error?occurred?during?sending:?errno?%?.\r\n",?err);
????????????????rt_kprintf("Shutting?down?socket?and?restarting...");
???????????????//?shutdown(sock,?0);
????????????????closesocket(sock);
????????????????rt_thread_mdelay(1000);
????????????????break;
????????????}
????????}

????}
打印信息,但經(jīng)常不完整。
?\?|?/
-?RT?-?????Thread?Operating?System
?/?|?\?????4.0.4?build?Mar?25?2022
?2006?-?2021?Copyright?by?rt-thread?team
lwIP-2.1.2?initialized!
MCU:?CH32V307
SysClk:?144000000Hz
msh?>Connect?fail!
Connect?fail!
Connect?sock_0??successful
state!
Assertion:?1836?in?../rt-thread/components/net/lwip-2.1.2/src/api/api_msg.c,?thread?etx
?hardfult
mepc:0bd3fca8
mcause:00000001
mtval:0bd3fca8


LWIP 配置

image.png


測速速度

image.png

您好,您可以嘗試以下幾個(gè)方法:

  1. 您可以在死機(jī)時(shí),PING? ?CH32V307的IP地址,看看能否PING通,來鑒別協(xié)議棧是否還在正常處理

  2. 您可以在以太網(wǎng)的線程里面加打印調(diào)試,看任務(wù)是否正常運(yùn)行

  3. 您可以在芯片HardFault中斷里面加打印,看芯片在“死機(jī)”時(shí),是否有進(jìn)入HardFault中斷。


/*******************************************************************************
*?Function?Name??:?HardFault_Handler
*?Description????:?This?function?handles?Hard?Fault?exception.
*?Input??????????:?None
*?Return?????????:?None
*******************************************************************************/
void?HardFault_Handler(void)
{
????GET_INT_SP();
????rt_interrupt_enter();
????rt_kprintf("?hardfult\r\n");
????rt_kprintf("mepc:%08x\r\n",__get_MEPC());
????rt_kprintf("mcause:%08x\r\n",__get_MCAUSE());
????rt_kprintf("mtval:%08x\r\n",__get_MTVAL());
????while(1);
????rt_interrupt_leave();
????FREE_INT_SP();
}

從打印信息,明顯是進(jìn)入了HardFault_Handler,此時(shí)協(xié)議棧及串口都停止了


您好,您可以看一下此時(shí)硬件錯(cuò)誤中斷的打印值,看是否是內(nèi)存管理等原因?qū)е碌摹?/p>


我想知道,這幾個(gè)是什么含義,我也遇見此問題。

? ??rt_kprintf("mepc:%08x\r\n",__get_MEPC());
????rt_kprintf("mcause:%08x\r\n",__get_MCAUSE());
????rt_kprintf("mtval:%08x\r\n",__get_MTVAL());



您好,mepc、mcause、mtval均為CSR寄存器,其中,mepc寄存器值為當(dāng)前遇到異常時(shí)的指令 PC 值,或中斷前下一條預(yù)執(zhí)行的指令 PC 值,退出異?;蛑袛嗪笪⑻幚砥鞯姆祷氐刂繁4嬖趍epc中。mcause寄存器值為當(dāng)前異常種類或中斷編號(hào)值,可以通過該值查看引起異常的原因或判斷中斷的來源。mtval寄存器值主要反映引起當(dāng)前異常的存儲(chǔ)器訪問地址或指令編碼,當(dāng)進(jìn)入異常和中斷時(shí),硬件將自動(dòng)更新mtval的值。關(guān)于這三個(gè)CSR寄存器的具體介紹,可參考我們QingKeV4微處理器手冊(cè),手冊(cè)下載鏈接如下:

http://m.findthetime.net/downloads/QingKeV4_Processor_Manual_PDF.html

?


謝謝你,TECH62。socket每1秒收發(fā)一次數(shù)據(jù),運(yùn)行一會(huì)兒就進(jìn)入硬件故障中斷了(可能幾分鐘,可能十幾分鐘)


中斷函數(shù):

void HardFault_Handler(void)

{

? ? GET_INT_SP();

? ? rt_interrupt_enter();

? ? rt_kprintf(" hardfult\r\n");

? ? rt_kprintf(" %s\r\n", rt_thread_self()->name);

? ? rt_kprintf("mepc:%08x\r\n",__get_MEPC());

? ? rt_kprintf("mcause:%08x\r\n",__get_MCAUSE());

? ? rt_kprintf("mtval:%08x\r\n",__get_MTVAL());

? ? while(1);

? ? //NVIC_SystemReset(); // 硬件錯(cuò)誤就重啟模塊

? ? rt_interrupt_leave();

? ? FREE_INT_SP();

}


輸出:

?hardfult

?tcpip

mepc:706e7074

mcause:00000002(異常?保留?)

mtval:00000000


對(duì)應(yīng)文檔:

企業(yè)微信截圖_1651050411662.png


您好,mepc的值為706e7074說明異常的返回地址為706e7074,這個(gè)已經(jīng)超出了我們FLASH的地址范圍,地址溢出了;mcause的值為2,說明是非法指令導(dǎo)致異常;mtval的值為00000000,即非法指令的指令編碼為00000000。導(dǎo)致異常的原因可能是內(nèi)存地址溢出了,訪問越界了,可檢查以下程序中是不是定義的數(shù)組長度不夠?qū)е碌?,或查看一下?shù)組下標(biāo)是否越界。后續(xù)若有問題,可通過郵箱和我溝通(lzs@wch.cn)。


我這邊也遇到了同樣的問題,V307+RTT+LWIP,即使不創(chuàng)建任何任務(wù),僅僅在main里電燈,后臺(tái)依然會(huì)報(bào)出硬件錯(cuò)誤,PC指針會(huì)指向非法地址。


下面是報(bào)錯(cuò)信息和源碼

1652329929195598.png

1652329929135083.png

1652329929113196.png

1652329930265627.png



您好,可以看一下8樓的分析,根據(jù)打印的信息,感覺你的問題和那個(gè)差不多。若方便,可以將你的程序發(fā)到我的郵箱(lzs@wch.cn),這邊看一下。


源工程已發(fā)至lzs@wch.cn,目前工程基于RT Thread Studio下的CH32V307工程創(chuàng)建:打開LWIP,創(chuàng)建呼吸燈線程,鏈接腳本修改RAM大小至128K。

目前調(diào)試進(jìn)展:打開RTT的內(nèi)存跟蹤和堆棧溢出檢測后,插上網(wǎng)線后,穩(wěn)定復(fù)現(xiàn)stack overflow,因此hardfault確實(shí)是由于堆棧溢出導(dǎo)致的,但溢出原因未明。

調(diào)試截圖:

1652405290681596.png

1652405290200572.png

1652405290528762.png




不知道前面的幾位有解決這個(gè)問題嗎。雖然我已經(jīng)切換至裸機(jī)開發(fā)了,但我還是想用rt-thread開發(fā)。


移植cherryUSB的過程中,也是莫名會(huì)進(jìn)入hardfult,后來發(fā)現(xiàn)是空閑線程的stack size太小了,增大后沒有出現(xiàn)了


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频