在线程运行完毕后我就想手动删除线程,然后需要的时候再重新创建,发现前面几次可以正常操作,到后面就不行了,程序进入rt_hw_hard_fault_exception异常中断跑死了,一开始我认为可能是动态线程内存没有来得及释放,后面换成静态线程还是这样。现在想求助大家:1.为什么会出现这样的情况?2.有没有什么可解决的办法?
查看更多
删除是怎么个操作流程?使用的那个函数?
本来我是用官方API删除,后来发现只要结束函数运行就行了,但是两种方法都解决不了问题。
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
本来我是用官方API删除,后来发现只要结束函数运行就行了,但是两种方法都解决不了问题。
确认任务创建后,句柄存在,再startup, 确认任务句柄存在,再删除!!
如果创建不成功,可以调试,加断点看看为什么
rt_thread_create —- rt_thread_delete
rt_thread_init —- rt_thread_detach
@张世争 /线程初始化函数声明/
static void gps_reset_init_task_init (void);
static void gps_rx_task_init (void);
static void gps_location_task_init (void);
/线程任务实现函数/
static void gps_reset_init_task (void)
{
unsigned char err_times = 0;
while(1)
{
rt_kprintf(“reset—err_times:[%d]\r\n”,err_times++);
if(err_times>5)break;
rt_thread_mdelay(500);
}
gps_location_task_init ();
}
static void gps_rx_task (void)
{
rt_err_t result;
while(1)
{
result = rt_sem_take(&UART_RX_SEM(GPS_UART),RT_WAITING_FOREVER); //永久等待gpss接收数据信号量
if(result == RT_EOK)/开始处理数据/
{
processDatFromGps () ; //处理来自GPS的数据信息
}
}
}
static void gps_location_task (void)
{
unsigned char err_times = 0;
while(1)
{
rt_kprintf(“location—err_times:[%d]\r\n”,err_times++);
if(err_times>5)break;
rt_thread_mdelay(500);
}
gps_reset_init_task_init ();
}
/线程任务初始化函数/
static void gps_reset_init_task_init (void)
{
rt_err_t result = RT_ERROR;
result = rt_thread_init(&gps_reset_task_thread,”reset_task”,
gps_reset_init_task,RT_NULL,
gps_reset_task_stack,GPS_RESET_TASK_SIZE,
GPS_RESET_TASK_PRIORITY,GPS_RESET_TASK_TICK);
}
static void gps_rx_task_init (void)
{
rt_err_t result = RT_ERROR;
result = rt_thread_init(&gps_rx_task_thread,”rx_task”,
gps_rx_task,RT_NULL,
gps_rx_task_stack,GPS_RX_TASK_SIZE,
GPS_RX_TASK_PRIORITY,GPS_RX_TASK_TICK);
}
static void gps_location_task_init (void)
{
rt_err_t result = RT_ERROR;
result = rt_thread_init(&gps_location_task_thread,”location_task”,
gps_location_task,RT_NULL,
gps_location_task_stack,GPS_LOCATION_TASK_SIZE,
GPS_LOCATION_TASK_PRIORITY,GPS_LOCATION_TASK_TICK);
}
static void gps_event_init (void) //初始化gps任务事件集
{
gps_event = rt_event_create(“gps_event”,RT_IPC_FLAG_FIFO); //创建GPS事件集
if(gps_event != RT_NULL)
{
rt_kprintf(“create gps event is success\r\n”);
}
}
/GPS任务初始化函数/
void gps_task_init_function (void)
{
gps_gpio_init (); //GPS 供电引脚io初始化程序
GPS_POWER_EN;
gps_uart_init; //gps串口初始化
gps_event_init (); //初始化gps任务事件集
}
/*/- 1. 这里是列表文本
这里是我的实现代码
没看到:rt_thread_detach 的操作
@张世争 之前我是用了detach 但是还是出现一样的情况 而且我现在又发现一个新的情况 我把gps_uart_init这个串口初始化程序注释掉好像就没问题了,这个串口处理有如下几个特点
1.使用中断接收和中断发送
2.在中断服务函数中使用了信号量释放
3.中断服务函数中使用了rt_interrupt_enter()和rt_interrupt_leave()这两个函数
4.中断服务函数中使用的全局变量在其他线程中也有使用到,具体是一个存储缓冲区
线程间耦合引起的吧。单纯线程创建删除是没有问题的。可以把全局的变量,信号量处理下。
@张世争 我把中断服务函数中的释放信号量和给缓冲区幅值的操作去掉后 好像是没有问题 但是这样操作也不能解决问题 还请您指教有什么好的办法没有
为什么要不断的创建于删除线程?线程可以通过信号量或互斥量实现是否工作,不工作的线程,就是挂起,最多占用点内存。线程可以通新,使用消息队列等等。
要搞清楚需求
@张世争 其实实际项目中我也不后悔频繁操作的 这只是在测试这部分可行性的时候发现了这个问题 不放心 就想着把他解决掉
@陆仁嘉 其实实际项目中我也不会去频繁操作的 这只是在测试这部分可行性的时候发现了这个问题 不放心 就想着把他解决掉