Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
rt-thread线程调度异常在stm32f103芯片上
发布于 2017-01-24 14:40:49 浏览:5798
订阅该版
问题: 程序在运行中出现有两个线程不执行了,motor_ctrl_entry和can_send_entry不执行了,而其它线程都正常执行,错误是在反复运行后偶尔出现的,不容易复现,但是存在。在调试J-link状态下运行,出现问题时,打断点,用到的中断都正常,其它执行的线程也正常,就是出问题的线程哪地方打断点都运行不到,若是说高优先级线程死循环但是低优先级线程还可以运行,不知道哪里出的问题。 大神帮忙看看,谢谢了 ```int rt_application_init(void) { init_modules(); rt_thread_init(&watchdog_thread, "watchdog", watchdog_thread_entry, RT_NULL, watchdog_thread_stack, 512, 10, 5); rt_thread_startup(&watchdog_thread); rt_thread_init(&motor_ctrl_thread, "motor_ctrl", motor_ctrl_entry, RT_NULL, motor_ctrl_thread_stack, 1536, 11, 5); rt_thread_startup(&motor_ctrl_thread); rt_thread_init(&can_send_thread, "can_send", can_send_entry, RT_NULL, can_send_thread_stack, 1024, 12, 5); rt_thread_startup(&can_send_thread); rt_thread_init(&can_recv_thread, "can_recv", can_recv_entry, RT_NULL, can_recv_thread_stack, 1536, 13, 5); rt_thread_startup(&can_recv_thread); rt_thread_init(&servo_comm_thread, "servo_comm", servo_comm_entry, RT_NULL, servo_comm_thread_stack, 1536, 14, 5); rt_thread_startup(&servo_comm_thread); rt_thread_init(&rf_comm_thread, "rf_comm", rf_comm_entry, RT_NULL, rf_comm_thread_stack, 1024, 15, 5); rt_thread_startup(&rf_comm_thread); return 0; }``` ```void can_send_entry(void *parameter) { U8 ucMailbox, ucSendCnt; while (1) { ucSendCnt = 0; while (usTXRead != usTXSave) { ucMailbox = CAN_Transmit(CAN1, &stTxBuff[usTXRead]); if(ucMailbox == CAN_TxStatus_NoMailBox) { if(ucSendCnt < 10) { ucSendCnt++; rt_hw_us_delay(600); //>126bit*4us } else { rt_thread_delay(1); } } else { usTXRead++; if (usTXRead == LCAN_TX_BUFLEN) { usTXRead = 0; } ucTxFlag = TRUE; } } xgj_status_update(); //led_indicate(); rt_thread_delay(3); } }``` motor_ctrl_entry代码: ```while(1) { ucStopFlag = FALSE; key_analysis(&ucSendFlag, &ucStopFlag); alarm_analysis(); //rf_analysis(&ucSendFlag); if(g_sucModeFlag == MODE_AUTO && ucStopFlag == FALSE) { if(rt_event_recv(&event_ls_cmd, EVENT_RTC_TIMING, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, &e) == RT_EOK) { if(ucSendFlag > CTRL_PRI4_TIMING) { ucSendFlag = CTRL_PRI4_TIMING; } } if(rt_event_recv(&event_ls_cmd, EVENT_LS_COMMOND, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, &e) == RT_EOK) { if(ucSendFlag > CTRL_PRI3_LOONGSEC) { ucSendFlag = CTRL_PRI3_LOONGSEC; } } if(rt_event_recv(&event_ls_cmd, EVENT_RF_REMOTE, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, &e) == RT_EOK) { if(ucSendFlag > CTRL_PRI2_REMOTE) { ucSendFlag = CTRL_PRI2_REMOTE; } } } if(ucSendFlag > 0 && ucSendFlag < CTRL_PRI_LOWEST && ucStopFlag == FALSE) { motor_start(); g_sucPosition = POS_MIDDLE; ucSendFlag = CTRL_PRI_LOWEST; } rt_thread_delay(5); }``` ![QQ图片20170207143637.jpg](https://oss-club.rt-thread.org/uploads/9596_c4ea5e34393734851f1a2abd037a882a.jpg)
查看更多
10
个回答
默认排序
按发布时间排序
bernard
2017-01-24
这家伙很懒,什么也没写!
这个需要你自行查找问题了,当复现后可以用shell命令行的一些命令来了解任务的状态。另外,程序中依赖delay的方式来调度并不是好的设计。
dutchlight
2017-01-24
这家伙很懒,什么也没写!
多谢大神解答,程序中还用到了 ``` void rt_enter_critical(void); /* 进入临界区*/ ...... void rt_exit_critical(void); /* 退出临界区*/, ``` 多个线程会调用此函数会不会有问题?现在发现死的线程还不一定是这两个?! 还有不用rt_delay的方式调度,用什么调度,信号量,互斥量?比较好的用什么调度?
dutchlight
2017-02-07
这家伙很懒,什么也没写!
不执行的线程每次还不一定一样,现在出现只有motor_ctrl_entry一个线程不执行了, 附件是finsh打印信息,大神帮帮看看,从哪找原因就是找不到啊,问题也是很难重现,搞了半天才出现一次 [attach]2739[/attach]
dutchlight
2017-02-07
这家伙很懒,什么也没写!
stm32是jlink在线调试运行的,出问题时,怎么查看原因,现在把所有信号量、事件、都去掉了,只有定时器还是会出现问题,论坛人太少了,实在找不到只能放弃使用rt-thread了。
aozima
2017-02-07
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
感觉很像是 rt_enter_critical/rt_exit_critical 里面出现了问题。 调度锁里面的操作应该是迅速的,执行结果可100%预测的。 建议停止调度后,通过JTAG来观察 rt_enter_critical 中 rt_scheduler_lock_nest 的值。 good luck!
dutchlight
2017-02-08
这家伙很懒,什么也没写!
谢谢回答,rt_enter_critical/rt_exit_critical后来也去掉了,rt-thread里就只剩下用了定时器,其它全用全局变量代替了,还是会出现死线程,关键问题很难重现,现在没时间找原因了,改用裸跑的吧,以后有时间在仔细找找原因。
dutchlight
2017-02-24
这家伙很懒,什么也没写!
今天有空测了下,发现应该是频繁进入串口接收中断引起的,试了两次可以重现现象,串口收发有个引脚偶尔会与地接触,导致频繁进入接收中断,但是还是没有找出rt-thread个别线程不工作的原因,不想找了,还是用的裸跑,每行代码都知道,
shenlan
2023-10-12
这个人很勤快,没空留下点什么
和你一模一样的问题,调整线程优先级会有改善,但是只能降低出现的概率,没有办法从根本上解决
liuyue9793
2024-08-06
这家伙很懒,什么也没写!
我使用rt_thread_delay_until函数时一两天会出现线程死掉的情况,已经调试很久了,还没定位到出问题的位置
撰写答案
登录
注册新账号
关注者
0
被浏览
5.8k
关于作者
dutchlight
这家伙很懒,什么也没写!
提问
2
回答
6
被采纳
0
关注TA
发私信
相关问题
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
RTT是否支持STM32F429
7
请问谁有 STM32F40x HAL + RT-THREAD 模板
8
rt-thread在stm32f411下的移植问题
9
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
10
以后会把RT-thread移植到STM32的cube库上面么?我自己移植了一下STM32F373
推荐文章
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
ota在线升级
UART
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
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
5
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部