我使用了cubemx进行freertos工程的构建并且完成了基本的ping通任务。
因为我使用的是GCC的开发环境,因此是参照的官方LWIP的历程进行的MPU的配置,并且将历程中的ld文件直接复制过来了。
具体的情况如下,目测应该是使用的axi ram作为ram的开始, 然后将以太网的DMA分配到如下位置:
[C] 纯文本查看 复制代码
_estack = 0x24080000;
......
.lwip_sec (NOLOAD) : {
. = ABSOLUTE(0x30000000);
*(.RxDecripSection)
. = ABSOLUTE(0x30000200);
*(.TxDecripSection)
. = ABSOLUTE(0x30000400);
*(.Rx_PoolSection)
} >RAM_D2 AT> FLASH
在默认任务中我调用了udp_client_init()函数之前以为是任务空间小了的原因,因此给了4096,但是还是hardfault.......
[C] 纯文本查看 复制代码 void udp_client_init(void)
{
udp_client_task = sys_thread_new("udp_client", udp_client_thread, NULL, 4096, osPriorityNormal);
}
在任务函数中我经过调试发现在运行 netconn_send 函数处发生hardfault, 进去之后发现最后进入的入口每次都不一样...
任务函数如下,这个发送的一个数据包大概1416字节左右LARGE_BUF_SIZE=1416
[C] 纯文本查看 复制代码 uint8_t send_buf[LARGE_BUF_SIZE] = {0XFA, 0X5A, 0XA5, 0XAA, 0x00, 0x00, 0x88, 0x88, 0x01, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00}; //帧头就地初始化
static void udp_client_thread(void *arg)
{
err_t err;
ip_addr_t destipaddr;
struct netbuf *txBuf;
conn = netconn_new(NETCONN_UDP);
IP4_ADDR(&destipaddr, 192, 168, 2, 1);
err = netconn_bind(conn, IPADDR_ANY, 8090);
err = netconn_connect(conn, &destipaddr, 8080);
if (err == ERR_OK)
printf("connect succ\n");
for(;;)
{
if(send_flag)
{
// 构造数据并写入数组
...
txBuf = netbuf_new(); //控制块
netbuf_alloc(txBuf, send_size);
pbuf_take(txBuf->p, (const void *)send_buf, send_size);
err = netconn_send(conn, buf);
if (err != ERR_OK)
{
printf("send err\n");
}
vTaskDelay(1000);
netbuf_delete(txBuf);
}
}
}
由于官方给的历程中没有对发送的数组进行什么MPU配置, 因此我也就没有特别配置。后面专门试了一下, 找一块空地配置成没有WB和WA的NORMAL模式也不行。
MPU的环境如下:
就是和官方历程一模一样的,将DMA描述符那里设成Device模式,然后LWIP的heap区域设置成noncache的normal内存,并且禁用DTCM...
上述代码在F4的开发板中是可以完美运行的,但是扔到H7的上面就问题重重......我不清楚应该找哪一个地方的问题了,特此来请教硬汉和其它大哥们
|