OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4584|回复: 8

ucos III 任务堆栈设置问题!!

[复制链接]

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
发表于 2017-9-5 17:21:19 | 显示全部楼层 |阅读模式
2金钱
在整个工程中,有一个任务是用来刷新图片及显示实时信息的;在调试过程中发现运行到该任务就会死机,于是更改了对应的堆栈大小,发现了如下问题。。。求解答!
设置显示任务堆栈深度为512,运行正常;
#define DISPLAY_STK_SIZE                                512
QQ截图20170905170954.png

设置显示任务堆栈深度为256或者384,运行至该任务就会死机,也就无法显示栈的使用状况
#define DISPLAY_STK_SIZE                                384
#define DISPLAY_STK_SIZE                                256

设置显示任务栈深度为128,运行正常,不知道为什么。
#define DISPLAY_STK_SIZE                                128

QQ截图20170905172240.png
//下面是显示任务的代码
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);                       
}


以上结果都只是修改了 显示任务的 栈深度。其它均未改动,但是为什么是这样的结果呢?  
还想问一下,这个任务为什么会需要那么多的栈空间?栈不是存放局部变量吗?这个任务在挂起的时候占了那么多栈吗?
任务中调用的函数,均与原子的例程中一样。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2017-9-6 00:11:52 | 显示全部楼层
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-9-6 11:13:06 | 显示全部楼层
顶一下,大神帮帮忙
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-9-7 10:16:31 | 显示全部楼层
不要沉啊!
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2017-9-7 10:31:28 | 显示全部楼层
帮顶,楼主解决了麻烦说一声
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-9-7 14:42:32 | 显示全部楼层
继续等
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2017-9-8 17:09:03 | 显示全部楼层
有可能是因为操作了一个地址没有对齐的变量,导致跑飞了。例如一个unsigned int val,val的首地址是在非对齐的地址上,如果对这个变量直接赋值就会跑飞,例如val = 123;这种情况可能会出现在禁止自动对齐的结构体成员的操作中。
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-7-12
在线时间
26 小时
 楼主| 发表于 2017-9-8 17:24:36 | 显示全部楼层
lss1330 发表于 2017-9-8 17:09
有可能是因为操作了一个地址没有对齐的变量,导致跑飞了。例如一个unsigned int val,val的首地址是在非对 ...

怎么设置禁止自动对齐呢?我查一下有没有这样的变量。
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2017-9-8 17:30:04 | 显示全部楼层
许恒博 发表于 2017-9-8 17:24
怎么设置禁止自动对齐呢?我查一下有没有这样的变量。

定义结构体的时候有没输入 __attribute__((packed))或__attribute__((aligned(n)))类似的指令?你去百度一下设置结构体对齐。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 02:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表