被神奇的printf搞到头晕了。

使用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库里面一些变量未定义的编译错误或者无法执行的问题。


只有登录才能回复,可以选择微信账号登录