如果对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