完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在整个工程中,有一个任务是用来刷新图片及显示实时信息的;在调试过程中发现运行到该任务就会死机,于是更改了对应的堆栈大小,发现了如下问题。。。求解答!
设置显示任务堆栈深度为512,运行正常; #define DISPLAY_STK_SIZE 512 设置显示任务堆栈深度为256或者384,运行至该任务就会死机,也就无法显示栈的使用状况 #define DISPLAY_STK_SIZE 384 #define DISPLAY_STK_SIZE 256 设置显示任务栈深度为128,运行正常,不知道为什么。 #define DISPLAY_STK_SIZE 128 //下面是显示任务的代码 void Display_task(void *p_arg) { OS_ERR err; u8 PicNum=0,ErrFlag,Dres; CPU_SR_ALLOC(); LCD_Clear(WHITE); piclib_init(); Picres=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); while(1) { if(PicNum >= curindex) PicNum = 0; if((Picres==FR_OK)&&(UIChange==1)) { dir_sdi(&picdir,picoffsettbl[0]); Dres=f_readdir(&picdir,picfileinfo); if(Dres==FR_OK && picfileinfo->fname[0]!=0) { strcpy((char*)pname,"0:/PICTURE/"); strcat((char*)pname,(const char*)picfileinfo->fname); //显示一张固定位置的图片 LCD_Clear(WHITE); ErrFlag = ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1); } else Show_Str(300,260,240,16,(u8 *)"图片打开失败..",16,0); UIChange=0; } PicNum++; OS_CRItiCAL_ENTER(); //进入临界区, //下面这些都是显示一些实时数据,刚开始没有设置临界区的时候,偶尔会出现显示错误的情况,因此加了这个,不知道有没有什么影响! LCD_ShowString(20,140,200,16,16,(u8 *)"The Data Readed Is: "); LCD_ShowNum(20,160,datatemp,2,16); LCD_ShowNum(20,120,xbit,3,16); LCD_ShowNum(100,120,ybit,3,16); LCD_ShowNum(2,20,PicNum,2,16); LCD_ShowNum(2,60,ErrFlag,2,16); Show_Str(2,2,400,16,pname,16,0); sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date); LCD_ShowString(2,80,100,16,16,tbuf); HAL_RTC_GetTime(&RTC_Handler,&RTC_TimeStruct,RTC_FORMAT_BIN); sprintf((char*)tbuf," %02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds); LCD_ShowString(100,80,140,16,16,tbuf); LCD_ShowString(2,100,60,20,16,(u8 *)"Tempera:"); if(temperature<0) { LCD_ShowChar(80,100,'-',16,0); temperature=-temperature; }else LCD_ShowChar(80,100,' ',16,0); LCD_ShowNum(80+8,100,temperature/10,2,16); LCD_ShowChar(80+32,100,'.',16,0); LCD_ShowNum(80+40,100,temperature%10,1,16); OS_CRITICAL_EXIT(); OSTimeDlyHMSM(0,0,0,2000,OS_OPT_TIME_PERIODIC,&err); } //这块释放初始化时分配的内存,没有机会运行,但是前面初始化申请了,我就放在这释放了,万一要删除任务呢。。 myfree(SRAMIN,picfileinfo); myfree(SRAMIN,pname); myfree(SRAMIN,picoffsettbl); } 以上结果都只是修改了 显示任务的 栈深度。其它均未改动,但是为什么是这样的结果呢? 还想问一下,这个任务为什么会需要那么多的栈空间?栈不是存放局部变量吗?这个任务在挂起的时候占了那么多栈吗? 任务中调用的函数,均与原子的例程中一样。 |
|
相关推荐
8个回答
|
|
|
|
顶一下,大神帮帮忙
|
|
|
|
不要沉啊!
|
|
|
|
帮顶,楼主解决了麻烦说一声
|
|
|
|
继续等
|
|
|
|
有可能是因为操作了一个地址没有对齐的变量,导致跑飞了。例如一个unsigned int val,val的首地址是在非对齐的地址上,如果对这个变量直接赋值就会跑飞,例如val = 123;这种情况可能会出现在禁止自动对齐的结构体成员的操作中。
|
|
|
|
怎么设置禁止自动对齐呢?我查一下有没有这样的变量。
|
|
|
|
定义结构体的时候有没输入 __attribute__((packed))或__attribute__((aligned(n)))类似的指令?你去百度一下设置结构体对齐。
|
|
|
|
只有小组成员才能发言,加入小组>>
778 浏览 0 评论
1149 浏览 1 评论
2527 浏览 5 评论
2859 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1066浏览 3评论
190浏览 2评论
453浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 16:24 , Processed in 1.208286 second(s), Total 62, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号