Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
rt-thread 运行三个小时后死机
发布于 2019-10-15 14:44:09 浏览:1670
订阅该版
是这样的,今天测试这个项目,连续测试四个小时后死机,不知道怎么回事> autojust = rt_thread_create("autojust", autojust_thread_entry, RT_NULL, 1024, 18, 30); rt_thread_startup(autojust);这是一个线程 > adc_thread = rt_thread_create("adc_read", adc_thread_entry, RT_NULL, 1024, 18, 30); rt_thread_startup(adc_thread);这是另外一个 为了防止线程对一个资源进行读写,我特意加了这两行代码 > rt_enter_critical> rt_exit_critical();请大神看一下啊
查看更多
9
个回答
默认排序
按发布时间排序
aozima
2019-10-15
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!
看不出来,也猜不出来。
aozima
2019-10-15
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!
不过可以参考下这个贴子 [url]https://www.rt-thread.org/qa/thread-422027-1-1.html[/url]
kuailedeluojie
2019-10-15
这家伙很懒,什么也没写!
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=466928&ptid=422144][color=#999999]aozima 发表于 2019-10-15 14:46[/color][/url][/size] 看不出来,也猜不出来。[/quote] 我把这两个线程的里面的代码贴上来[quote] while(1) { rt_thread_delay(1); //rt_kprintf("\n"); /*Î޵ȴý·½Ê½µÈ´ýÐźÅÁ¿£¬´òÓ¡ÐÅÏ¢*/ if(RT_EOK !=rt_sem_trytake(dynamic_sem)) /*ÓÀ¾Ã·½Ê½µÈ´ýÐźÅÁ¿*/ //if(RT_EOK !=rt_sem_take(dynamic_sem, RT_WAITING_FOREVER)) { //rt_enter_critical(); adb_init_con(); //rt_exit_critical(); // rt_kprintf("555\n"); } else { //½ÓÊÕµ½ÐźŽøÈ뵽ѻ·£¬È»ºóÀïÃæÕâ¸öÑ»·ºÍÄǸöÏß³Ìÿ¸ö²Ù×÷Ò»´Î // rt_kprintf("666\n"); #if 0 while(1) { rt_kprintf("777\n"); rt_thread_delay(1); if(RT_EOK == rt_sem_trytake(dynamic_sem)) { break; //adb_init_con(); } if(RT_EOK ==rt_sem_trytake(dynamic_sem1)) { // rt_kprintf("!!!!!\n"); //ÔÚÕâÀïºÍÄǸöÏß³ÌʵÏÖͬ²½ adb_init_con(); //ÔÚÓÃÒ»¸ö±êעλÅжÏÒ»ÏÂÌø³öÕâ¸öÑ»· if(ad5761_flag == 1) { break; } } } #endif while(1) { // rt_kprintf("#\n"); //ÔÚÓÃÒ»¸ö±êעλÅжÏÒ»ÏÂÌø³öÕâ¸öÑ»· rt_enter_critical(); adb_init_con(); rt_exit_critical(); if(ad5761_flag == 0) { break; } rt_thread_delay(1); } } }[/quote] 这是其中一个线程的代码 [quote] while(1) { //rt_kprintf("2\n"); if((auto_just_flag & JUST_BIT)==JUST_ING) { // rt_kprintf("111111111111111111111111111\n"); //如果进入自动校准状态 // rt_kprintf("2222222222222222\n"); // rt_sem_release(dynamic_sem); //rt_thread_delay(300); ad5761WriteData(channel,0); rt_thread_delay(300); // rt_sem_release(dynamic_sem); //2019.10.10 改 // val_base = (int)(power[channel*2]*100); // sprintf(dis,"%f",power[channel]); val_base = (int)(power[channel]*100); if(val_base < -300) { // rt_sem_release(dynamic_sem); rt_kprintf("dis == %s val_base = %d\n",dis,val_base); auto_just_flag &= (~(JUST_CLR)); auto_just_flag |= JUST_ER; } else { ad5761_flag = 1; rt_sem_release(dynamic_sem); rt_thread_delay(100); rt_kprintf("t1 release a dynamic semaphore.\n"); for(i = 0;i<30;i++) { ret = binary_auto(channel,(i*10),val_base); hygj_cfg_manage.DAC_Z_Value[channel][w][i] = ret; rt_thread_delay(1); } for(i = 3;i<=(MAX_ATTENUATOR+1);i++) { ret = binary_auto(channel,(i*100),val_base); hygj_cfg_manage.DAC_Value[channel][w][i] = ret; rt_thread_delay(1); } if((auto_just_flag & 0xF000) == 0) { channel++; if(channel >= 8) { channel = 0; auto_just_flag &= (~(JUST_CLR)); auto_just_flag |= JUST_OK; } } else { auto_just_flag &= (~(JUST_CLR)); auto_just_flag |= JUST_OK; } Save_To_EPROM((uint8_t *)&hygj_cfg_manage.DAC_Z_Value[channel][w],60); rt_thread_delay(500); Save_To_EPROM((uint8_t *)&hygj_cfg_manage.DAC_Z_Value[channel][w],60); rt_thread_delay(500); Save_To_EPROM((uint8_t *)&hygj_cfg_manage.DAC_Value[channel][w],((MAX_ATTENUATOR+3)*2)); rt_thread_delay(500); Save_To_EPROM((uint8_t *)&hygj_cfg_manage.DAC_Value[channel][w],((MAX_ATTENUATOR+3)*2)); rt_thread_delay(500); } } else if((auto_just_flag & JUST_BIT) == JUST_START) { temp = (auto_just_flag &0x0000F000)>>12; w = ((auto_just_flag &0x000F0000)>>16); auto_just_flag &=0xFFFFFF00; auto_just_flag |=JUST_ING; if( temp == 0) { channel = 0; } else { channel = temp-1; } rt_thread_delay(100); } else { ad5761_flag = 0; rt_thread_delay(100); } }[/quote] 这是其中一个线程的代码,我是在其中[quote]int binary_auto(unsigned char ch,int db_val,int val_base)[/quote]函数中进行上锁操作的,这个函数之前会发一个信号,下面是这个函数的主要代码[quote]int binary_auto(unsigned char ch,int db_val,int val_base) { struct _hygjdev_cfg *pcfg = &hygj_cfg_manage; unsigned int val1 = 0,mid,val2 = 0xFFFF,count = 0,num,max_count = 20; int ppower,qpower; float pow,q_p,q_p1; char dis[24] = ""; count = 16; qpower = val_base - db_val; while(count--) { mid = (val1+val2)/2; //ÔÚÕâ¸öλÖüÓÒ»¸öÏß³ÌʵÏÖÁ½¸öÏ̵߳Äͬ²½ rt_enter_critical(); ad5761WriteData(ch,mid); rt_exit_critical(); rt_thread_delay(375); // rt_sem_release(dynamic_sem1); //adc²É¼¯Ï̲߳»¶¯×÷ //rt_thread_delay(250); // ppower = (int)(power[ch*2]*100); //¹â˥ʹÓõ½µÄPDΪ0£¬2,4,6, //2019.10.12 //ÔÚ¶Ôdac½øÐвÙ×÷Ö®ºó¸øadcдȻºó²É¼¯Êý¾Ý ppower = (int)(power[ch]*100); #if 0 if(pcfg-> fan_mode == 0) { ch595_write(0,o|CH_NUM[ch]); } else if(pcfg-> fan_mode == 1 && pcfg ->temperature > 25) { ch595_write(0,o|CH_NUM[ch]); } else ch595_write(0,CH_NUM[ch]); rt_thread_delay(1); num = stm32f427_ad7980_read_data(ch); q_p = ((float)hygj_cfg_manage.ADC_just[ch][hygj_cfg_manage.OPM_W[ch]]); pow = (0.0275*((float)(num/(float)max_count)*0.05035)-79.552)+q_p; if(pow < -40.0) { //rt_kprintf("%s\n",(char *)LCD_dispbuf); //2019.9.20 ?/100.0?? // q_p1 = ((float)hygj_cfg_manage.ADC_just1[i][hygj_cfg_manage.OPM_W[i]]/100.0); q_p1 = ((float)hygj_cfg_manage.ADC_just1[ch][hygj_cfg_manage.OPM_W[ch]]); pow += (q_p1/9.0)*(-40.0-pow); } if(pow < -70.00) { pow = -50.00; } else if(pow > 20.00) { pow = 20.00; } sprintf(dis,"%f",pow); rt_kprintf("%s\n",dis); ppower = (int)pow; ppower +=16; #endif if(ppower < (qpower)) { val2 = mid; } else if(ppower > (qpower)) { val1 = mid; } else { return mid; } } return mid; } [/quote]
kuailedeluojie
2019-10-15
这家伙很懒,什么也没写!
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=466932&ptid=422144][color=#999999]yangjie 发表于 2019-10-15 14:52[/color][/url][/size] 咦?这个链接里面的帖子还是这位楼主发的啊......[/quote] 已经附上代码了
aozima
2019-10-15
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!
[i=s] 本帖最后由 aozima 于 2019-10-15 15:08 编辑 [/i] 0. 贴的代码请不要贴乱码,找BUG要用心对待。 1. 请描述死机后的现象,比如shell是否可以执行命令? PS命令的结果是什么? 2. 如果死机后shell无法执行,可以把shell线程的优先级调为0(也就是最高优先级)。 3. 请连接JTAG仿真器,如果死机后shell无法执行,请在仿真里面停下来,看当前运行到哪里去了。 4. 楼主刻意强调了加了调度锁,那没加的时候是什么情况?
aozima
2019-10-15
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!
[code]rt_enter_critical(); rt_exit_critical(); [/code] 调试锁中仅可以执行结果明确的代码,不要有阻塞或延时。建议只放纯运算类。 如果是IO操作,请使用互斥。 怀疑你的调试锁中间的代码有问题。
kuailedeluojie
2019-10-16
这家伙很懒,什么也没写!
[i=s] 本帖最后由 kuailedeluojie 于 2019-10-16 11:55 编辑 [/i] [quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=466939&ptid=422144][color=#999999]aozima 发表于 2019-10-15 15:23[/color][/url][/size] 调试锁中仅可以执行结果明确的代码,不要有阻塞或延时。建议只放纯运算类。 如果是IO操作,请使用互斥。 ...[/quote] 嗯嗯,死机后不可以执行命令, 图片是正在运行的时候ps打印的信息 我确实是在调试锁里面执行的io操做,我是用信号来启动这两个线程的同步,线程同步中用的是调试锁,我没有用过rt-thread 的互斥锁 主要的问题线程是adc_read 和 autojust两个线程
撰写答案
登录
注册新账号
关注者
0
被浏览
1.7k
关于作者
kuailedeluojie
这家伙很懒,什么也没写!
提问
44
回答
135
被采纳
0
关注TA
发私信
相关问题
1
cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
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
寻找大牛移植rt-smart到milk-v
2
【2023RT-Thread全球技术峰会】解决物联网终端应用多样化难题的软件架构:xiotman (文末送书)
3
【Matter】Nordic-Mattter开发大纲
4
rt-thread on risc-v相关汇总(截止2023-5-31)
5
【GITHUB】快速入门教程分享(面向github小白)
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
AT
FinSH
ART-Pi
Bootloader
CAN总线
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
WIZnet_W5500
RTC
rt-smart
UART
flash
rtthread
packages_软件包
freemodbus
潘多拉开发板_Pandora
I2C
cubemx
FAL
定时器
PWM
BSP
AB32VG1
ADC
中断
消息队列_msg_queue
SDIO
msh
keil
Debug
编译报错
socket
LVGL
SFUD
C++_cpp
本月问答贡献
RTT_逍遥
5
个答案
2
次被采纳
小小李sunny
6
个答案
1
次被采纳
xiaorui
3
个答案
1
次被采纳
JonasWen
3
个答案
1
次被采纳
rcp
3
个答案
1
次被采纳
本月文章贡献
燕十三
2
篇文章
6
次点赞
jaffer
1
篇文章
8
次点赞
kurisaW
1
篇文章
5
次点赞
小权一句两句
1
篇文章
4
次点赞
喵小黑
1
篇文章
4
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部