UCGUI 联系客服

发布时间 : 星期三 文章UCGUI更新完毕开始阅读40228020aaea998fcd220e05

(void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking and clear stack */ OSTaskCreateExt(Task1),

(void *)&Task1Data, /* Arguments passed to TaskStart() */ (void *)&Task1Stk[TASK_STK_SIZE-1], /* Set Top-Of-Stack */ 11, /* Lowest priority level */ 0, /* Task ID,no use */ &Task1Stk[0], /* Set Bottom-Of-Stack */

TASK_STK_SIZE, (void *)0, /* No TCB extension */

OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking and clear stack */ OSStart(); }

void TaskStart(TASKDATA *pdata) {

LED_OFF(D22);

RTICTL = 0xCF; /* 20ms Interrupt 分频系数为 32*10^4 */ CRGINT |= 0x80; /* Enable Interrupt */ pdata = pdata; while(1) {

LED_TOGGLE(D24); /* 让LED进入相反状态 */ OSTimeDly(1); } }

24

void Task1(TASKDATA *pdata) { for(;;) {

LED_TOGGLE(D25); OSTimeDly(10); } }

可以观察LED等是否正常显示。在OSTickISR函数中会调用OSIntExit,然后调用OSIntCtxSw函数,之后回到任务2,可以单步执行这个过程,查找出错地方。 测试一个象uC/OS II一样的多任务实时内核并不复杂,甚至可以在没有应用程序的情况下测试。换句话说,就是让这个实时内核在目标板上跑起来,让内核自己测试自己。这样做有两个好处:第一,避免使本来就复杂的事情更加复杂;第二,如果出现问题,可以知道问题出在内核代码上而不是应用程序。刚开始的时候可以运行一些简单的任务和时钟节拍中断服务例程。一旦多任务调度成功地运行了,再添加应用程序的任务就是非常简单的工作了。

3.2UcGui程序调试与移植

UCGUI 与UCOS 一样, 也提供了大量的可配制功能选项, 采用的方式也是在

头文件中进行预定义, 这与UCOS 是一样的。 预定义将决定可以使用的UCGUI 图形功能以及UCGUI 运行所须要的功能。

3.2.1Gui图形预定义控制 (Guiconfig.h)

#ifndef GUICONF_H #define GUICONF_H

#define GUI_OS (1) /* Compile with multitasking support */ #define GUI_SUPPORT_TOUCH (1) /* Support a touch screen (req win-manag er) */

25

#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */

#define GUI_DEFAULT_FONT &GUI_Font6x8

#define GUI_ALLOC_SIZE 12500 /* Size of dynamic memory For WM and memory devices*/

#define GUI_WINSUPPORT 1 /* Window manager package available */ #define GUI_SUPPORT_MEMDEV 1 /* Memory devices available */ #define GUI_SUPPORT_AA 1 /* Anti aliasing available */ #endif /* Avoid multiple inclusion */

(1)GUI_OS 是否须要多任务支持。 #if !GUI_OS #define GUI_LOCK() #define GUI_UNLOCK() #define GUITASK_INIT() #else

#define GUI_LOCK() GUI_Lock() #define GUI_UNLOCK() GUI_Unlock() #define GUITASK_INIT() GUITASK_Init() #endif

在Core\\guitask。C 文件中, 如果GUI_OS 未定义, 则会: void GUI_Unlock(void) {} void GUI_Lock(void) {} void GUITASK_Init(void) {}

void GUITASK_StoreDefaultContext(void) {}

将上面的几个函数都定义为空的。那什么都不做。所以GUI_OS 的主要作用是在进行多任时支持时的互锁功能。当有了多任务支持,才有必要提供锁的功能。 这种锁功能对于资源的访问可以做到独占性而避免出现死锁或使用过程中被修改的情况,在模拟器当中, 这几个函数的实现都是通过WINDOWS 的信息量功能来实现的。

26

GUI_OS 未定义时,将被定义为0。 #ifndef GUI_OS #define GUI_OS 0 #endif

(2)关于GUI_SUPPORT_TOUCH

这个是关于触摸屏的支持, 首先必须是硬件有触摸的支持。 (3)关于GUI_SUPPORT_UNICODE

是否支持UNICODE 码的预定义, 如果进行了预定义,那么显示字符前会先转化为UNICODE码。 主要在GUIUC0。C 文件中提供。 (4)GUI_DEFAULT_FONT

缺省字体, 在GUI\\CORE\\FONT 文件夹下, 提供了十几种字体的支持, 这里的预定义将决定哪种字体将被支持, 要UCGUI 中字体是点阵形式处理的, 而且是与GUI 编译在一起, 使用哪种字体就会将哪种字体编译进去。在这里。 如果要支持多种字体, 而又采用字体与 GUI 代码编译在一起的做法, 将使GUI的资源占用非常大。缺省字体占用关不多8K左右。 (5)GUI_ALLOC_SIZE 动态内存的使用

GUI_ALLOC_SIZE 指定UCGUI 可自己动态使用的内存量, 默认的是12500, 差不多是12K 左右。UCGUI 中使用动态内存管理是类似NEW,DELETE 的,原理是一样的, 但比较简单一点。 使用的是双向链表, 在整个内存(12500)没有使用之前,链表中只有一个节点, 当申请过一次后, 就会变成两个节点,一个记载申请的结点的内存信息,另外一个则是剩余内存信息。 (6)关于GUI_WINSUPPORT

GUI_WINSUPPORT 是用于是否须要窗口支持的, 在UCGUI 当中提供了Frame winodws,edit, button, progress等基本的图形控件,与WINDOWS 上的类似, 但目前的功能则还不尽人意,图形效果与功能都不强。 (7)关于GUI_SUPPORT_MEMDEV

GUI_SUPPORT_MEMDEV 是指显示时, 是直接写一个一个象素到显示设备, 还是在内存当中当画好所有要画一屏幕点后再全部一次写到显示设置。这两点的主要区

27