如何使用过程的RT-Thread运行emwin

如果对enwin移植一个操作系统,那么他们的中心文件是GUI_OS_X.c文件,我们可以看一下官方的UCOSIII是怎么编写的源码。

static OS_SEM   *DispSem;   /* 显示的信号量 */
static OS_SEM   *EventSem;

static OS_SEM *KeySem;     /* 按键信号量 */
static int    KeyPressed;
static char   KeyIsInited;

首先这个文件定义了三个信号量来做操作系统与emwin通讯的

int GUI_X_GetTime(void) {
        OS_ERR err;
        return ((int)OSTimeGet(&err));   /* 获取系统时间,此处时间单元为1ms */ }
    
    /* GUI延时函数 */ void GUI_X_Delay(int period) {
    
        OS_ERR err;
        CPU_INT32U ticks;
        ticks = (period * 1000) / OSCfg_TickRate_Hz;
        OSTimeDly(ticks, OS_OPT_TIME_PERIODIC, &err); /* UCOSIII延时采用周期模式 */ }
    
    void GUI_X_ExecIdle(void) {
    
        GUI_X_Delay(1);
    
    }
    
    void GUI_X_InitOS(void) {
        OS_ERR err;
        /*创建初始值为1的信号量,用于共享资源 */
        OSSemCreate ((OS_SEM *    )DispSem,
                     (CPU_CHAR *  )"Disp_SEM",
                     (OS_SEM_CTR  )1,
                     (OS_ERR *    )&err);
        /* 创建初始值为1的信号量,用于事件触发 */
        OSSemCreate ((OS_SEM *    )EventSem,
                     (CPU_CHAR *  )"Event_SEM",
                     (OS_SEM_CTR  )0,
                     (OS_ERR *    )&err); }
    
    /*等待信号量 */ void GUI_X_Lock(void) {
        OS_ERR err;
        OSSemPend(DispSem, 0, OS_OPT_PEND_BLOCKING, 0, &err);  /*请求信号量 */ } /*发送信号量 */ void GUI_X_Unlock(void) {
        OS_ERR err;
        OSSemPost(DispSem, OS_OPT_POST_1, &err);        /*发送信号量 */ }
    
    /*放回任务ID,此处返回的是任务优先级,由于UCOSIII支持时间片
    *轮转调度,因此如果使用了时间片轮转调度功能的话有可能会出错! */ U32 GUI_X_GetTaskId(void) {
        return ((U32)(OSTCBCurPtr->Prio)); /* 获取任务优先级,也就是任务ID */ }
    
    void GUI_X_WaitEvent(void) {
        OS_ERR err;
        OSSemPend(EventSem, 0, OS_OPT_PEND_BLOCKING, 0, &err);  /* 请求信号量 */ }
    
    void GUI_X_SignalEvent(void) {
        OS_ERR err;
        OSSemPost(EventSem, OS_OPT_POST_1, &err);    /* 发送信号量  */ }
    
    static void CheckInit(void) {
        if (KeyIsInited == DEF_FALSE)
        {
            KeyIsInited = DEF_TRUE;
            GUI_X_Init();
        } }
    
    void GUI_X_Init(void) {
        OS_ERR err;
        /* 创建初始值为1的信号量 */
        OSSemCreate ((OS_SEM *    )KeySem,
                     (CPU_CHAR *  )"Key_SEM",
                     (OS_SEM_CTR  )0,
                     (OS_ERR *    )&err); }
    
    int GUI_X_GetKey(void) {
        int r;
    
        r = KeyPressed;
        CheckInit();
        KeyPressed = 0;
        return (r); }
    
    int GUI_X_WaitKey(void) {
        int r;
        OS_ERR err;
    
        CheckInit();
    
        if (KeyPressed == 0)
        {
            OSSemPend(KeySem, 0, OS_OPT_PEND_BLOCKING, 0, &err);  /* 请求信号量 */
        }
    
        r = KeyPressed;
        KeyPressed = 0;
        return (r); }
    
    void GUI_X_StoreKey(int k) {
        OS_ERR err;
        KeyPressed = k;
        OSSemPost(KeySem, OS_OPT_POST_1, &err);  /* 发送信号量 */ }
    
    void GUI_X_Log     (const char *s) {
        GUI_USE_PARA(s); } void GUI_X_Warn    (const char *s) {
        GUI_USE_PARA(s); } void GUI_X_ErrorOut(const char *s) {
        GUI_USE_PARA(s); }

如果我们学习了RT-Thread 的就知道一样的原理,定义三个信号量来让操作系统与emwin之间通讯。

/* 定义信号量控制块 */
static rt_sem_t DispSem = RT_NULL;
static rt_sem_t EventSem = RT_NULL;

static rt_sem_t KeySem;     /* 按键信号量 */
static int      KeyPressed;
static char     KeyIsInited;


我们下一期讲解如何手动移植RT-Thread操作系统。回复RTT
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值