上篇文章简介了vxworks和tornado环境的简单程序设计。这次我们要拿minigui来编译vxworks下的运行程序了。
首先,需要准备好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文件中的,那我再打开这个文件。
这个文件中有几个定义需要注意:
- PREFIX:这个地方定义了编译好的minigui库文件和头文件放置的位置
- TARGET_DIR:这个地方定义了tornado工具安装的路径,方便寻找vxworks的库文件和交叉编译链工具
- 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和大小端的内容,必须和这里选择的一样。
先给出一个minigui的helloworld实例
/* ** $Id: helloworld.c,v 1.38 2007-10-25 07:56:45 weiym Exp $ ** ** Listing 2.1 ** ** helloworld.c: Sample program for MiniGUI Programming Guide ** The first MiniGUI application. ** ** Copyright (C) 2004 ~ 2007 Feynman Software. ** ** License: GPL */ #include #include #include #include #include #include #include static char welcome_text [512]; static char msg_text [256]; static RECT welcome_rc = {10, 100, 600, 400}; static RECT msg_rc = {10, 100, 600, 400}; static const char* syskey = ""; static int last_key = -1; static int last_key_count = 0; static void make_welcome_text (void) { const char* sys_charset = GetSysCharset (TRUE); const char* format; if (sys_charset == NULL) sys_charset = GetSysCharset (FALSE); SetRect (&welcome_rc, 10, 10, g_rcScr.right - 10, g_rcScr.bottom / 2 - 10); SetRect (&msg_rc, 10, welcome_rc.bottom + 10, g_rcScr.right - 10, g_rcScr.bottom - 20); if (strcmp (sys_charset, FONT_CHARSET_GB2312_0) == 0 || strcmp (sys_charset, FONT_CHARSET_GBK) == 0) { format = "欢迎来到 MiniGUI 的世界! 如果您能看到该文本, 则说明 MiniGUI Version %d.%d.%d 可在该硬件上运行!"; } else if (strcmp (sys_charset, FONT_CHARSET_BIG5) == 0) { format = "欢迎来到 MiniGUI 的世界! 如果您能看到该文本, 则说明 MiniGUI Version %d.%d.%d 可在该硬件上运行!"; } else { format = "Welcome to the world of MiniGUI. /nIf you can see this text, MiniGUI Version %d.%d.%d can run on this hardware board."; } sprintf (welcome_text, format, MINIGUI_MAJOR_VERSION, MINIGUI_MINOR_VERSION, MINIGUI_MICRO_VERSION); strcpy (msg_text, "No message so far."); } static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { HDC hdc; syskey = ""; switch (message) { case MSG_CREATE: make_welcome_text (); SetTimer (hWnd, 100, 200); break; case MSG_TIMER: sprintf (msg_text, "Timer expired, current tick count: %ul.", GetTickCount ()); InvalidateRect (hWnd, &msg_rc, TRUE); printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa/n"); break; case MSG_LBUTTONDOWN: strcpy (msg_text, "The left button pressed."); InvalidateRect (hWnd, &msg_rc, TRUE); break; case MSG_LBUTTONUP: strcpy (msg_text, "The left button released."); InvalidateRect (hWnd, &msg_rc, TRUE); break; case MSG_RBUTTONDOWN: strcpy (msg_text, "The right button pressed."); InvalidateRect (hWnd, &msg_rc, TRUE); break; case MSG_RBUTTONUP: strcpy (msg_text, "The right button released."); InvalidateRect (hWnd, &msg_rc, TRUE); break; case MSG_PAINT: hdc = BeginPaint (hWnd); DrawText (hdc, welcome_text, -1, &welcome_rc, DT_LEFT | DT_WORDBREAK); DrawText (hdc, msg_text, -1, &msg_rc, DT_LEFT | DT_WORDBREAK); EndPaint (hWnd, hdc); return 0; case MSG_SYSKEYDOWN: syskey = "sys"; case MSG_KEYDOWN: if(last_key == wParam) last_key_count++; else { last_key = wParam; last_key_count = 1; } sprintf (msg_text, "The %d %skey pressed %d times", wParam - 1, syskey, last_key_count); InvalidateRect (hWnd, &msg_rc, TRUE); return 0; case MSG_KEYLONGPRESS: sprintf (msg_text, "=======The %d key pressed over a long term", wParam); InvalidateRect (hWnd, &msg_rc, TRUE); break; case MSG_KEYALWAYSPRESS: sprintf (msg_text, "=======The %d key pressed always", wParam); InvalidateRect (hWnd, &msg_rc, TRUE); break; case MSG_KEYUP: sprintf (msg_text, "The %d key released", wParam - 1); InvalidateRect (hWnd, &msg_rc, TRUE); return 0; case MSG_CLOSE: KillTimer (hWnd, 100); DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; } return DefaultMainWinProc(hWnd, message, wParam, lParam); } int MiniGUIMain (int argc, const char* argv[]) { MSG Msg; HWND hMainWnd; MAINWINCREATE CreateInfo; #ifdef _MGRM_PROCESSES JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0); #endif CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; CreateInfo.dwExStyle = WS_EX_NONE; CreateInfo.spCaption = "Hello, world!"; CreateInfo.hMenu = 0; CreateInfo.hCursor = GetSystemCursor(0); CreateInfo.hIcon = 0; CreateInfo.MainWindowProc = HelloWinProc; CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = g_rcScr.right; CreateInfo.by = g_rcScr.bottom; CreateInfo.iBkColor = COLOR_lightwhite; CreateInfo.dwAddData = 0; CreateInfo.hHosting = HWND_DESKTOP; hMainWnd = CreateMainWindow (&CreateInfo); if (hMainWnd == HWND_INVALID) return -1; ShowWindow(hMainWnd, SW_SHOWNORMAL); while (GetMessage(&Msg, hMainWnd)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } MainWindowThreadCleanup (hMainWnd); return 0; } #ifndef _LITE_VERSION #include #endif
把这个实例添加到新建的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跑起来了~
大功告成!