(3)码一个Zeta Linux应用程序

    科技2022-07-10  126

    一、前言

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

    二、终端程序

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

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

    编写Makefile文件:

    TARGET_PATH:= $(call my-dir) include $(CLEAR_VARS) TARGET_INC:= TARGET_SRC:= main.c TARGET_CPPFLAGS += -fPIC -Wall TARGET_CFLAGS += -fPIC -Wall TARGET_MODULE := demo_terminal_helloworld include $(BUILD_BIN)

    编写源码文件:

    #include <stdio.h> #include<stdlib.h> int main() { printf("hello world.\n"); }

    编译应用程序:

    cd ZetaLinux/app/demo_terminal_helloworld zmake zeta.in

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

    三、GUI程序

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

    TARGET_PATH :=$(call my-dir) include $(ENV_CLEAR) TARGET_SRC := ./main.c TARGET_SHARED_LIB += libminigui_ths TARGET_MODULE := demo_gui_helloworld include $(BUILD_BIN)

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

    #include <minigui/common.h> #include <minigui/minigui.h> #include <minigui/gdi.h> #include <minigui/window.h> #include <sys/time.h> static BITMAP bmp_bkgnd; static int HelloWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { HDC hdc; static HWND hwnd; static int i = 0; switch (message) { case MSG_PAINT: { hdc = BeginPaint (hWnd); TextOut (hdc, 320 / 2 - 50, 240 / 2 - 10, "Hello world!"); EndPaint (hWnd, hdc); return 0; } case MSG_CREATE: { hwnd = CreateWindowEx( "static", "", WS_CHILD | WS_VISIBLE, WS_EX_NONE, 123, 0, 0, 50, 50, hWnd, NULL ); SetWindowBkColor(hwnd, RGBA2Pixel(HDC_SCREEN, 0x00, 0x00, 0xff, 0x10)); break; } case MSG_CLOSE: { 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 = "HelloWorld"; CreateInfo.hMenu = 0; CreateInfo.hCursor = GetSystemCursor (0); CreateInfo.hIcon = 0; CreateInfo.MainWindowProc = HelloWinProc; CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreateInfo.by = 240; CreateInfo.iBkColor = RGBA2Pixel(HDC_SCREEN, 0xff, 0xff, 0xff, 0x00); CreateInfo.dwAddData = 0; CreateInfo.hHosting = HWND_DESKTOP; hMainWnd = CreateMainWindow (&CreateInfo); if(hMainWnd == HWND_INVALID) return -1; ShowWindow (hMainWnd, SW_SHOWNORMAL); while (GetMessage (&Msg, hMainWnd)) { fprintf(stderr, "msg\n"); TranslateMessage (&Msg); DispatchMessage (&Msg); } UnloadBitmap(&bmp_bkgnd); MainWindowThreadCleanup (hMainWnd); return 0; } #ifndef _MGRM_PROCESSES #include <minigui/dti.c> #endif

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

    Processed: 0.008, SQL: 8