一、前言

像我们学习一门编语言那样,从码一个hello world应用程序开始我们的Zeta Linux之旅!嵌入式产品常伴有带显示与不带显示之分,即使同一类产品,也会存在是否有显示的形态差异。比如行车记录仪,有带显示屏的小机及后视镜,也有不带显示屏的口红机及隐藏式记录仪。下文将展示如何编写一个不含GUI的在终端窗口打印hello world的程序,以及一个包含嵌入式GUI的在显示屏上通过GUI控制显示hello world的程序。

二、终端程序

一个Zeta Linux程序/模块至少包含两部分,Makefile文件zeta.in以及源码文件。本例中,应用程序名字为demo_terminal_helloworld,创建相应的文件:

  1. cd ZetaLinux/app
  2. mkdir demo_terminal_helloworld/
  3. touch zeta.in main.c

编写Makefile文件:

  1. TARGET_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. TARGET_INC:=
  4. TARGET_SRC:= main.c
  5. TARGET_CPPFLAGS += -fPIC -Wall
  6. TARGET_CFLAGS += -fPIC -Wall
  7. TARGET_MODULE := demo_terminal_helloworld
  8. include $(BUILD_BIN)

编写源码文件:

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. printf("hello world.\n");
  6. }

编译应用程序:

  1. cd ZetaLinux/app/demo_terminal_helloworld
  2. zmake zeta.in

将编译生成的可执行文件通过adb推送到设备里面运行,可在终端输出”hello world.”。

三、GUI程序

Zeta Linux支持多种GUI引擎,目前在Zeta上顺利运行使用的GUI有MiniGUI、DireceFB、QT、LittlevGL。本例中使用MiniGUI。使用MiniGUI需要在zeta.in中显式指定程序所用的MiniGUI动态库,zeta.in如下:

  1. TARGET_PATH :=$(call my-dir)
  2. include $(ENV_CLEAR)
  3. TARGET_SRC := ./main.c
  4. TARGET_SHARED_LIB += libminigui_ths
  5. TARGET_MODULE := demo_gui_helloworld
  6. include $(BUILD_BIN)

编写源码文件,在窗口中输出Hello world!

  1. #include <minigui/common.h>
  2. #include <minigui/minigui.h>
  3. #include <minigui/gdi.h>
  4. #include <minigui/window.h>
  5. #include <sys/time.h>
  6. static BITMAP bmp_bkgnd;
  7. static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
  8. {
  9. HDC hdc;
  10. static HWND hwnd;
  11. static int i = 0;
  12. switch (message)
  13. {
  14. case MSG_PAINT:
  15. {
  16. hdc = BeginPaint (hWnd);
  17. TextOut (hdc, 320 / 2 - 50, 240 / 2 - 10, "Hello world!");
  18. EndPaint (hWnd, hdc);
  19. return 0;
  20. }
  21. case MSG_CREATE:
  22. {
  23. hwnd = CreateWindowEx(
  24. "static", "", WS_CHILD | WS_VISIBLE,
  25. WS_EX_NONE, 123, 0, 0, 50, 50, hWnd, NULL
  26. );
  27. SetWindowBkColor(hwnd, RGBA2Pixel(HDC_SCREEN, 0x00, 0x00, 0xff, 0x10));
  28. break;
  29. }
  30. case MSG_CLOSE:
  31. {
  32. DestroyMainWindow (hWnd);
  33. PostQuitMessage (hWnd);
  34. return 0;
  35. }
  36. }
  37. return DefaultMainWinProc (hWnd, message, wParam, lParam);
  38. }
  39. int MiniGUIMain(int argc, const char* argv[])
  40. {
  41. MSG Msg;
  42. HWND hMainWnd;
  43. MAINWINCREATE CreateInfo;
  44. #ifdef _MGRM_PROCESSES
  45. JoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);
  46. #endif
  47. CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
  48. CreateInfo.dwExStyle = WS_EX_NONE;
  49. CreateInfo.spCaption = "HelloWorld";
  50. CreateInfo.hMenu = 0;
  51. CreateInfo.hCursor = GetSystemCursor (0);
  52. CreateInfo.hIcon = 0;
  53. CreateInfo.MainWindowProc = HelloWinProc;
  54. CreateInfo.lx = 0;
  55. CreateInfo.ty = 0;
  56. CreateInfo.rx = 320;
  57. CreateInfo.by = 240;
  58. CreateInfo.iBkColor = RGBA2Pixel(HDC_SCREEN, 0xff, 0xff, 0xff, 0x00);
  59. CreateInfo.dwAddData = 0;
  60. CreateInfo.hHosting = HWND_DESKTOP;
  61. hMainWnd = CreateMainWindow (&CreateInfo);
  62. if(hMainWnd == HWND_INVALID)
  63. return -1;
  64. ShowWindow (hMainWnd, SW_SHOWNORMAL);
  65. while (GetMessage (&Msg, hMainWnd))
  66. {
  67. fprintf(stderr, "msg\n");
  68. TranslateMessage (&Msg);
  69. DispatchMessage (&Msg);
  70. }
  71. UnloadBitmap(&bmp_bkgnd);
  72. MainWindowThreadCleanup (hMainWnd);
  73. return 0;
  74. }
  75. #ifndef _MGRM_PROCESSES
  76. #include <minigui/dti.c>
  77. #endif

将编译生成的可执行文件通过adb推送到设备里面运行,可在显示屏上显示”hello world.”。