⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 rtCell 实时微内核-具有下列功能: 1. 完全抢占的实时微内核结构
💻 C
📖 第 1 页 / 共 2 页
字号:
static CHECKBOX *draw3DCube;
static void CreateGDCWin(void)
{
    WINDOW *pLWin;
    
    pGdc = (GDC *)CreateGDC(120, 120);
    
    rho = 10;
    theta = 0;
    phi = 0;
    ox = - 0.5; oy = - 0.5; oz = - 0.5;
    cx = 0; cy = 0; xr = 0; yr = 0;

    pLWin = CreateWindow(500, 200, 126, 140, NULL,
                   "GDCWin", (PCREATE)NULL, 0);
    draw3DCube = CreateCheckbox(25, 4, 75, 18, pLWin->pMainView,
				     "3D cube", (PCHECK)(NULL), CTRL_ALIGN_VCENTER);
    pLWin->pClientView->pViewProc = GDCViewMSG;
    pGDCView = pLWin->pClientView;
}

//----------------------下面通过透明窗口来生成非矩形窗口----------------------//
static CBOOL _cdecl_ UnViewMSG(VMSG *pMsg)
{
    VIEW *pView = pMsg->pView ;
    int dx, dy, i;  
    WINDOW *pLWin = OBJ_FROM_VIEW(pMsg->pView);

    switch (pMsg->MsgID) { 
    case VMSG_PAINT:
        for (i = 0; i <= (pView->viewRect.bottom-pView->viewRect.top); i++) {
            DrawHLine(pView->viewRect.top+i, pView->viewRect.left, pView->viewRect.left+i, GD_GRAY);
        }

        DrawLine(pView->viewRect.left, pView->viewRect.top,
                   pView->viewRect.right, pView->viewRect.bottom, GD_LIGHTGRAY);
        DrawLine(pView->viewRect.left, pView->viewRect.top+1,
                   pView->viewRect.right-1, pView->viewRect.bottom, GD_WHITE);
        DrawHLine(pView->viewRect.bottom, pView->viewRect.left, pView->viewRect.right, GD_BLACK);
        DrawHLine(pView->viewRect.bottom-1, pView->viewRect.left+1, pView->viewRect.right-1, GD_DARKGRAY);

        DrawVLine(pView->viewRect.left, pView->viewRect.top, pView->viewRect.bottom-1, GD_LIGHTGRAY);
        DrawVLine(pView->viewRect.left+1, pView->viewRect.top+1, pView->viewRect.bottom-2, GD_WHITE);
        
        return (true);
    case VMSG_TOUCH:
        if ((pMsg->pt.y-pView->viewRect.top) >= (pMsg->pt.x-pView->viewRect.left))
            return (true);
        else
            return (-1);
    case MSM_LB_DOWN:
        pLWin->Status |= WIN_MOUSE_CATCH;
        pLWin->ptCatch.x = pMsg->pt.x;
        pLWin->ptCatch.y = pMsg->pt.y;
        return (true);
    case MSM_LB_UP:
        pLWin->Status &= ~(WIN_MOUSE_CATCH|WIN_SIZE|WIN_MOVE);
        return (true);
    case MSM_MS_MOVE:  
        SetMouseCursor(MOVE);
        if ((pLWin->Status & WIN_MOUSE_CATCH)) {
            dx = pMsg->pt.x - pLWin->ptCatch.x;
            dy = pMsg->pt.y - pLWin->ptCatch.y;
            pLWin->ptCatch.x = pMsg->pt.x;
            pLWin->ptCatch.y = pMsg->pt.y;
            MoveView(pView, dx, dy);
        }
        
        return (true);
    default:
        return (false);
    }
}

static void CreateUnnormalWin(void)
{
    EDIT *pLEdit;
    WINDOW *pLWin;
    
    pLWin = CreateWindowEx(550, 0, 150, 150, NULL,
                   "UnnormalWin", (PCREATE)NULL, WIN_HASTRANS);
    SetWinMainViewFun(pLWin, UnViewMSG);
    
    pLEdit = CreateEdit(5, 120, 100, 25, pLWin->pMainView,
				      "unnormal view is here.", (PKEYDOWN)NULL, 0, 80);
    SetViewTrans(pLEdit->pView, false);
    UpdateView(pLWin->pMainView);
}

//----------------------初始化回调函数,用于生成用户窗口----------------------//
void _cdecl_ initHook(void) /* 其中不得包含任何浮点数操作 */
{
    int i = 0;
    WINDOW *pWin = NULL;
    
    /*******************main window 1: havs child window***********************/    
    pWin = CreateWindow(0, 0, 500, 475, NULL,
				     "main window 1: havs child window", (PCREATE)NULL, WIN_RESIZE|WIN_3D_CLIENT|WIN_MAX_BTN|WIN_MIN_BTN);
    CreateBotton(50, 50, 80, 25, pWin->pClientView,
				     "listAdd", listAddbtn);
    CreateBotton(150, 50, 80, 25, pWin->pClientView,
				     "listDel", listDelbtn);
    CreateBotton(250, 50, 80, 25, pWin->pClientView,
				     "New Win", CreateWinbtn);

    pListEdit = CreateEdit(10, 10, 300, 30, pWin->pClientView,
				      "push \"listAdd\" botton to insert edit's text to list.", (PKEYDOWN)NULL, 0, 256);
    CreateLabel(350, 10, 260, 20, pWin->pClientView,
			"Label of main window 1", (PCLICK)NULL, CTRL_ALIGN_VCENTER, 0);
    pList = CreateListbox(330, 80, 300, 200, pWin->pClientView,
				        (PLISTBOXSEL)NULL, 0, 20);
    for (i = 0; i < 16; i ++)
        ListboxAppend(pList, "push \"listDel\" botton to delete the current item.");
    
    pList = CreateListbox(20, 80, 300, 200, pWin->pClientView,
				        (PLISTBOXSEL)NULL, CTRL_LISTBOX_COMB, 20);
    for (i = 0; i < 5; i ++)
        ListboxAppend(pList, "push \"listDel\" botton to delete the current item.");
  
    CreateBotton(50, 290, 80, 25, pWin->pClientView,
				     "treeAdd", treeAddbtn);
    CreateBotton(150, 290, 80, 25, pWin->pClientView,
				     "treeDel", treeDelbtn);
    CreateBotton(250, 290, 80, 25, pWin->pClientView,
				     "treeApp", treeAppbtn);
                     
    /*****************Child window: has parent window**************************/
    pWin = CreateWindow(360, 150, 400, 300, pWin->pClientView,
				     "Child window: has parent window", (PCREATE)NULL, WIN_RESIZE|WIN_3D_CLIENT|WIN_MAX_BTN|WIN_MIN_BTN);
    CreateCheckbox(50, 150, 160, 30, pWin->pClientView,
				     "Set Win 5 Trans", OnCheckTrans, CTRL_ALIGN_VCENTER);
    CreateCheckbox(50, 180, 160, 30, pWin->pClientView,
				     "Set Win 5 Visible", OnCheckVisible, CTRL_ALIGN_VCENTER);
    CreateCheckbox(50, 210, 160, 30, pWin->pClientView,
				     "Set Win 5 Stay on top", OnCheckOnTop, CTRL_ALIGN_VCENTER);

    CreateLabel(560, 50, 60, 50, pWin->pClientView,
			            "Label of Child window", (PCLICK)NULL, CTRL_ALIGN_VCENTER, 0);

    CreateEdit(10, 10, 300, 30, pWin->pClientView,
				      "pure edit is here.pure edit is here.pure edit is here.", (PKEYDOWN)NULL, CTRL_ALIGN_LEFT, 80);

    CreateSlider(300, 60, 60, 200, pWin->pClientView,
				     OnSliderMoveY, CTRL_ALIGN_VCENTER, 50, 0, 480);

    CreateSlider(60, 300, 260, 60, pWin->pClientView,
				     OnSliderMoveX, 0, 0, 0, 640);
                     
    /**************************************************************************/
    pWin = CreateWindow(300, 460, 150, 80, NULL,
				     "trans main TRANS TOP window 2", (PCREATE)NULL, WIN_3D_CLIENT|WIN_RESIZE|WIN_STAYONTOP|WIN_HASTRANS|WIN_MAX_BTN|WIN_MIN_BTN);
    CreateCheckbox(50, 150, 160, 30, pWin->pClientView,
				     "Set Win 5 Trans", OnCheckTrans, CTRL_ALIGN_VCENTER);
    CreateCheckbox(50, 180, 160, 30, pWin->pClientView,
				     "Set Win 5 Visible", OnCheckVisible, CTRL_ALIGN_VCENTER);
    CreateCheckbox(50, 210, 160, 30, pWin->pClientView,
				     "Set Win 5 Stay on top", OnCheckOnTop, CTRL_ALIGN_VCENTER);
    CreateBotton(50, 50, 260, 60, pWin->pClientView,
				     "botton of trans main TOP window 2", (PCLICK)NULL);
    CreateLabel(250, 10, 260, 60, pWin->pClientView,
			    "Label of trans main TRANS TOP window 2", (PCLICK)NULL, CTRL_ALIGN_HCENTER, 0);

    /**************************************************************************/
    pWin = CreateWindow(160, 150, 300, 100, NULL,
				     "main TOP window 3", (PCREATE)NULL, WIN_RESIZE|WIN_STAYONTOP);
    CreateBotton(50, 50, 260, 80, pWin->pClientView,
				     "botton of main TOP window 3", (PCLICK)NULL);
    CreateLabel(50, 150, 260, 80, pWin->pClientView,
			"Label of window 3, abcdefghijklmnopqrstuvwxyz", (PCLICK)NULL, CTRL_ALIGN_HCENTER, CTRL_HTML_LABEL);

    /**************************************************************************/
    pWin = CreateWindow(160, 260, 300, 100, NULL,
				     "main window 4", (PCREATE)NULL, WIN_RESIZE|WIN_MIN_BTN);
    CreateBotton(50, 50, 260, 90, pWin->pClientView,
				     "botton of main window 4", (PCLICK)NULL);
    CreateLabel(50, 150, 260, 90, pWin->pClientView,
			"Label of window 4, ABCDEFGHIJKLMNOPQRSTUVWXYZ", (PCLICK)NULL, CTRL_ALIGN_VCENTER, CTRL_HTML_LABEL);

    /**************************************************************************/
    pGWin = CreateWindow(160, 370, 300, 100, NULL,
				     "trans main TRANS window 5", (PCREATE)NULL, WIN_RESIZE|WIN_HASTRANS|WIN_MAX_BTN|WIN_MIN_BTN);
    CreateBotton(50, 26, 260, 60, pWin->pClientView,
				     "botton of main TRANS window 5", (PCLICK)NULL);
}
//-------------连续执行的浮点数处理任务,用于干扰其它浮点数任务---------------//
static void _cdecl_ rtFloat(void)
{      
    double db;

    InitFPStatus(); /* 初始化浮点数协处理器状态,必须在进行任何浮点数操作之前进行 */

    db = 0.00001;
    
    for (;;) {
        if (db > 1) db = 0.000001;
        db /= 3.1415926;
        db /= 2;
        db *= 0.6;
        db += 0.000001;
    }
}
/*第一个用户任务,用之初始化所有其它用户任务,因此此处称之为 Shell 任务 */
static void _cdecl_ rtShell(void)
{
    double db;
    SetInitHook(initHook);  /* 其中不得包含任何浮点数操作 */
    SetKeybdHook(keybdHook);/* 其中不得包含任何浮点数操作 */
    InitClipBoard(1024*4);
    StartEngine();  /* 启动GUI引擎,注意在此之前不得调用任何浮点数操作 */

    InitFPStatus(); /* 初始化浮点数协处理器状态,必须在进行任何浮点数操作之前进行 */
    GUILock();{
        CreateUnnormalWin();
        CreateGDCWin();
    } GUIUnLock();

    db = 0.00001;
    Sleep(5000);
    db = mmGetFreeMemorySize();
    putf(db);
    ///*创建 10 个连续执行的浮点数任务,用以检验浮点协处理器状态是否得到保护
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 1024, RR_SCH_TASK);
    //*/
    //while (CreateTaskEx((PTASKFUN)rtFloat, 29, NULL, 640, RR_SCH_TASK) != 0);
    db = mmGetFreeMemorySize();
    putf(db);

    for (;;) {
        if (db > 0.01) db = 0.000001;
        db /= 0.3;
        db /= 2;
        db *= 0.6;
        db += 0.000001;
           
        if (pGDCView != NULL) {
            GUILock();{
                if (draw3DCube->Status & CTRL_CHECKBOX_CHECKED)
                    draw3D(&(pGDCView->viewRect));    /* 重绘时钟窗口 */
                else
                    drawClock(&(pGDCView->viewRect)); /* 重绘时钟窗口 */
                UpdateView(pGDCView);
            } GUIUnLock();
        }
        
        Sleep(200);
    }
}

/* 堆内存初始化,必须在进入内核之前完成 */
static BYTE freeMem0[32767];
static BYTE freeMem1[32767];
static BYTE freeMem2[32767];
static BYTE freeMem3[32767];
static BYTE freeMem4[32767];
static BYTE freeMem5[32767];
static void mmInitMem(void)
{
    mmMemoryInit(freeMem0, 32767);
    mmAddToMemPool(freeMem1, 32767);
    mmAddToMemPool(freeMem2, 32767);
    mmAddToMemPool(freeMem3, 32767);
    mmAddToMemPool(freeMem4, 32767);
    mmAddToMemPool(freeMem5, 32767);
}

void _cdecl_ main(void)
{
    CREATE_TASK task;  

    task.pTaskFun = (PTASKFUN)rtShell; /* Shell 任务 */
    task.cwPrio = 7;
    task.pData = NULL;  
    task.poStkSize = 4*1024;

    GUIInitEngine(); /* GUI 引擎初始化,必须在进入内核之前完成 */
    
    _asm cli;
    out_byte(0x20, 0x11);/* ICW1 for master */
    out_byte(0x21, 8);   /* ICW2 for master */
                                                        
    out_byte(0x21, (1 << 2));/* ICW3 tells slaves */
    out_byte(0x21, 1);
    out_byte(0x21, ~(1 << 2));/* IRQ 0-7 mask */

    out_byte(0xA0, 0x11); /* ICW1 for slave */
    out_byte(0xA1, 0x10); /* ICW2 for slave */
                                                       
    out_byte(0xA1, 2);/* ICW3 is slave nr */
    out_byte(0xA1, 1);
    out_byte(0xA1, ~0);/* IRQ 8-15 mask */   

    
    SetTimer(1000); /* 内核定时器周期为 1 毫秒 */
    /* 堆内存,此处设置不当可能造成程序崩溃 */
    mmInitMem();
    mcStartSys(&task, mmAlloc_mem, mmFree_mem); /* 启动内核 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -