硬汉嵌入式论坛

 找回密码
 立即注册
查看: 237|回复: 5
收起左侧

[CMSIS-RTOS] 基于Lwip和RTX5的iap升级问题,怎么deinit lwip

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2025-4-9 22:53:25 | 显示全部楼层 |阅读模式
在使用iap跳转,在跳转到用户区时,如果我把在用户程序中把网络相关的线程注释掉,是可以跳转的。一旦打开网络相关的线程和程序就跳转不了了,猜想应该是Lwip的状态没有恢复到初始的样子


微信截图_20250409225153.png
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-4-9 23:09:16 来自手机 | 显示全部楼层
大佬们救救孩子吧
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-4-10 13:33:19 | 显示全部楼层
        // 硬件复位
        Driver_ETH_MAC0.Uninitialize();
        Driver_ETH_PHY0.Uninitialize();
找到了,在转跳需要对phy、mac等进行复位
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-4-11 12:10:33 | 显示全部楼层
pyz13 发表于 2025-4-10 13:33
// 硬件复位
        Driver_ETH_MAC0.Uninitialize();
        Driver_ETH_PHY0.Uninitialize();

这个只是复位了MAC和PHY,LWIP本身没有对应的复位API
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-4-11 18:06:33 | 显示全部楼层
eric2013 发表于 2025-4-11 12:10
这个只是复位了MAC和PHY,LWIP本身没有对应的复位API

大佬确实是的,今天上午在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
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2025-4-11 20:54:38 | 显示全部楼层
        uint32_t offset = i * IAP_PACKET_MAXLAN;
        uint32_t current_len = (i == num_packets - 1) ? (len - offset) : IAP_PACKET_MAXLAN;
        packet->length = current_len;
找到错误了,这里原来用的uint16,越界了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 00:42 , Processed in 0.368671 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表