硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2229|回复: 5
收起左侧

[emWin] 请教:将STEMWIN移植到UCOS后,执行OSTimeDly()后HardFault_Handler

[复制链接]

8

主题

26

回帖

50

积分

初级会员

积分
50
发表于 2017-6-14 10:16:30 | 显示全部楼层 |阅读模式
在STM32F407上,移植了USOS + STEMWIN, EMWIN使用单任务模式,执行
        GUI_Exec();
        OSTimeDly(5);
后进入 HardFault_Handler, 跟踪发现,执行OSTimeDly后是能切换到空闲任务的
测试发现, 将OSTimeDly(5) 换成 Dly(5) 不会死机。 或者,将对话框中的BUTTON删除,也不会死机

下面是 EMWIN TASK内容和创建的对话框内容

void Dly(u32 n)
{
    u32 s=OSTime;
    while ((u32)(OSTime-s)<n);
}

void TaskEmWin(void *parg)
{   
    LCD_InitHard();

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,ENABLE);//开启 CRC 时钟
    GUI_Init();
    //启用中文支持,并设置默认字体
    GUI_UC_SetEncodeUTF8();   
    TEXT_SetDefaultFont(&GUI_FontHzSong16);
    BUTTON_SetDefaultFont(&GUI_FontHzSong16);
   
    OSTimeDly(500);
    CreateFramewin();
    while (1)
    {
        GUI_Exec();
        OSTimeDly(5);
    }
}

/**************************************创建的对话框内容*****************************/
#include "DIALOG.h"

#define ID_FRAMEWIN_0  (GUI_ID_USER + 0x00)
#define ID_TEXT_0  (GUI_ID_USER + 0x01)
#define ID_BUTTON_0  (GUI_ID_USER + 0x03)

/*********************************************************************
*
*       _aDialogCreate
*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 37, 12, 320, 240, 0, 0x0, 0 },
  { TEXT_CreateIndirect, "电压测量", ID_TEXT_0, 50, 27, 80, 20, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "设置", ID_BUTTON_0, 53, 149, 100, 50, 0, 0x0, 0 },
};

/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg)
{
    int Id,NCode;

  switch (pMsg->MsgId) {
  // USER START (Optionally insert additional message handling)
  case WM_INIT_DIALOG:
      break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id)
    {
        case ID_BUTTON_0: // Notifications sent by 'Button'
            switch(NCode)
            {
            case WM_NOTIFICATION_CLICKED:
            break;
            case WM_NOTIFICATION_RELEASED:
            break;
            }
    }
    break;
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

WM_HWIN CreateFramewin(void);
WM_HWIN CreateFramewin(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

/*************************** End of file ****************************/
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-6-14 11:10:08 | 显示全部楼层
有一个emWin对RTOS的接口文件,是否编辑了,即GUI_X.c或者GUI_X_uCOS.c等类似的文件。

另外就是你使用了窗口,对话框或者控件的话,需要函数GUI_Delay,GUI_Exec或者WM_Exec去执行窗口管理器。
你的工程里面是调用的。
GUI_Exec();
OSTimeDly(5);
这两个函数的话,相当于GUI_Delay(5),效果是一样的。

还有就是别用函数void Dly(u32 n),这个函数会阻塞比emWin任务优先级低,会得不到执行。
回复

使用道具 举报

8

主题

26

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2017-6-14 12:55:23 | 显示全部楼层
我只在一个任务中使用EMWIN,所有我用的是GUI_X.c文件,里面返回了OSTime
比较奇怪的是,把对话框窗口中的按钮控件删除,就一切正常了

跟踪发现,当作用OSTimeDly(5)时,在任务切换进入OS_CPU_PendSVHandler时,SP的指针多入栈了72字节,但从空闲任务切换回EMWIN任务时,切少出栈了72字节,所以进入了HardFault_Handler

没想明白这72字节的来源,难道是 FPU?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115749
QQ
发表于 2017-6-14 13:15:54 | 显示全部楼层

回 dwj00 的帖子

dwj00:我只在一个任务中使用EMWIN,所有我用的是GUI_X.c文件,里面返回了OSTime
比较奇怪的是,把对话框窗口中的按钮控件删除,就一切正常了

跟踪发现,当作用OSTimeDly(5)时,在任务切换进入OS_CPU_PendSVHandler时,SP的指针多入栈了72字节,但从空闲任务切换回EMWIN任务时,切少出栈 .. (2017-06-14 12:55) 
估计你的工程模板有问题,不行的话,参考我们的搞下吧。

如果你使用了浮点的话,在发生中断后,有18个浮点寄存器,即72个字节和8个通用寄存器,32个字节会自动硬件入栈。
回复

使用道具 举报

8

主题

26

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2017-6-14 13:19:45 | 显示全部楼层
我用的是官方的模板移植的UCOS, 好的 , 我再看看这方面,谢谢
回复

使用道具 举报

8

主题

26

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2017-6-14 13:30:15 | 显示全部楼层
看了你的教程,确实调用了 CreateFramewin() 后进入 OS_CPU_PendSVHandler 中断时,LR的BIT4为0了,非常感谢你的教程
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-15 13:06 , Processed in 0.273016 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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