浅谈MiniGUI的VxWorks环境移植

开发
本文将介绍MiniGUI的VxWorks环境移植,MiniGUI开发的主要目标就是为基于Linux的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。

首先,需要准备好MiniGUI1.6.10的库文件,和一些示例文件,可以到MiniGUI.org上下载.(可能我机器上的版本和下载的开源版本不一样,但是这个文章写出来就是为了备忘的。所以以我自己的版本为主介绍)

1. Cygwin环境安装

这个就不多说了,windows上很有名的模拟linux平台的工具软件。可以很方便的下载到。安装的时候注意安装make, vim两个东西即可。

2. 在cygwin上交叉编译MiniGUI的产品

由于我这里的目标板是mips的核,那我就以mips为例:

MiniGUI源代码中编译文件:

makefile.ng是用来VxWorks的编译的文件.打开这个文件可以看到include rules.make,打开rules.make文件,可以看到这个文件中做了一些相关的设置。注意第一句TARGET_RULES=build/rules-mipse.vxworks。看来用的定义是放在这个build/rules-mipse.vxworks文件中的,那我再打开这个文件。

这个文件中有几个定义需要注意:

1.PREFIX:这个地方定义了编译好的MiniGUI库文件和头文件放置的位置

2.TARGET_DIR:这个地方定义了tornado工具安装的路径,方便寻找vxworks的库文件和交叉编译链工具

3.CFLAGS:定义了MiniGUI编译时候的参数,有类似下面的参数
-g -mips3 -EL -D__LITTLE_ENDIAN__ -Wall -DTOOL_FAMILY=gnu -DTOOL=gnu -D_WRS_KERNEL -DMIPSEL -DCPU=MIPS64 -D__mips__ -D__MIPSEL__

我们需要注意修改的地方有两个

-D__LITTLE_ENDIAN__    大小端,根据不同的客户机有不同的要求,可能是__BIG__ENDIAN__ __LITTLE_ENDIAN__

-DCPU=MIPS64    cpu类型:也需要根据不同的客户机的要求,MIPS64 MIPS32等

上面的内容都设置好了之后,我们还需要根据板子不同需要做一些代码定制,如下:关闭鼠标,关闭png,jpeg,commlcd(为了排除问题,只打开dummy 引擎);打开DUMMY引擎。

也就是注释掉:……_CURSOR_SUPPORT    1……

……_PNG_FILE_SUPPORT    1……

……_JEPG_FILE_SUPPORT    1……

修改配置

vim src/sysres/mgetc-vxi386.c

修改为:

static char *SYSTEM_VALUES[]={"dummy","dummy","/dev/ts","none"};

下面我们就可以进行交叉编译了:

交叉编译时,必须使用cygwin内置的make命令来编译。所以输入如下

    $/bin/make -f makefile.ng clean

    $/bin/make -f makefile.ng

    $/bin/make -f makefile.ng install

编译完成后,就可以在已经定义好的目录下找到编译好的libMiniGUI.a文件和MiniGUI相关的头文件.

3. tornado产品上运行编译出来的MiniGUI示例

还记得上个文章说到怎么创建项目吧。那我们新创建一个项目,这里有几点需要注意

◆如果我们是对一个已经编译好内核的板子来说。我们需要准备好这个内核文件,方便 我们写好的程序downloading到板子上

◆如果是一个已经编译好内核的板子,我们就只需要建立一个downloadable的应用程序就可以了。

◆我们在选择toolchain的设置的时候(如图),需要按照不同的板子环境设置不同的toolchain,这里必须注意的是刚才编译MiniGUI设置的CPU和大小端的内容,必须和这里选择的一样。

toolchain的设置



先给出一个MiniGUI的helloworld实例

Code
 

 1 /* 
  2 ** $Id: helloworld.c,v 1.38 2007-10-25 07:56:45 weiym Exp $
  3 **
  4 ** Listing 2.1
  5 **
  6 ** helloworld.c: Sample program for MiniGUI Programming Guide
  7 **      The first MiniGUI application.
  8 **
  9 ** Copyright (C) 2004 ~ 2007 Feynman Software.
 10 **
 11 ** License: GPL
 12 */
 13 #include <stdio.h>
 14 #include <string.h>
 15 #include <MiniGUI/common.h>
 16 #include <MiniGUI/MiniGUI.h>
 17 #include <MiniGUI/gdi.h>
 18 #include <MiniGUI/window.h>
 19 #include <MiniGUI/mywindows.h>
 20 static char welcome_text [512];
 21 static char msg_text [256];
 22 static RECT welcome_rc = {10, 100, 600, 400};
 23 static RECT msg_rc = {10, 100, 600, 400};
 24 static const char* syskey = "";
 25 static int last_key = -1;
 26 static int last_key_count = 0;
 27 static void make_welcome_text (void)
 28 {
 29     const char* sys_charset = GetSysCharset (TRUE);
 30     const char* format;
 31     if (sys_charset == NULL)
 32         sys_charset = GetSysCharset (FALSE);
 33     SetRect (&welcome_rc,  10, 10, g_rcScr.right - 10, g_rcScr.bottom / 2 - 10);
 34     SetRect (&msg_rc, 10, welcome_rc.bottom + 10, g_rcScr.right - 10, g_rcScr.bottom - 20);
 35     if (strcmp (sys_charset, FONT_CHARSET_GB2312_0) == 0
 36             || strcmp (sys_charset, FONT_CHARSET_GBK) == 0) {
 37         format = "欢迎来到 MiniGUI 的世界! 如果您能看到该文本, 则说明 MiniGUI Version %d.%d.%d 可在该硬件上运行!";
 38     }
 39     else if (strcmp (sys_charset, FONT_CHARSET_BIG5) == 0) {
 40         format = "欢迎来到 MiniGUI 的世界! 如果您能看到该文本, 则说明 MiniGUI Version %d.%d.%d 可在该硬件上运行!";
 41     }
 42     else {
 43         format = "Welcome to the world of MiniGUI. \nIf you can see this text, MiniGUI Version %d.%d.%d can run on this hardware board.";
 44     }
 45     sprintf (welcome_text, format, MiniGUI_MAJOR_VERSION, MiniGUI_MINOR_VERSION, MiniGUI_MICRO_VERSION);
 46     strcpy (msg_text, "No message so far.");
 47 }
 48 static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
 49 {
 50     HDC hdc;
 51     syskey = "";
 52     switch (message) {
 53         case MSG_CREATE:
 54             make_welcome_text ();
 55             SetTimer (hWnd, 100, 200);
 56             break;
 57         case MSG_TIMER:
 58             sprintf (msg_text, "Timer expired, current tick count: %ul.",
 59                             GetTickCount ());
 60             InvalidateRect (hWnd, &msg_rc, TRUE);
 61          printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
 62             break;
 63            
 64         case MSG_LBUTTONDOWN:
 65             strcpy (msg_text, "The left button pressed.");
 66             InvalidateRect (hWnd, &msg_rc, TRUE);
 67             break;
 68         case MSG_LBUTTONUP:
 69             strcpy (msg_text, "The left button released.");
 70             InvalidateRect (hWnd, &msg_rc, TRUE);
 71             break;
 72         case MSG_RBUTTONDOWN:
 73             strcpy (msg_text, "The right button pressed.");
 74             InvalidateRect (hWnd, &msg_rc, TRUE);
 75             break;
 76         case MSG_RBUTTONUP:
 77             strcpy (msg_text, "The right button released.");
 78             InvalidateRect (hWnd, &msg_rc, TRUE);
 79             break;
 80         case MSG_PAINT:
 81             hdc = BeginPaint (hWnd);
 82             DrawText (hdc, welcome_text, -1, &welcome_rc, DT_LEFT | DT_WORDBREAK);
 83             DrawText (hdc, msg_text, -1, &msg_rc, DT_LEFT | DT_WORDBREAK);
 84             EndPaint (hWnd, hdc);
 85             return 0;
 86         case MSG_SYSKEYDOWN:
 87             syskey = "sys";
 88         case MSG_KEYDOWN:
 89             if(last_key == wParam)
 90                 last_key_count++;
 91             else
 92             {
 93                 last_key = wParam;
 94                 last_key_count = 1;
 95             }
 96             sprintf (msg_text, "The %d %skey pressed %d times",
 97                             wParam - 1, syskey, last_key_count);
 98             InvalidateRect (hWnd, &msg_rc, TRUE);
 99             return 0;
100         case MSG_KEYLONGPRESS:
101             sprintf (msg_text, "=======The %d key pressed over a long term", wParam);
102             InvalidateRect (hWnd, &msg_rc, TRUE);
103             break;
104         case MSG_KEYALWAYSPRESS:
105             sprintf (msg_text, "=======The %d key pressed always", wParam);
106             InvalidateRect (hWnd, &msg_rc, TRUE);
107             break;
108         case MSG_KEYUP:
109             sprintf (msg_text, "The %d key released", wParam - 1);
110             InvalidateRect (hWnd, &msg_rc, TRUE);
111             return 0;
112         case MSG_CLOSE:
113             KillTimer (hWnd, 100);
114             DestroyMainWindow (hWnd);
115             PostQuitMessage (hWnd);
116             return 0;
117     }
118     return DefaultMainWinProc(hWnd, message, wParam, lParam);
119 }
120 int MiniGUIMain (int argc, const char* argv[])
121 {
122     MSG Msg;
123     HWND hMainWnd;
124     MAINWINCREATE CreateInfo;
125 #ifdef _MGRM_PROCESSES
126     JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);
127 #endif
128     CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
129     CreateInfo.dwExStyle = WS_EX_NONE;
130     CreateInfo.spCaption = "Hello, world!";
131     CreateInfo.hMenu = 0;
132     CreateInfo.hCursor = GetSystemCursor(0);
133     CreateInfo.hIcon = 0;
134     CreateInfo.MainWindowProc = HelloWinProc;
135     CreateInfo.lx = 0;
136     CreateInfo.ty = 0;
137     CreateInfo.rx = g_rcScr.right;
138     CreateInfo.by = g_rcScr.bottom;
139     CreateInfo.iBkColor = COLOR_lightwhite;
140     CreateInfo.dwAddData = 0;
141     CreateInfo.hHosting = HWND_DESKTOP;
142    
143     hMainWnd = CreateMainWindow (&CreateInfo);
144    
145     if (hMainWnd == HWND_INVALID)
146         return -1;
147     ShowWindow(hMainWnd, SW_SHOWNORMAL);
148     while (GetMessage(&Msg, hMainWnd)) {
149         TranslateMessage(&Msg);
150         DispatchMessage(&Msg);
151     }
152     MainWindowThreadCleanup (hMainWnd);
153     return 0;
154 }
155 #ifndef _LITE_VERSION
156 #include <MiniGUI/dti.c>
157 #endif
158

把这个实例添加到新建的tornado项目中,假设命名为helloworld.c文件,接下来,就需要把MiniGUI的头文件路径和库文件给链接到tornado的项目中.

打开tornado的workspace窗口中的build标签,我们在这里面设置MiniGUI的头文件和链接文件

1)双击demo builds下面的MIPS64gnule。

2)在打开的窗口中选择c/c++ compile tag

这里有tornado在编译的时候使用的参数,

首先我们要删除-ansi, MiniGUI在开发的过程中,一些代码中没有按照ansi标准,所以我们需要先删除这个参数。

然后, 我们可以像使用gcc编译选项的参数一样加入我们的头文件路径,或者通过下面的“Include path...”按钮来添加

-IC:/cross/mipse/include

3)添加链接,这里注意不是在link标签下,是在Macro宏标签下添加

打开PRJ_LIBS宏,把库文件路径复制到value值里,然后按“add/set...”按钮

C:/cross/mipse/lib/libMiniGUI.a

这样,我们就把MiniGUI的库文件链接上了,而且也加好了MiniGUI的头文件路径.

下面,我们就可以编译我们刚写的MiniGUI的helloworld程序了。

4)设置目标板

现在我们需要连接上我们的目标版上的vxworks系统,把我们编译好的程序烧上去了。首先,在菜单tools->target server...的选项中选择configure,新建一个configuration,修改了configuration默认的名称后,选择target server properties下拉菜单,选择core file and symbols,然后指定file路径,这个所说的file就是前面提醒大家准备好的vxworks的内核文件"vxWorks"

然后在target server中填入本机的ip地址, 在target name/IP address里面填入目标板的ip地址,确认。这时主界面的toolbar中的combobox里面就可以选择当前的这个配置了。选中当前的配置后,就可以尝试启动链接了

5)让我们的MiniGUI程序跑起来

目标板设置完成之后,我们可以把编译好的download到目标机器上,启动windsh,敲入MiniGUI_entry,就可以把刚才烧入的helloworld跑起来了~

【编辑推荐】

  1. 让Perl成为你的嵌入式开发工具
  2. 嵌入式设备上的 Linux 系统开发
  3. 几种Linux下嵌入式开发环境的简单介绍
  4. 实时操作系统VxWorks在跟踪雷达系统中的应用
  5. VxWorks汉字显示解决方案
责任编辑:彭凡 来源: cnblogs
相关推荐

2021-09-26 11:51:25

MINIGUI嵌入式系统Linux

2009-07-03 18:07:31

Servlet的运行环

2009-04-11 15:12:24

VxWorks串口例子

2010-01-12 16:40:23

miniGUI编译安装

2011-06-09 11:06:36

JVM

2009-06-22 11:13:00

linuxJava运行环境

2009-04-28 16:18:29

vxWorks升级技术

2013-10-14 18:35:37

数据保护

2009-04-11 15:12:24

vxworks操作系统

2011-07-04 15:13:31

QT MPlayer 移植

2016-06-28 16:23:16

VxWorks/风河

2011-08-05 10:40:54

2009-07-09 15:31:23

构建Python开发环

2009-07-21 14:18:01

Rails运行环境

2010-09-27 16:26:09

JVMarm

2010-09-08 15:19:46

生产环境性能测试风险

2012-10-23 16:38:53

2009-06-29 10:34:34

VxWorks视频采集系统

2009-07-02 16:57:51

安装VxWorks

2021-01-25 16:28:10

鸿蒙HarmonyOS搭建环境
点赞
收藏

51CTO技术栈公众号