OpenEdv-开源电子网

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

求助原子哥及各位大神,STemWin出现 HardFault_Handler

[复制链接]

14

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2015-10-14
在线时间
2 小时
发表于 2015-10-28 14:47:48 | 显示全部楼层 |阅读模式
5金钱
如下代码段,注释掉WM_DeleteWindow(hWin);程序运行正常,能正常创建窗口。在做删除窗口实验时,创建完窗口,调用WM_DeleteWindow(hWin);  其中hWin=5,说明创建窗口成功,但是,一调用 WM_DeleteWindow(hWin);就进入 HardFault_Handler中断,在中断中打印出来的CFSR: 1000000;HFSR:40000000;DFSR:       1;AFSR:       0,请问问题可能出现在哪里?请原子及各位大神支招

void fun(void)
{   
    WM_HWIN hWin;
     hWin = WM_CreateWindowAsChild(
                                        0,          //窗口左上角,x轴位置                            
                                        30,         //窗口左上角,y轴位置            
                                        480,        //窗口宽度            
                                        290,        //窗口高度
                                        WM_HBKWIN,  //窗口父窗口句柄
                                        WM_CF_SHOW|WM_CF_MOTION_Y,//窗口特性
                                        CallBack,//窗口回调函数
                                        0           //要分配的额外字节数,通常为0
                                  ); 
    WM_DeleteWindow(hWin);
}

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

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-10-28 21:54:34 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

14

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2015-10-14
在线时间
2 小时
 楼主| 发表于 2015-10-29 08:15:18 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
感谢指导!如下代码,这是个独立的ucos任务,删除后就死循环GUI_Delay(10);_cbBkWindow函数中没有WM_NOTIFICATION_CHILD_DELETED的消息处理,值做了简单的窗口重绘,把窗口刷出黑色,其他消息也没处理。一删除窗口就硬件错误,悲剧啊
void GuiMain(void)
{
    /* 显示鼠标 */
    GUI_CURSOR_Select(&GUI_CursorCrossS);
    GUI_CURSOR_Show();  //显示鼠标
// /* 设置桌面窗口的回调函数 */
WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
    
   //顶端状态栏
 WM_MOTION_Enable(1);
WM_MOTION_SetDefaultPeriod(500);
fun(); 
while(1)
{
        GUI_Delay(10);
}
}
回复

使用道具 举报

14

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2015-10-14
在线时间
2 小时
 楼主| 发表于 2015-10-29 11:19:22 | 显示全部楼层
问题定位在了如下函数,创建子窗口的回调函数CallBack中,CallBack处理消息ID为WM_DELETE(0x0B), 再执行GUI_PID_STATE stPidState = (*((GUI_PID_STATE *)(pMsg->Data.p)));就挂了,百思不得其解啊。怀疑过任务堆栈溢出,但是将任务堆栈由1024 加到 1024*5也与于事无补啊;也怀疑过STemWin内存溢出,用 GUI_ALLOC_AssignMemory(),将内存由500K增加到1M,还是同样的问题。

void fun(void)
{   
    WM_HWIN hWin;
     hWin = WM_CreateWindowAsChild(
                                        0,          //窗口左上角,x轴位置                            
                                        30,         //窗口左上角,y轴位置            
                                        480,        //窗口宽度            
                                        290,        //窗口高度
                                        WM_HBKWIN,  //窗口父窗口句柄
                                        WM_CF_SHOW|WM_CF_MOTION_Y,//窗口特性
                                        CallBack,//窗口回调函数
                                        0           //要分配的额外字节数,通常为0
                                  ); 
    WM_DeleteWindow(hWin);
}

CallBack函数如下

硬件错误版本:
A版本
static void RateSetCallBack(WM_MESSAGE* pMsg)
{

    GUI_PID_STATE stPidState = (*((GUI_PID_STATE *)(pMsg->Data.p)));
    
    switch (pMsg->MsgId) 
    {
        case WM_PID_STATE_CHANGED:
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}    

不出现硬件错误:
B版本
static void RateSetCallBack(WM_MESSAGE* pMsg)
{

    GUI_PID_STATE stPidState;
    stPidState.Pressed = (*((GUI_PID_STATE *)(pMsg->Data.p))).Pressed;
    stPidState.Layer = (*((GUI_PID_STATE *)(pMsg->Data.p))).Layer;
    stPidState.y = (*((GUI_PID_STATE *)(pMsg->Data.p))).x;
    stPidState.y = (*((GUI_PID_STATE *)(pMsg->Data.p))).x;
    
    switch (pMsg->MsgId) 
    {
        case WM_PID_STATE_CHANGED:
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}   

C版本
static void RateSetCallBack(WM_MESSAGE* pMsg)
{

    GUI_PID_STATE stPidState;
    switch (pMsg->MsgId) 
    {
        case WM_PID_STATE_CHANGED:
            stPidState = *((GUI_PID_STATE *)(pMsg->Data.p));
            break;
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}   

如上述,A版本出现硬件错误,B和C不出现硬件错误,神奇啊!大神们出来指点一下迷津,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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