Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread发布
应用模块unload成功但是应用模块还在运行
发布于 2012-10-21 01:51:49 浏览:5097
订阅该版
RT-Thread 1.10版,内核从realtauch的第2353版本里取得,自己创建了一个STM32F103VE的工程,系统运行没有问题,SD卡的FAT32文件系统也测试过没有问题。 1、我做了一个简单的通过串口更新正在运行的模块,具体做法是这样的:当串口收到命令后首先将文件系统中已存在的文件删除掉,创建并开始接收新的文件,接收完毕卸载应用模块,最后加载更新过的应用模块。但是测试时,出现unload成功了,但是模块还继续运行。 ``` /* suspend module main thread */ if (module->module_thread != RT_NULL) { if (module->module_thread->stat == RT_THREAD_READY) rt_thread_suspend(module->module_thread); }``` 我是怀疑这里有问题,模块的线程如果处于运行态,是不是这里就会有问题呢? 2、模块文件由于偶尔的传输错误,加载后会引发系统崩溃,这个问题比较棘手,是不是这种保证文件的完整性要自己做呢?
查看更多
9
个回答
默认排序
按发布时间排序
bernard
2012-10-21
这家伙很懒,什么也没写!
1. 这个我也没试过,正打算让ART连上wifi后一起尝试。 2. 这个是需要自己来保证的,不过系统应该加入这个模块出错而全部卸载这个模块的功能的。
shaolin
2012-10-21
这家伙很懒,什么也没写!
1 可以在怀疑有问题的这段代码上加些打印信息来确认下,看卸载的时候是否执行到这儿。 2 这部分可以加入 CRC 校验或者其他方式来保证应用模块是完整无误的。
haitao52198
2012-10-21
这家伙很懒,什么也没写!
``` /* delete threads */ list = &module->module_object[RT_Object_Class_Thread].object_list; while (list->next != list) { object = rt_list_entry(list->next, struct rt_object, list); if (rt_object_is_systemobject(object) == RT_TRUE) { /* detach static object */ rt_thread_detach((rt_thread_t)object); } else { /* delete dynamic object */ rt_thread_delete((rt_thread_t)object); rt_kprintf("delete dynamic object is %s ", object->name); } } ``` 卸载模块的时候,这里while直接就跳过去,没有执行到,是不是这里有问题?这块代码比较复杂,暂时没找到问题
haitao52198
2012-10-21
这家伙很懒,什么也没写!
>1. 这个我也没试过,正打算让ART连上wifi后一起尝试。 >2. 这个是需要自己来保证的,不过系统应该加入这个模块出错而全部卸载这个模块的功能的。 --- ``` /** * Application Module structure */ struct rt_module { struct rt_object parent; /**< inherit from object */ rt_uint8_t *module_space; /**< module memory space */ void *module_entry; /**< entry address of module's thread */ rt_thread_t module_thread; /**< stack size of module's thread */ rt_uint32_t stack_size; /**< priority of module's thread */ rt_uint32_t thread_priority; #ifdef RT_USING_SLAB /* module memory allocator */ void *mem_list; /**< module's free memory list */ void *page_array; /**< module's using pages */ rt_uint32_t page_cnt; /**< module's using pages count */ #endif rt_uint32_t nsym; /**< number of symbol in the module */ struct rt_module_symtab *symtab; /**< module symbol table */ rt_uint32_t nref; /**< reference count */ /* object in this module, module object is the last basic object type */ struct rt_object_information module_object[RT_Object_Class_Unknown]; }; typedef struct rt_module *rt_module_t; ``` struct rt_object_information module_object[RT_Object_Class_Unknown]; 这里的RT_Object_Class_Unknown是不是应该为RT_Object_Class_Module才对啊?
haitao52198
2012-10-21
这家伙很懒,什么也没写!
struct rt_object_information module_object[RT_Object_Class_Unknown]; 这里没有问题,理解错了。
haitao52198
2012-10-25
这家伙很懒,什么也没写!
这个问题已经解决了,需要再测试看看有没有问题。 要在unload里如下位置添加删除线程的语句 ``` if (module->module_thread != RT_NULL) { if (module->module_thread->stat == RT_THREAD_READY) { rt_thread_suspend(module->module_thread); } rt_thread_delete(module->module_thread); } ``` 在unload的return前 将如下指针清零,否则,调度器里会通过thread->module_id将线程再次复活进行,因为线程的状态已经是close了,会在idel线程再次调用unload函数第二次卸载,由于已经释放过了资源,第二次释放就会死掉。 ``` module->module_thread->module_id= RT_NULL; module = RT_NULL; ```
shaolin
2012-10-26
这家伙很懒,什么也没写!
赞,这下对 module 运行机制应该比较清楚了吧。 或者是否能考虑在 unload 时只给 module 设置上关闭标志,在 IDLE 线程中将模块彻底删除;
haitao52198
2012-10-26
这家伙很懒,什么也没写!
>赞,这下对 module 运行机制应该比较清楚了吧。 >或者是否能考虑在 unload 时只给 module 设置上关闭标志,在 IDLE 线程中将模块彻底删除; --- 1、对于模块的主线程看明白了,不过这块对于ELF格式还不清楚,最近有时间看看相关资料。我知道主线程要等到子线程都移除之后才能卸载,还没仔细研究这块有没有问题,只是主线程可以了。 2、如果考虑unload后因为里面调用了删除线程的函数,就是把线程的状态标记为close了,然后直接释放了一些资源,等到idle里再从僵尸队列移除继续释放资源,unload时,会将一些状态清除,在idle里模块卸载部分都判断是否已经清除过。这样模块主动退出时也是可以在idle里正常调用unload卸载。 总的来说 这块涉及的知识还是挺多的
撰写答案
登录
注册新账号
关注者
0
被浏览
5.1k
关于作者
haitao52198
这家伙很懒,什么也没写!
提问
42
回答
260
被采纳
0
关注TA
发私信
相关问题
1
RT-Thread单内核v0.2.2正式版
2
[发布] RT-Thread RTOS v0.2.3版本
3
RT-Thread 0.3.0 beta
4
RT-Thread/STM32 0.3.0 RC1发布
5
RT-Thread/LM3S 0.3.0 RC1版发布
6
建议弄个MIPS版本的。龙芯上用。
7
开源实时操作系统RT-Thread 0.3.0正式版发布
8
关于RT-THREAD的UDP讨论
9
这里是BUG回报板块!
10
rt-thread stm32 0.3.0 rc1 网络问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
Rt-thread中OTA下载后,bootloader不搬程序
2
ulog 日志 LOG_HEX 输出时间改为本地日期时间
3
在RT-Thread Studio中构建前执行python命令
4
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
5
CherryUSB开发笔记(一):FSDEV USB IP核的 HID Remote WakeUp (USB HID 远程唤醒) 2025-01-18 V1.1
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
5
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
张世争
1
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部