Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
mo动态模块_Module
应用模块的rt_module_unload函数的bug
发布于 2015-01-29 10:13:58 浏览:3398
订阅该版
从1431行开始: ``` 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); } } ``` 由于list在循环里面从来没有更新过值,如果存在子线程的话,就直接死循环了。可以改为: ``` list = &module->module_object[RT_Object_Class_Thread].object_list; while (list->next != &module->module_object[RT_Object_Class_Thread].object_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); } list = list->next; } ``` 当然,我比较常规的写法倒是: ``` struct rt_list_node *node; list = &module->module_object[RT_Object_Class_Thread].object_list; node = list->next; while (node != list) { object = rt_list_entry(node, 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); } node = node->next; } ```
查看更多
4
个回答
默认排序
按发布时间排序
bernard
2015-01-29
这家伙很懒,什么也没写!
你试过了吗?好像有些问题
eddy0317
2015-01-29
这家伙很懒,什么也没写!
细看一下,module释放对象都是用下面这种结构: [code] list = &module->module_object[对象类型].object_list; while (list->next != list) { object = rt_list_entry(list->next, struct rt_object, list); if (rt_object_is_systemobject(object) == RT_EOK) { /* detach static object */ detach(object); } else { /* delete dynamic object */ delete(object); } } [/code] 仔细想一下,按道理的确是正确的。那为什么有问题呢? 仔细看了一下代码,rt_thread_delete里面没有调用rt_object_delete,而rt_thread_detach里面有调用rt_object_detach。估计就是这个问题了。没有rt_object_delete,导致对象链表没有remove这个object。导致死循环了。 而且,细看一下也发现另一个问题: 1227行应该将RT_Object_Class_Thread改为RT_Object_Class_Semaphore。估计是复制过来时候的疏忽? 至于原来的问题,是否在rt_thread_delete里面加上rt_object_delete解决?这个因为对内核还不是很熟悉,不敢加这里。麻烦高手们提供一下建议,我先在module里面加上调试……
eddy0317
2015-01-29
这家伙很懒,什么也没写!
刚试了一下,这里不能直接rt_object_delete。看来是要用我原来那个方法了?原来的方法如果有静态对象,好像也会有问题。
撰写答案
登录
注册新账号
关注者
0
被浏览
3.4k
关于作者
eddy0317
这家伙很懒,什么也没写!
提问
9
回答
10
被采纳
0
关注TA
发私信
相关问题
1
貌似stm32f10x的应用模块在1.2.x版本不能正常编译
2
应用模块打开之后unload之后还在内存中
3
关于module.c的_load_shared_object的疑问
4
rtt 如何实现动态加载app
5
使用zmodem传输文件,应用模块文件传输完成,访问失败
6
RTT下应用模块编译具体方法
7
RTT应用模块编译出错
8
RTT应用模块编译问题
9
求问动态模块是什么意思呢
10
应用模块编译出问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
ulog组件多端绑定的demo案例
2
记录rt-thread消息队列的调试方法
3
AT32的ADC使用
4
aht10 终端:The aht10 is under an abnormal status
5
github高阶加速,速度可达带宽峰值,测试到146Mbit/s
热门标签
RT-Thread Studio
串口
LWIP
Env
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
RT-Thread
DMA
SCons
线程
MQTT
RT-Thread Nano
STM32
RTC
rt-smart
ESP8266
flash
ota在线升级
WIZnet_W5500
FAL
I2C
packages_软件包
UART
cubemx
freemodbus
潘多拉开发板_Pandora
定时器
BSP
PWM
ADC
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
SDIO
Debug
AB32VG1
MicroPython
编译报错
C++_cpp
msh
ulog
QEMU
本月问答贡献
出出啊
1501
个答案
338
次被采纳
小小李sunny
1390
个答案
276
次被采纳
张世争
715
个答案
157
次被采纳
crystal266
522
个答案
153
次被采纳
whj467467222
1216
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
12
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
2
篇文章
2
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部