Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread发布
应用模块unload成功但是应用模块还在运行
发布于 2012-10-21 01:51:49 浏览:5092
订阅该版
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 小内存算法源码分析
2
env中添加lvgl软件包后,keil编译包--c99错误
3
【NXP-MCXA153】 定时器驱动移植
4
GD32F450 看门狗驱动适配
5
【NXP-MCXA153】看门狗驱动移植
热门标签
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
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
5
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
11
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部