使用CH32V307,用WCHNET,弄着弄着,有时候程序改动一下。在库初始化之后printf就没输出了,根本就没调用底层的_write,后来拿ETH_IAP例程,把基本功能给删了,就出现这样的情况。最后定位到把
u8 SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN];
注释掉就出问题(实际上已经没有代码使用这个变量,只是占了空间)。真搞不懂是哪里的问题。真是服了。
使用CH32V307,用WCHNET,弄着弄着,有时候程序改动一下。在库初始化之后printf就没输出了,根本就没调用底层的_write,后来拿ETH_IAP例程,把基本功能给删了,就出现这样的情况。最后定位到把
u8 SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN];
注释掉就出问题(实际上已经没有代码使用这个变量,只是占了空间)。真搞不懂是哪里的问题。真是服了。
再仔细试了一下,这个变量换个名字也不行。看了一下map文件,好像在
__attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM]; 后面占用位置的才生效。然后我把这个大小改为
__attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM*4];才正常。所以,是不是库0x10例子里面定义的库需要的变量大小有问题。
__attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB]; /* MAC接收描述符 ,4字节对齐*/ __attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB]; /* MAC发送描述符,4字节对齐 */ __attribute__((__aligned__(4))) u8 MACRxBuf[ETH_RXBUFNB*ETH_MAX_PACKET_SIZE]; /* MAC接收缓冲区,4字节对齐 */ __attribute__((__aligned__(4))) u8 MACTxBuf[ETH_TXBUFNB*ETH_MAX_PACKET_SIZE]; /* MAC发送缓冲区,4字节对齐 */ __attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM]; /* Socket信息表,4字节对齐 */ const u16 MemNum[8] = {WCHNET_NUM_IPRAW, WCHNET_NUM_UDP, WCHNET_NUM_TCP, WCHNET_NUM_TCP_LISTEN, WCHNET_NUM_TCP_SEG, WCHNET_NUM_IP_REASSDATA, WCHNET_NUM_PBUF, WCHNET_NUM_POOL_BUF }; const u16 MemSize[8] = {WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IPRAW_PCB), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_UDP_PCB), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB_LISTEN), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_SEG), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IP_REASSDATA), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(0), WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_POOL_BUF) }; __attribute__((__aligned__(4)))u8 Memp_Memory[WCHNET_MEMP_SIZE]; __attribute__((__aligned__(4)))u8 Mem_Heap_Memory[WCHNET_RAM_HEAP_SIZE]; __attribute__((__aligned__(4)))u8 Mem_ArpTable[WCHNET_RAM_ARP_TABLE_SIZE];
您好,SocketRecvBuf是定义的协议栈的接收缓冲区,这个使用是在协议栈内部调用的。eth_driver.c下面的__attribute__定义的一些变量名称不建议修改,否则会出现Lib库里面一些变量未定义的编译错误或者无法执行的问题。