OpenEdv-开源电子网

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

用GUI做个RTC实时时钟界面,运行一段时间后,界面和时钟指针就不会刷新了,任务死掉了一样

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-6-30
在线时间
7 小时
发表于 2015-5-6 09:07:43 | 显示全部楼层 |阅读模式
5金钱
创建了三个任务,LED闪烁,GUI时钟界面和触摸。GUI时钟界面不会刷新之后,其他两个任务还能运行。
没有用RTC中断,用了之后界面根本就不会显示。
网上看了,说是GUI_Delay();问题,我的GUI_X_Delay如下:
OS_CFG_TICK_RATE_HZ=1000u;
void  GUI_X_Delay (int period) 
{
    OS_TICK  ticks;
    OS_ERR   err;
    ticks = (period * 1000) / OS_CFG_TICK_RATE_HZ;
    OSTimeDly((OS_TICK)ticks,OS_OPT_TIME_DLY,&err);
}
跟系统时钟一致,但是如果用GUI_Delay(30),四十几秒后界面就死掉,如果用GUI_Delay(500),一分多钟后界面就死掉
死掉是界面不刷,时钟指针一直停着。代码如下,求大神解决啊
/*******************设置任务优先级*******************/
#define STARTUP_TASK_PRIO       3
#define TASK_LED_PRIO                5 
#define TASK_GUI_TOUCH_PRIO   4
#define TASK_GUI_PRIO                6 
#define TASK_BSP_INIT_PRIO       3
/************设置栈大小(单位为 OS_STK )************/
#define STARTUP_TASK_STK_SIZE   100 
#define TASK_LED_STK_SIZE            80  
#define TASK_GUI_STK_SIZE             500   //改成1024 也是一样
#define TASK_GUI_Touch_STK_SIZE 80

void Task_GUI(void *p_arg)
{
      OS_ERR err;
      (void)p_arg;
      RTCDrawnMenu(120,110,100);
    while(1)
    {
        OSTimeDly(1,OS_OPT_TIME_DLY,&err);
    }
}
void RTCDrawnMenu(int XCenter,int YCenter,int Radius) 


BUTTON_Handle ModifyIDHandle,EnterIDHandle,ReturnIDHandle;
PARAM   Param; 
GUI_AUTODEV AutoDev;   
GUI_SetBkColor(GUI_Silver);
GUI_Clear();
GUI_AA_DisableHiRes();
GUI_AA_SetFactor(5);
while(1)
{
GUI_MEMDEV_CreateAuto(&AutoDev);
ColckTemp=RTC_GetCounter();                 //RTC程序用原子的
RTC_Get(ColckTemp);

Param.xhour=(calendar.hour*30)*3.1415926f/180;
GUI_RotatePolygon(Param.aPoints,  _aNeedle, countof(_aNeedle),Param.xhour);

Param.xmin =(calendar.min*6)*3.1415926f/180;
GUI_RotatePolygon(Param.aPoints1, _aNeedle1, countof(_aNeedle1),Param.xmin );

Param.xsec =(calendar.sec*6)*3.1415926f/180;
GUI_RotatePolygon(Param.aPoints2, _aNeedle2, countof(_aNeedle2),Param.xsec);

GUI_MEMDEV_DrawAuto(&AutoDev, &aram.AutoDevInfo, &_Draw, &aram);

ModifyIDHandle=BUTTON_Create(15,270,70,50,ModifyID, WM_CF_SHOW );
EnterIDHandle=BUTTON_Create(85,270,70,50,EnterID,WM_CF_SHOW);
ReturnIDHandle=BUTTON_Create(155,270,70,50,ReturnID,WM_CF_SHOW);

BUTTON_SetBkColor(ModifyIDHandle,BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetBkColor(EnterIDHandle,BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetBkColor(ReturnIDHandle,BUTTON_CI_UNPRESSED,GUI_RED);
   
GUI_Delay(300);
        
    LED1( OFF);
    }
}
void _Draw(void * p) {

int i,x,y;
float a;
char ac[4];
float ahour,amin,asec;
int XCenter=120;int YCenter=110;int Radius=100;
PARAM * pParam;
pParam = (PARAM *)p;

if (pParam->AutoDevInfo.DrawFixed)  
{

   GUI_SetBkColor(GUI_Silver);
   GUI_Clear();
    GUI_SetPenSize( 5 );
     GUI_SetTextMode(GUI_TM_TRANS);
GUI_SetFont(&GUI_FontComic18B_ASCII);
GUI_SetColor(GUI_BLACK);
GUI_AA_DrawArc( XCenter,YCenter,Radius,Radius,-90, 360 );
for (i=0; i<= 11; i++) {
a = (90+i*30)*3.1415926/180;
x = -90*cos(a)+XCenter;
y = -90*sin(a)+YCenter;
if (i%3 == 0)
GUI_SetPenSize( 5 );
else
GUI_SetPenSize( 4 );
GUI_DrawPoint(x,y);
if (i%3 == 0) {
x = -72*cos(a)+XCenter;
y = -80*sin(a)+YCenter;
if(i==0){sprintf(ac, "%d", 12);}
else{sprintf(ac, "%d", i);}
GUI_SetTextAlign(GUI_TA_VCENTER);
GUI_DispStringHCenterAt(ac,x,y);
}
 }
}

    GUI_SetColor(GUI_BLACK);
GUI_AA_FillPolygon(pParam->aPoints,  countof(_aNeedle),120,110);

GUI_SetColor(GUI_BLACK);
GUI_AA_FillPolygon(pParam->aPoints1, countof(_aNeedle1),120,110);

GUI_SetColor(GUI_RED);
GUI_AA_FillPolygon(pParam->aPoints2, countof(_aNeedle2),120,110);

if (pParam->AutoDevInfo.DrawFixed) 
{
}
}
求大神指点指点

我想安安静静做个美男子
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
发表于 2015-5-6 22:09:03 | 显示全部楼层
我用的安富莱V5的例子,用的是emwin定时器刷新的。有时中断过多或UCOS任务中的任务过多也会出现emwin不刷新,假死。中间加了一个检测SD卡和USB的程序,运行了几分钟后就假死,删了就正常了。
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-6-30
在线时间
7 小时
 楼主| 发表于 2015-5-7 09:03:14 | 显示全部楼层
回复【2楼】physh:
---------------------------------
出现假死的原因知道是什么吗?我加了看门口就正常了,不过经常复位,时钟会闪烁,界面看起来就不友好了。
我想安安静静做个美男子
回复

使用道具 举报

8

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2016-7-16
在线时间
31 小时
发表于 2016-8-27 17:12:48 | 显示全部楼层
楼主你的时钟界面做出来了吗?
回复

使用道具 举报

6

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-12-11
在线时间
53 小时
发表于 2016-8-29 13:55:20 | 显示全部楼层
会不会是任务堆栈没有设置好?
把任务堆栈改大一点试试?
Try again and there is nothing left to say.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 22:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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