Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
删除线程
动态线程
碰见一个超级奇怪的问题,我线程执行完任务后,把它删除,但是调试的时候,把打印关了就会报错,打开调试就不会报错
发布于 2024-10-28 15:11:14 浏览:214
订阅该版
任务里面的函数都是空的,我全注释了,就是打开了两个信号量和三个线程,第一个信号量是触碰按键,然后开始创建测试模块的线程,第二个信号量是用来控制管理创建线程的,只有模块的测试线程接收,并删除了该线程,才释放信号量,然后管理线程得到信号量在创建信号量,问题是我调试的时候,把rt_kprintf("22222\n");注释就会报错,打开就没事,百思不得其解。 ```c ##include "myhead.h" //定义信号量的句柄 rt_sem_t dynamic_sem = RT_NULL; rt_sem_t lvgl_test_sem = RT_NULL; static rt_thread_t manager_thread; void drv_servo_lvgl_set(void) { rt_sem_release(lvgl_test_sem); //lv_label_set_text(guider_ui.screen_servo_label_sw4, "begin"); } void test_current_entry(void *parameter) { rt_uint32_t select_mode; // select_mode = (rt_uint32_t)parameter; while(1) { if(select_mode == 0) { static_ele_pwm(); goto err; } else{ static_ele_serial(); goto err; } err: //rt_kprintf("22222\n"); //rt_thread_mdelay(1000); rt_sem_release(dynamic_sem); //释放信号量 rt_thread_t get_threadid =rt_thread_self(); rt_thread_delete(get_threadid); //rt_thread_mdelay(100); } } void test_voltage_entry(void *parameter) { rt_uint32_t select_mode; select_mode = (rt_uint32_t)parameter; while(1) { // if(select_mode == 0) // { // static_ele_pwm(); // goto err; // } // else{ // // static_ele_serial(); // goto err; // } // // err: // rt_sem_release(dynamic_sem); //释放信号量 // rt_thread_t get_threadid =rt_thread_self(); // rt_thread_delete(get_threadid); rt_kprintf("33333\n"); rt_thread_mdelay(1000); } } test_module_t test_modules[TEST_MODULE_NUMBER] = { {test_current_entry, "current_thread",RT_NULL}, {test_voltage_entry, "voltage_thread",RT_NULL}, //添加更多测试模块... }; static void manager_thread_entry(void *parameter) { while(1){ rt_sem_take(lvgl_test_sem, RT_WAITING_FOREVER); // rt_kprintf("1111\n"); //rt_sem_delete(lvgl_test_sem); for (int i = 0; i < TEST_MODULE_NUMBER; i++) { rt_thread_t thread = rt_thread_create(test_modules[i].thread_name, test_modules[i].entry_func, test_modules[i].parameter, 1024, // 线程栈大小 25, // 线程优先级 10); // 时间片 if (thread != RT_NULL) { rt_thread_startup(thread); } else { rt_kprintf("Failed to create thread for module %s\n", test_modules[i].thread_name); } rt_sem_take(dynamic_sem, RT_WAITING_FOREVER); // 等待线程完成(这里可以添加同步机制,例如使用事件或者信号量) rt_thread_mdelay(1000); // 假设每个线程执行时间不超过1100ms } rt_thread_t get_threadid =rt_thread_self(); rt_thread_delete(get_threadid); rt_kprintf("All test modules have been executed.\n"); } } int Ps_Create_Init(void) { lv_label_set_text(guider_ui.screen_servo_label_sw4, "begin"); dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO); //创建线程信号量 if (dynamic_sem == RT_NULL) { rt_kprintf("create dynamic semaphore failed.\n"); return -1; } lvgl_test_sem = rt_sem_create("lvgl_sem", 0, RT_IPC_FLAG_PRIO); //创建lvgl的ui界面信号里 if (lvgl_test_sem == RT_NULL) { rt_kprintf("create dynamic semaphore failed.\n"); return -1; } // 创建管理线程 manager_thread = rt_thread_create("manager_thread", manager_thread_entry, RT_NULL, 1024, // 栈大小 20, // 优先级 10); // 时间片 if (manager_thread != RT_NULL) { rt_thread_startup(manager_thread); } return 0; } INIT_APP_EXPORT(Ps_Create_Init); ``` ![企业微信截图_17300994341297.png](https://oss-club.rt-thread.org/uploads/20241028/0ce09eddd48216be063a751db95ce713.png)
查看更多
踩姑娘的小蘑菇
2024-10-31
这家伙很懒,什么也没写!
不用的线程直接退出while(1)循环即可,不需要调用delete,idle会自动执行回收释放资源 重复删除是因为delete也并没有释放资源,需要进入idle释放,但线程1并没有释放cpu操作,就运行不到idle,删除线程和其他操作就会重复执行 贴上官方文档的描述: > 注:关于删除线程:大多数线程是循环执行的,无需删除;而能运行完毕的线程,RT-Thread 在线程运行完毕后,自动删除线程,在 rt_thread_exit() 里完成删除动作。用户只需要了解该接口的作用,不推荐使用该接口(可以由其他线程调用此接口或在定时器超时函数中调用此接口删除一个线程,但是这种使用非常少)。
3
个回答
默认排序
按发布时间排序
红枫
认证专家
2024-10-28
这家伙很懒,什么也没写!
#### 释放空指针信号量?使用前未做初始化的指针就是野指针。对野指针进行赋值操作多半会系统崩溃。
qq1078249029
2024-10-30
这家伙很懒,什么也没写!
104行提到95行之前,或者在释放信号量的时候加个延时。时间过短会执行不到 rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);直接被调度器跳到void test_current_entry(void \*parameter)函数执行
撰写答案
登录
注册新账号
关注者
0
被浏览
214
关于作者
zyy_
这家伙很懒,什么也没写!
提问
8
回答
2
被采纳
0
关注TA
发私信
相关问题
1
对已删除的线程如何重新创建?
2
main()结束后如何自己删除
3
rt-thread 如何结束并释放一个 死循环线程
4
想实现个删除线程(kill)的msh命令,有哪些注意事项
5
删除线程后线程还能运行
6
rt_thread_create(),线程执行完会回收线程栈资源吗
7
rt-4.1.0Bete版线程中使用mdelay后,线程结束时无法被回收?
8
线程状态为close 怎么从list thread 中删掉呢
9
rt_object_init陷入了死循环?
10
A线程删除被邮箱永久挂起的B线程有没有问题?
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部