大佬确实是的,今天上午在App中把lwip的完整功能实现完,打包成bin,以为可以完工开始下一个阶段了,又报错了。一跳转就进入hardfualt,以为是eth的dma的问题,把rtx和tx、rx都清了也不行
[C] 纯文本查看 复制代码 extern ARM_DRIVER_ETH_MAC Driver_ETH_MAC0;
extern ARM_DRIVER_ETH_PHY Driver_ETH_PHY0;
static void lwip_deinit(){
// 停止所有的连接(tcp udp等),我只使用了tcp
struct tcp_pcb *pcb = tcp_active_pcbs;
while (pcb) {
tcp_abort(pcb);
pcb = pcb->next;
}
// 清理ARP/DNS缓存
// 关闭网络接口
netif_set_down(&netif);
netif_remove(&netif);
netif_default = NULL;
// 网口复位
// 清空tx和rx
Driver_ETH_MAC0.Control(ARM_ETH_MAC_FLUSH, ARM_ETH_MAC_FLUSH_TX | ARM_ETH_MAC_FLUSH_RX);
Driver_ETH_MAC0.Control(ARM_ETH_MAC_CONTROL_RX, DISABLE);
Driver_ETH_MAC0.Control(ARM_ETH_MAC_CONTROL_TX, DISABLE);
Driver_ETH_PHY0.PowerControl(ARM_POWER_OFF);
Driver_ETH_MAC0.PowerControl(ARM_POWER_OFF);
Driver_ETH_PHY0.Uninitialize();
Driver_ETH_MAC0.Uninitialize();
// Driver_ETH_PHY0.PowerControl(ARM_POWER_FULL);
// Driver_ETH_MAC0.PowerControl(ARM_POWER_FULL);
}
static void RTX5_Exit_Cleanup(void) {
// 锁调度
osKernelLock();
/* 终止所有动态线程 */
osThreadId_t thread_list[10];
int32_t thread_count = osThreadEnumerate(thread_list, 20);
for (int i = 0; i < thread_count; i++) {
// 除了刚刚建立、刚刚消失和本线程,其他都终止
if (osThreadGetState(thread_list[i]) != osThreadInactive || osThreadGetState(thread_list[i]) != osThreadRunning) {
osThreadTerminate(thread_list[i]);
}
}
// 回收消息队列
osMessageQueueDelete(flash_queue);
osMessageQueueDelete(flash_msg_queue);
// 回收对象内存池
osMemoryPoolDelete(iap_mem_pool);
}
又错了看cfsr中是0x00000100,抓到信息如下
[C] 纯文本查看 复制代码 [BootJump] 准备跳转[BootJump] 准备跳转,Addr = 0x08020000
[BootJump] 目标APP初始MSP = 0x20011EE8
[BootJump] 目标APP复位地址 = 0x0802019D
cfsr : 0x00000100
msp : 0x20011eb8
pc : 0x00edf643
cfsr : 0x00000100
msp : 0x20011eb8
pc : 0x00e5f643 |