OpenEdv-开源电子网

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

UCGUI+UCOS-II 回调函数问题

[复制链接]

38

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2013-7-15
在线时间
0 小时
发表于 2013-12-16 20:25:41 | 显示全部楼层 |阅读模式
我建立一个窗口,窗口有回调函数,回调函数在WM_PAINT 中显示数字,可是执行一段时间就进入了hardfault_handler(),这是怎么回事呢?

任务:
void Task(void *p_arg)
{
while(1)
{
hWin =WM_CreateWindow(0,0,XSIZE_PHYS,YSIZE_PHYS-YSIZE_PHYS/12,WM_CF_SHOW,caback,0);
GUI_Exec();
WM_DeleteWindow(hWin);
        }
}

回到函数:
void caback(WM_MESSAGE *pMsg)
{
switch (pMsg->MsgId) 
case WM_PAINT:
cnt++;
GUI_DispDecAt(cnt,10,470,10);
WM_Exec();
break;
}
WM_DefaultProc(pMsg);
}

这个过程就是这样的,  cnt 是一个全局变量,板子上电之后开始计数显示,但是当cnt = 41 时就停住了,仿真时进入了硬件错误,我开始以为是内存哪里操作问题,可是这个点代码根本没问题呀,也没发现,不知道回到函数的 WM_PAINT 到底怎么执行的,求助,搞了好久了都没解决~~~~(>_<)~~~~ 



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

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-16 22:13:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

5

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-6-10
在线时间
0 小时
发表于 2013-12-16 22:56:19 | 显示全部楼层
注释掉void Task(void *p_arg)里面的WM_Exec();
回复 支持 反对

使用道具 举报

5

主题

69

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-6-10
在线时间
0 小时
发表于 2013-12-16 22:57:00 | 显示全部楼层
回复【3楼】guooay耀:
注释掉void Task(void *p_arg)里面的WM_Exec();
---------------------------------
是GUI_Exec();
回复 支持 反对

使用道具 举报

38

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2013-7-15
在线时间
0 小时
 楼主| 发表于 2013-12-17 22:00:08 | 显示全部楼层
回复【4楼】guooay耀:
---------------------------------
不行啊,删除了就没显示了,我按照官方的回调函数那个例子,也有问题

void caback(WM_MESSAGE *pMsg)
{
switch (pMsg->MsgId)
{
case WM_PAINT:    
GUI_SetBkColor(GUI_GREEN);
GUI_Clear();
cnt++;
GUI_DispString("Foreground window");
GUI_DispDec(cnt,10);
default:          
WM_DefaultProc(pMsg);
}
}





void Task_Cursor(void *p_arg){

(void)p_arg;

while(1)
{
hWin =WM_CreateWindow(0,0,XSIZE_PHYS,YSIZE_PHYS-YSIZE_PHYS/12,WM_CF_SHOW,caback,0);
//GUI_Exec();
GUI_Delay(1000);                  //程序运行到这里就不往下执行了,直接进入了 空闲任务,什么原因呢???
WM_DeleteWindow(hWin);
GUI_DispStringAt("Background of window has not been redrawn", 10, 10);

GUI_Delay(1000);
GUI_Clear();
}

还是不行 ,创建窗口后重绘了一次,显示 
“Foreground window 0000000001”
但是执行到延时就不会执行了,还有,这个WM_PAINT只重绘一次吗?那为什么我开始了代码就重绘了好几次呢?这个WM_PAINT到底怎么执行的呢?谢谢你的解答!!
回复 支持 反对

使用道具 举报

38

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2013-7-15
在线时间
0 小时
 楼主| 发表于 2013-12-17 22:24:03 | 显示全部楼层
回复【4楼】guooay耀:
---------------------------------
我发现了一个问题,就是GUI_Delay()这个函数好像有问题,去掉函数第二个例子就没有问题,但是之前都没有问题的呀,,,
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2014-1-23
在线时间
0 小时
发表于 2014-3-13 14:14:10 | 显示全部楼层
回复【6楼】TDB:
---------------------------------
你在while1中就放delay,其余语句放在while1外面
轻松点,别着急,哈!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-3-22
在线时间
3 小时
发表于 2019-1-19 15:33:03 | 显示全部楼层
应该是任务堆栈溢出了,把堆栈数量增多再看看
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-26 00:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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