[解决办法]EMWIN卡住进入HardFault_Handler异常的处理

本文主要探讨了EMWIN在运行过程中出现卡住并进入HardFault_Handler异常的原因,包括GUI_NUMBYTES设置过小、分配的GUIMemory不连续、GUI_BLOCKSIZE设置不当以及堆栈大小不足等四个方面,并提供了相应的解决方法,如调整GUIConf.c文件中的宏定义和增大启动文件中的Stack_Size。
摘要由CSDN通过智能技术生成

现象描述

EMWIN运行卡住,在线调试进入HardFault_Handler异常


出错原因以及解决方法

原因一:GUI_NUMBYTES设置太小

现象:

在线跟踪,若GUI_ALLOC_AssignMemory(_aMemory, GUI_NUMBYTES)中对应的_aMemory数组全部空间都有数据,那么就可以确定是此问题导致

非常抱歉,我的回答还是有误。`GUI_TIMER_TIME_MSECS()` 函数并不是 emWin 图形库自带的函数,而是一个自定义的宏定义,用于将以毫秒为单位的时间转换成 `GUI_TIMER_TIME` 结构体。 下面是一个示例代码,演示如何手动定义 `GUI_TIMER_TIME_MSECS()` 宏: ```c #include "GUI.h" typedef struct { int Time; int Repeat; } GUI_TIMER_TIME; #define GUI_TIMER_TIME_MSECS(msec) {(msec), (msec)} static GUI_TIMER_HANDLE hTimer; static int cnt = 0; void myTimerCallback(GUI_TIMER_MESSAGE* pTM) { cnt++; char buf[32]; sprintf(buf, "Count: %d", cnt); GUI_DispStringAt(buf, 100, 100); } int main(void) { GUI_Init(); // 使用自定义的宏定义来指定定时器触发时间和周期 GUI_TIMER_TIME timerTime = GUI_TIMER_TIME_MSECS(1000); // 创建一个定时器,并指定定时器回调函数、定时器触发时间和周期、以及定时器属性 hTimer = GUI_TIMER_Create(&myTimerCallback, timerTime, 0, GUI_TIMER_CF_RESTART); while (1) { GUI_Exec(); } } ``` 在这个示例代码中,我们手动定义了一个 `GUI_TIMER_TIME` 结构体,包含了 `Time` 和 `Repeat` 字段,用于表示定时器的触发时间和周期。然后,我们通过一个宏定义 `GUI_TIMER_TIME_MSECS()` 来将以毫秒为单位的时间值转换成 `GUI_TIMER_TIME` 结构体。最后,我们在创建定时器时,使用这个自定义的宏定义来指定定时器的触发时间和周期。 需要注意的是,这里的 `GUI_TIMER_TIME` 结构体和 `GUI_TIMER_TIME_MSECS()` 宏定义都是自定义的,如果你使用的是官方提供的 emWin 图形库版本,可能需要根据实际情况进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值