新浪博客

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

2015-02-11 15:08阅读:
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接

第29章 STemWin多任务(uCOS-III)

本期教程主要是在开发板实现上期教程中所说的三种系统。这里大家重点学习一下官方推荐的设计框架即可,如果有不懂的函数会在后面跟大家讲。
29. 1 单任务系统(超级循环)
29. 2 多任务系统:一个任务调用emWin
29. 3 多任务系统:多个任务调用emWin
29. 4 总结

29.1 单任务系统(超级循环)

工程代码的结构如下:
【STemWin教程入门篇】第29章 <wbr>STemWin多任务(uCOS-III)

关于移植的知识已经在前面的第二章详细讲解了,这里重点介绍时间框架和接口函数。

29.1.1 内核接口

内核接口文件GUI_X.C内容如下:
----------------------------------------------------------------------
File : GUI_X.C
Purpose : Config / System dependent externals for GUI
---------------------------END-OF-HEADER------------------------------
*/

#include 'GUI.h'
#include 'stm32f4xx.h'




extern __IO int32_t g_iRunTime;(1)
int GUI_X_GetTime(void)(2)
{

return g_iRunTime;
}

void GUI_X_Delay(int ms)(3)
{
int tEnd = g_iRunTime + ms;
while ((tEnd - g_iRunTime) > 0);
}



void GUI_X_Init(void) {}




void GUI_X_ExecIdle(void) {}



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); }
1. 时间基准全局变量,这个变量在bsp_timer.c文件里面进行了定义,由嘀嗒定时器中断进行调用,每1ms调用一次。


__IO int32_t g_iRunTime = 0;

void SysTick_ISR(void)
{
static uint8_t s_count = 0;
uint8_t i;


if (s_uiDelayCount > 0)
{
if (--s_uiDelayCount == 0)
{
s_ucTimeOutFlag = 1;
}
}


for (i = 0; i < TMR_COUNT; i++)
{
bsp_SoftTimerDec(&s_tTmr[i]);
}


g_iRunTime++;
if (g_iRunTime == 0x7FFFFFFF)
{
g_iRunTime = 0;
}

bsp_RunPer1ms();

if (++s_count >= 10)
{
s_count = 0;

bsp_RunPer10ms();
}
}
2. 供STemWin调用的接口函数,用于获取系统时钟基准。
3. 供STemWin调用的接口函数,用于延迟时间设置。
4. 主要设置上面两个函数即可,其余函数根据需要进行配置。

29.1.2 触摸接口

触摸部分由嘀嗒定时器中周期性的调用:

extern __IO uint8_t s_ucRA8875BusyNow;
void bsp_RunPer10ms(void)
{

if (g_ChipID == IC_8875)
{

if(s_ucRA8875BusyNow == 0)
{
GUI_TOUCH_Exec();
}
}

else
{
GUI_TOUCH_Exec();
}

}

29.1.3 主程序

在文件main.c

int main(void)
{

bsp_Init();

MainTask();
}
在文件MainTask.c

void MainTask(void)
{
int xPos;
int yPos;
int xSize;
int i;

i = 0;


GUI_Init();


xPos = LCD_GetXSize() / 2;
yPos = LCD_GetYSize() / 3;


GUI_SetTextMode(GUI_TM_REV);


GUI_SetFont(GUI_FONT_20F_ASCII);
GUI_DispStringHCenterAt('Hello world!', xPos, yPos);


GUI_SetFont(GUI_FONT_D24X32);

xSize = GUI_GetStringDistX('0000');


xPos -= xSize / 2;
yPos += 24 + 10;
while (1)
{
GUI_DispDecAt( i++, xPos, yPos, 4);
if (i > 9999)
{
i = 0;
}
}
}

功能比较简单,实现效果如下:
【STemWin教程入门篇】第29章 <wbr>STemWin多任务(uCOS-III)

29.2 多任务系统:一个任务调用emWin

前面几期教程配套的例子都是采用的这种方式,实现这种方式也是分为三部分

29.2.1 内核接口

内核接口文件GUI_X.C内容如下:
#include
#include
#include 'GUI_Private.H'
#include 'stdio.H'



static OS_SEM DispSem;
static OS_SEM EventSem;

static OS_SEM KeySem;
static int KeyPressed;
static char KeyIsInited;




int GUI_X_GetTime (void) (1)
{
OS_ERR err;
return OSTimeGet(&err);
}


void GUI_X_Delay (int period) (2)
{
OS_ERR err;
OSTimeDly(period, OS_OPT_TIME_DLY, &err);
}



void GUI_X_ExecIdle (void) (3)
{
GUI_X_Delay(1);
}




void GUI_X_InitOS (void)(4)
{
OS_ERR err;


OSSemCreate((OS_SEM *)&DispSem,
(CPU_CHAR *)'DispSem',
(OS_SEM_CTR )1,
(OS_ERR *)&err);

OSSemCreate((OS_SEM *)&EventSem,
(CPU_CHAR *)'EventSem',

我的更多文章

下载客户端阅读体验更佳

APP专享