【STemWin教程入门篇】第29章 STemWin多任务(uCOS-III)

标签:
多任务ucos-iiiucguiemwindsp |
分类: emWin |
第29章
STemWin多任务(uCOS-III)
本期教程主要是在开发板实现上期教程中所说的三种系统。这里大家重点学习一下官方推荐的设计框架即可,如果有不懂的函数会在后面跟大家讲。
29.
29.
29.
29.
29.1
单任务系统(超级循环)
工程代码的结构如下:
关于移植的知识已经在前面的第二章详细讲解了,这里重点介绍时间框架和接口函数。
29.1.1 内核接口
内核接口文件GUI_X.C内容如下:
----------------------------------------------------------------------
File
Purpose
---------------------------END-OF-HEADER------------------------------
*/
#include
#include
extern
int
{
return
}
void
{
int
while
}
void
void
void
void
void
1.
__IO
void
{
static
uint8_t
if
{
if
{
s_ucTimeOutFlag
}
}
for
{
bsp_SoftTimerDec(&s_tTmr[i]);
}
g_iRunTime++;
if
{
g_iRunTime
}
bsp_RunPer1ms();
if
{
s_count
bsp_RunPer10ms();
}
}
2.
3.
4.
29.1.2 触摸接口
触摸部分由嘀嗒定时器中周期性的调用:
extern
void
{
if
{
if(s_ucRA8875BusyNow
{
GUI_TOUCH_Exec();
}
}
else
{
GUI_TOUCH_Exec();
}
}
29.1.3 主程序
在文件main.c
int
{
bsp_Init();
MainTask();
}
在文件MainTask.c
void
{
int
int
int
int
i
GUI_Init();
xPos
yPos
GUI_SetTextMode(GUI_TM_REV);
GUI_SetFont(GUI_FONT_20F_ASCII);
GUI_DispStringHCenterAt("Hello
GUI_SetFont(GUI_FONT_D24X32);
xSize
xPos
yPos
while
{
GUI_DispDecAt(
if
{
i
}
}
}
功能比较简单,实现效果如下:
29.2
多任务系统:一个任务调用emWin
前面几期教程配套的例子都是采用的这种方式,实现这种方式也是分为三部分
29.2.1 内核接口
内核接口文件GUI_X.C内容如下:
#include
#include
#include
#include
static
static
static
static
static
int
{
return
}
void
{
}
void
{
}
void
{
OS_ERR
OSSemCreate((OS_SEM
}
void
{
OS_ERR
OSSemPend((OS_SEM
}
void
{
OS_ERR
OSSemPost((OS_SEM
}
U32
{
//uCOS-III中已经没有任务的ID
return
}
void
{
OS_ERR
OSSemPend((OS_SEM
(OS_TICK
(OS_OPT
(CPU_TS
(OS_ERR
}
void
{
OS_ERR
OSSemPost((OS_SEM
}
void
{
if
KeyIsInited
GUI_X_Init();
}
}
void
{
OS_ERR
OSSemCreate((OS_SEM
(CPU_CHAR
(OS_SEM_CTR
(OS_ERR
}
int
{
int
r
CheckInit();
KeyPressed
return
}
int
{
int
OS_ERR
CheckInit();
if
OSSemPend((OS_SEM
(OS_TICK
(OS_OPT
(CPU_TS
(OS_ERR
}
r
KeyPressed
return
}
void
{
OS_ERR
KeyPressed
OSSemPost((OS_SEM
}
void
void
void
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
29.2.2 触摸任务
extern
static
{
while
{
if
{
if(s_ucRA8875BusyNow
{
GUI_TOUCH_Exec();
}
}
else
{
GUI_TOUCH_Exec();
}
BSP_OS_TimeDlyMs(20);
}
}
29.2.3 STemWin任务
void
{
}
这个例子整体的显示效果如下:
29.3
多任务系统:多个任务调用emWin
这个例子也是分为三部分,内核接口和触摸任务跟上面讲的一样,这里主要说一下创建的三个GUI任务。
29.3.1 uCOS创建三个STemWin任务
这三个任务在main.c函数里面创建,三个任务的优先级看相应注释
extern
static
{
while
{
MainTask();
}
}
extern
static
{
while
{
Task_1();
}
}
extern
static
{
while
{
Task_2();
}
}
29.3.2 STemWin任务
建立的三个任务所在文件夹:
MainTask文件中的任务:
#include
#include
static
{
switch
{
case
GUI_SetBkColor(GUI_RED);
GUI_SetColor(GUI_BLACK);
GUI_SetFont(&GUI_FontComic24B_ASCII);
GUI_Clear();
GUI_DispStringAt("Task0
break;
default:
WM_DefaultProc(pMsg);
}
}
static
{
switch
{
case
GUI_SetBkColor(0x00CC00);
GUI_Clear();
GUI_SetFont(&GUI_Font24_ASCII);
GUI_DispStringHCenterAt("STemWin
GUI_SetFont(&GUI_Font13_1);
GUI_DispStringAt("Scrolling
default:
WM_DefaultProc(pMsg);
}
}
void
{
FRAMEWIN_Handle
WM_HWIN
FRAMEWIN_SetActive(hFrameWin,
WM_SelectWindow(hChildWin);
GUI_SetFont(&GUI_FontComic24B_ASCII);
while(1)
{
int
int
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
}
}
void
{
GUI_Init();
WM_SetCreateFlags(WM_CF_MEMDEV);
WM_SetCallback(WM_HBKWIN,
while(1)
{
Task_0();
}
}
App_Task1中的内容:
#include
#include
static
{
WM_HWIN
switch
{
case
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_FontComic24B_ASCII);
GUI_SetTextAlign(GUI_TA_HCENTER
GUI_Clear();
GUI_DispStringHCenterAt("Task1
WM_GetWindowSizeX(hWin)
WM_GetWindowSizeY(hWin)
break;
default:
WM_DefaultProc(pMsg);
}
}
void
{
FRAMEWIN_Handle
20,
WM_HWIN
WM_CF_MEMDEV,_cbCallbackT1,
FRAMEWIN_SetActive(hFrameWin,
while(1)
{
int
int
int
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
}
}
App_Task2中的内容:
#include
#include
static
{
switch
{
case
GUI_SetBkColor(GUI_YELLOW);
GUI_SetColor(GUI_BLACK);
GUI_SetFont(&GUI_FontComic24B_ASCII);
GUI_Clear();
GUI_DispStringAt("Task2
break;
default:
WM_DefaultProc(pMsg);
}
}
void
{
FRAMEWIN_Handle
WM_HWIN
FRAMEWIN_SetActive(hFrameWin,
WM_SelectWindow(hChildWin);
GUI_SetFont(&GUI_FontComic24B_ASCII);
while(1)
{
int
int
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
for
{
WM_MoveWindow(hFrameWin,
GUI_Delay(50);
}
}
}
这个例子的整体显示效果如下:
29.4
总结
本期教程就跟大家讲这么多,希望通过创建的这三个DEMO让大家对STemWin创建裸机或者多任务系统有个整体认识,具体工程中用那种方式要根据实际的需求来决定。