配置内存管理接口
emWin启动时,GUI_X_Config函数是GUI_Init调用的第一个初始化函数, 这个函数初始化了emWin的运行内存,代码位于GUIConf.c文件中,见 代码清单:RGB接口-1
代码清单:RGB接口-1 GUIConf.c文件内容
#include "GUI.h"
/*********************************************************************
*
* Defines, configurable
*
**********************************************************************
*/
/* 定义用于GUI的可用字节数 */
#if USE_EXTMEMHEAP
#define GUI_NUMBYTES (1024 * 1024 * 8) // x Byte (1)
#define GUI_EXTBUFADD (0xD2000000-GUI_NUMBYTES) (2)
//32MBSDRAM的最后8MB作为STemWIN动态内存
#else
#define GUI_NUMBYTES (1024 * 110) // x KByte
#endif
/*********************************************************************
*
* Static data
*
**********************************************************************
*/
#if USE_EXTMEMHEAP
static U32 HeapMem[GUI_NUMBYTES / 4] __attribute__((at(GUI_EXTBUFADD)))
; (3)
#else
static U32 extMem[GUI_NUMBYTES / 4];
#endif
/*********************************************************************
*
* Public code
*
**********************************************************************
*/
/*********************************************************************
*
* Get_ExtMemHeap
*
* Purpose:
* Allocate heap from external memory
*/
#if USE_EXTMEMHEAP
U32* Get_ExtMemHeap (void)
{
return HeapMem;
}
#endif
/*********************************************************************
*
* 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)
{
#ifdef USE_EXTMEMHEAP
GUI_ALLOC_AssignMemory(HeapMem, GUI_NUMBYTES); (4)
#else
GUI_ALLOC_AssignMemory(extMem, GUI_NUMBYTES);
#endif
}
上述代码中的第1部分定义了emWin所使用内存堆大小的宏GUI_NUMBYTES,第2部分定义了内存堆起始地址的宏GUI_EXTBUFADD, 第3部分是利用前两个宏定义了一个静态的,大小为GUI_NUMBYTES / 4的数组HeapMem,并将数组的首地址定位到GUI_EXTBUFADD处, 第4部分利用库函数GUI_ALLOC_AssignMemory把该静态数组分配给emWin作为内存块使用。 旧版例程中还用到了GUI_ALLOC_SetAvBlockSize函数配置存储块的平均大小, 但在本教程使用的V5.44a版本中已经不再需要GUI_ALLOC_SetAvBlockSiz函数。
用户可通过GUI_NUMBYTES改变emWin使用的内存块大小,在本示例中为8MB。 也可通过GUIConf.h中的USE_EXTMEMHEAP宏来选择emWin的内存堆是在内部RAM还是外部SDRAM。
请注意,应用程序无法使用全部的内存块空间,因为emWin的内存管理系统本身使用了其中很小的一部分, 每个内存块大约需要额外的12个字节用于系统管理。并且在此分配的内存块并不会用于多帧缓冲。
配置显示驱动接口
emWin的显示驱动接口主要包括创建显示设备和显示设备驱动回调函数,移植时主要针对GUIDRV_wf.c文件进行修改,同时也是emWin移植的重点对象。
配置显示驱动
先来了解显示驱动函数LCD_X_Config的程序流程,它会在GUI_X_Config函数结束后被调用,具体见 代码清单:RGB接口-2 。
代码清单:RGB接口-2 LCD_X_Config接口(GUIDRV_wf.c文件)
void LCD_X_Config(void)
{
int i;
/* 如果使用了多帧缓冲则初始化多帧缓冲区 */
#if (NUM_BUFFERS > 1)
for (i = 0; i < GUI_NUM_LAYERS; i++) {
GUI_MULTIBUF_ConfigEx(i, NUM_BUFFERS);
}
#endif
/* 设置第一层的显示驱动程序和颜色转换 */
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_0, COLOR_CONVERSION_0, 0,
0);
/* 设置第1层的尺寸大小 */
LCD_SetSizeEx (0, XSIZE_0, YSIZE_0);
LCD_SetVSizeEx(0, XSIZE_0, YSIZE_0 * NUM_VSCREENS);
/* 如果使能多图层
则设置第二层的显示驱动程序和颜色转换及尺寸
*/
#if (GUI_NUM_LAYERS > 1)
GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_1, COLOR_CONVERSION_1, 0,
1);
LCD_SetSizeEx (1, XSIZE_1, YSIZE_1);
LCD_SetVSizeEx(1, XSIZE_1, YSIZE_1 * NUM_VSCREENS);
#endif
for (i = 0; i < GUI_NUM_LAYERS; i++) {
_aPendingBuffer