硬汉嵌入式论坛

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

[emWin] emwin使用外部sdram做动态内存,运行一段时间死机

[复制链接]

11

主题

68

回帖

198

积分

初级会员

积分
198
发表于 2017-6-17 18:53:16 | 显示全部楼层 |阅读模式
    我是使用的平台是stm32 f429 ,之前一直使用内部ram,程序也连续跑了几个星期,一直都稳定,可是最近又加了fatfs,内存空间不够,就启用外部sdram,可是工作一段时间后就死机了,别的地方都没变就改了Guiconf.c文件。

#define GUI_BLOCKSIZE 0x80
/*********************************************************************
*
*       GUI_X_Config
*
* Purpose:
*   Called during the initialization process in order to set up the
*   available memory for the GUI.
*/
void GUI_X_Config(void) {

#if 0
    static U32 aMemory[GUI_NUMBYTES / 4];
   
    GUI_ALLOC_AssignMemory(aMemory, GUI_NUMBYTES);
    //GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#else   
   
    //16位,8m的sdram,起始地址是0xD0000000.
    static U16 *aMemory = GUI_HMEM_NULL;
   
    aMemory = (U16 *)0xD0600000;  //前面6m给了ltdc缓存
    /*  Assign memory to emWin */
    GUI_ALLOC_AssignMemory((U16*)aMemory, GUI_NUMBYTES);
    GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE);
#endif
  //
  GUI_SetDefaultFont(GUI_FONT_6X8);
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-17 19:16:33 | 显示全部楼层
有两种解决办法,一种就是还用你之前的方案就行,加上FatFS后,把GUIConf,C文件中的动态内存减小。

另外一个版本就是解决你现在的问题,你这个问题曾经有个网友问过一个类似的,原因是因为他的LTDC所涉及的引脚速度配置搞了,GPIO不是可以配置100MHz,10MHz等速度么,你可以在你当前的基础上降低一个档次,所有涉及到的引脚都降低一个档次看看。另外就是降低下LTDC的时钟输出速度。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-19 09:24:38 | 显示全部楼层

回 eric2013 的帖子

eric2013:有两种解决办法,一种就是还用你之前的方案就行,加上FatFS后,把GUIConf,C文件中的动态内存减小。

另外一个版本就是解决你现在的问题,你这个问题曾经有个网友问过一个类似的,原因是因为他的LTDC所涉及的引脚速度配置搞了,GPIO不是可以配置100MHz,10MHz等速度么,你可以在你 .. (2017-06-17 19:16) 
谢谢!我试试
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-19 09:30:31 | 显示全部楼层

回 eric2013 的帖子

eric2013:有两种解决办法,一种就是还用你之前的方案就行,加上FatFS后,把GUIConf,C文件中的动态内存减小。

另外一个版本就是解决你现在的问题,你这个问题曾经有个网友问过一个类似的,原因是因为他的LTDC所涉及的引脚速度配置搞了,GPIO不是可以配置100MHz,10MHz等速度么,你可以在你 .. (2017-06-17 19:16) 
您好!和sdram的引脚速度配置有关吗?
回复

使用道具 举报

268

主题

597

回帖

1401

积分

至尊会员

积分
1401
发表于 2017-6-19 10:42:14 | 显示全部楼层
我的经常运行到GUI_Init()就进入hardfault了
不知道啥原因,但是反复在KEIL里面RESET几次就可以运行过去了
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-19 11:34:29 | 显示全部楼层

回 jplzl10000 的帖子

jplzl10000:我的经常运行到GUI_Init()就进入hardfault了
不知道啥原因,但是反复在KEIL里面RESET几次就可以运行过去了 (2017-06-19 10:42) 
我是运行一段时间后死机,你那种情况可能是硬件问题,看看焊接有没有问题,单独测试一下sdram的读写
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-19 11:36:44 | 显示全部楼层

回 jplzl10000 的帖子

jplzl10000:我的经常运行到GUI_Init()就进入hardfault了
不知道啥原因,但是反复在KEIL里面RESET几次就可以运行过去了 (2017-06-19 10:42) 
为什么你要经常运行到GUI_Init(),这个初始化只需要一次就行了 啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-20 02:39:20 | 显示全部楼层

回 thinkself 的帖子

thinkself:您好!和sdram的引脚速度配置有关吗? (2017-06-19 09:30) 
SDRAM的也降低下看看。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-20 02:39:48 | 显示全部楼层

回 thinkself 的帖子

thinkself:为什么你要经常运行到GUI_Init(),这个初始化只需要一次就行了 啊 (2017-06-19 11:36) 
他的意思是,他硬件调试的时候经常过不去这个函数。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-20 09:26:39 | 显示全部楼层

回 eric2013 的帖子

eric2013:他的意思是,他硬件调试的时候经常过不去这个函数。 (2017-06-20 02:39) 
您好!WM_SendMessage()这个函数可以在freertos不同线程间使用吗?
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-20 16:18:20 | 显示全部楼层

回 eric2013 的帖子

eric2013:

SDRAM的也降低下看看。
貌似还是不行,跟着论坛几个例子改,也不行,emwin跑消耗内存也是稳定的,就是跑着跑着就挂了,我尝试把其他线程和emwin这个线程通讯的几个接口给关了,跑了一天都没事,我那几个接口是通过WM_SendMessage()这个函数传给emwin主界面的,这几个函数使用在不同的线程中,我使用内部sram的时候都是可以的,是在找不出什么原因,我程序有按键中断,定时中断,传给emwin主界面显示的是温度值和当前的时间。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-21 10:31:40 | 显示全部楼层

回 thinkself 的帖子

thinkself:貌似还是不行,跟着论坛几个例子改,也不行,emwin跑消耗内存也是稳定的,就是跑着跑着就挂了,我尝试把其他线程和emwin这个线程通讯的几个接口给关了,跑了一天都没事,我那几个接口是通过WM_SendMessage()这个函数传给emwin主界面的,这几个函数使用在不同的线程中,我使用内 .. (2017-06-20 16:18) 
如果是你新作的板子,估计是你的SDRAM部分布线不是很给力,不行就再降低下时序参数。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-21 11:53:00 | 显示全部楼层

回 eric2013 的帖子

eric2013:如果是你新作的板子,估计是你的SDRAM部分布线不是很给力,不行就再降低下时序参数。 (2017-06-21 10:31) 
那为什么图层使用sdram就没什么问题呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-22 00:59:48 | 显示全部楼层

回 thinkself 的帖子

thinkself:那为什么图层使用sdram就没什么问题呢 (2017-06-21 11:53) 
因为这种情况下,你的显存和你的emWin动态内存都要去使用SDRAM,有操作不过来的问题。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-22 15:59:34 | 显示全部楼层

回 eric2013 的帖子

eric2013:因为这种情况下,你的显存和你的emWin动态内存都要去使用SDRAM,有操作不过来的问题。 (2017-06-22 00:59) 
您好!我切换界面的时候,有时候会显示主界面上的内容,但我又没切换到主界面,这是什么问题啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-23 00:32:12 | 显示全部楼层

回 thinkself 的帖子

thinkself:您好!我切换界面的时候,有时候会显示主界面上的内容,但我又没切换到主界面,这是什么问题啊 (2017-06-22 15:59) 
主界面是怎么做的。创建了一个窗口?
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-23 09:20:41 | 显示全部楼层

回 eric2013 的帖子

eric2013:主界面是怎么做的。创建了一个窗口? (2017-06-23 00:32) 
是的,利用hwin = WM_CreateWindow创建的,没有背景
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-24 10:11:19 | 显示全部楼层

回 thinkself 的帖子

thinkself:是的,利用hwin = WM_CreateWindow创建的,没有背景 (2017-06-23 09:20) 
这个太奇怪了,估计你的程序设计有问题,或者切换时反应太慢了。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-24 10:31:29 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个太奇怪了,估计你的程序设计有问题,或者切换时反应太慢了。 (2017-06-24 10:11) 
    GUI_Init();
    WM_SetCreateFlags(WM_CF_MEMDEV);   
   
   
    _hMainFrame=WM_CreateWindow(0,0,MAINXSIZE,MAINYSIZE, WM_CF_SHOW, _cbMainwindow, 0);
    GUI_UC_SetEncodeUTF8();

    while(1)
    {   
        GUI_Delay(20);//1.5 test
    }

这是我的界面程序
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115834
QQ
发表于 2017-6-26 00:43:24 | 显示全部楼层

回 thinkself 的帖子

thinkself:    GUI_Init();
    WM_SetCreateFlags(WM_CF_MEMDEV);    
    
    
....... (2017-06-24 10:31) 
仅看这些函数,没问题。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-26 13:55:58 | 显示全部楼层

回 eric2013 的帖子

eric2013:仅看这些函数,没问题。 (2017-06-26 00:43) 
那从什么地方分析,试了很多种方案,有时候还是会出现这样的问题,主界面上东西是有点多
回复

使用道具 举报

1

主题

9

回帖

54

积分

初级会员

积分
54
发表于 2017-6-26 15:23:05 | 显示全部楼层
板子SDRAM部分的布线非常关键,布线不好直接影响了读写时钟的稳定性,我们现在做的案子也用f429,也遇到过,程序运行到GUI_Init就会进入hardfault,跑内存测试就会发现经常出现读写错误,没有布线经验的最好还是参考一下discovery板。
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-26 16:36:45 | 显示全部楼层

回 食品级怪蜀黍 的帖子

食品级怪蜀黍:板子SDRAM部分的布线非常关键,布线不好直接影响了读写时钟的稳定性,我们现在做的案子也用f429,也遇到过,程序运行到GUI_Init就会进入hardfault,跑内存测试就会发现经常出现读写错误,没有布线经验的最好还是参考一下discovery板。

 (2017-06-26 15:23) 
嗯,好的,但是硬件貌似改起来没那么简单啊
回复

使用道具 举报

42

主题

1022

回帖

1153

积分

至尊会员

积分
1153
发表于 2017-6-26 18:11:50 | 显示全部楼层
你先按下面方法测试一下你的SDRAM有没有问题:
1. 假如你的SDRAM总共16M,那么在0M位置、8M位置、16M位置分别写入一个数值,比如0xAA55、0x55AA等;
2. 等待一段时间,比如你说的“工作一段时间后死机”这段时间,假如工作一小时后死机,那你就等待一小时;
3. 时间过后,你再检查一下你在这三个位置写入的变量有没有变化,是不是正确的。

这个主要是检查SDRAM本身是否正确
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-27 13:38:36 | 显示全部楼层

回 ghslfgkkl88 的帖子

ghslfgkkl88:你先按下面方法测试一下你的SDRAM有没有问题:
1. 假如你的SDRAM总共16M,那么在0M位置、8M位置、16M位置分别写入一个数值,比如0xAA55、0x55AA等;
2. 等待一段时间,比如你说的“工作一段时间后死机”这段时间,假如工作一小时后死机,那你就等待一小时;
3. 时间过后,你再检查 .. (2017-06-26 18:11) 
嗯,我试试,谢谢
回复

使用道具 举报

11

主题

68

回帖

198

积分

初级会员

积分
198
 楼主| 发表于 2017-6-28 15:10:27 | 显示全部楼层

回 eric2013 的帖子

eric2013:仅看这些函数,没问题。 (2017-06-26 00:43) 
请教一下,ltdc的中断优先级要调到最高吗?看您的三缓存(rtos)方案中,设置    LTDC_ITConfig(LTDC_IER_LIE, ENABLE);
        NVIC_SetPriority(LTDC_IRQn, 0);
        NVIC_EnableIRQ(LTDC_IRQn);
我现在使用了外部中断和定时器中断,这几个中断优先级应该低于ltdc,是吗?
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2017-12-3 20:31:04 | 显示全部楼层
楼主的问题解决了吗?
我遇到了类似的问题
使用固件库编程没问题,但是使用HAL库2次绘图间隔比较长就会hardfault
回复

使用道具 举报

72

主题

251

回帖

467

积分

高级会员

积分
467
发表于 2022-3-18 23:27:53 | 显示全部楼层
我也遇到了类似情况
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 04:02 , Processed in 0.523820 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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