在整个工程中,有一个任务是用来刷新图片及显示实时信息的;在调试过程中发现运行到该任务就会死机,于是更改了对应的堆栈大小,发现了如下问题。。。求解答!
设置显示任务堆栈深度为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);
}
以上结果都只是修改了 显示任务的 栈深度。其它均未改动,但是为什么是这样的结果呢?
还想问一下,这个任务为什么会需要那么多的栈空间?栈不是存放局部变量吗?这个任务在挂起的时候占了那么多栈吗?
任务中调用的函数,均与原子的例程中一样。
|