硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4081|回复: 2
收起左侧

[emWin] 经验证,STemWin根本没有办法在基于stm32f429的ucosiii上跑多任务

[复制链接]

4

主题

17

回帖

29

积分

新手上路

积分
29
发表于 2015-12-29 09:45:43 | 显示全部楼层 |阅读模式
日前,我将STemWin移植到了ucosiii上,液晶屏是800x480分辨率,处理器是stm32f429,想硬件实际测试一下多任务的运行情况,发现根本就跑不了多任务,单任务运行的到是都很顺畅,没有出现问题。GUI_OS开关和     GUI_MAXTASK   都进行了配置后,多任务运行出现问题,我只开了两个任务进行stemwin的调用,一个是简单的打印显示信息,另一个是画圆形及一个随机数值,两个任务同时运行的话,除了预定的信息显示外,总是莫名其妙的在液晶屏上其他位置打印一些信息。位置没有固定住。现把两个任务贴出来供大家讨论:
static  void  App_TaskGUI2         (void  *p_arg)
{
OS_ERR err;
int x=200;
OSSemPend(&DisplaySem,
     0,
     OS_OPT_PEND_BLOCKING,
     0,
     &err);           
while(err!=OS_ERR_NONE);
GUI_SetBkColor(GUI_WHITE);
GUI_SetFont(&GUI_Font8x16);
GUI_ClearRect(650,130,780,180);
OSSemPost(&DisplaySem,
   OS_OPT_POST_1,
   &err);
while(err!=OS_ERR_NONE);
while(DEF_TRUE){
OSSemPend(&DisplaySem,
     0,
     OS_OPT_PEND_BLOCKING,
     0,
     &err);           
while(err!=OS_ERR_NONE);

GUI_SetColor(x);
GUI_FillCircle(700, 84, 40);
GUI_DispDecAt(x,700,200,8);
x+=255;
if(x>=16777216){
  x=0;
}
OSSemPost(&DisplaySem,
   OS_OPT_POST_1,
   &err);
while(err!=OS_ERR_NONE);
OSTimeDlyHMSM(0u, 0u, 0, 20u,
      OS_OPT_TIME_HMSM_STRICT,
      &err);
}
}
static  void  App_TaskGUI4         (void  *p_arg)
{
int y=0;
LCD_COLOR BackColor=GUI_WHITE,FrontColor=GUI_BLACK;
OS_ERR err;
CPU_STK_SIZE free,used;
(void)p_arg;
OSSemPend(&DisplaySem,
     0,
     OS_OPT_PEND_BLOCKING,
     0,
     &err);   
while(err!=OS_ERR_NONE);
GUI_SetFont(&GUI_Font6x8);
GUI_SetBkColor(BackColor);
GUI_ClearRect(400,230,799,479);
GUI_SetTextMode(GUI_TM_NORMAL);
OSSemPost(&DisplaySem,
    OS_OPT_POST_1,
    &err);
while(err!=OS_ERR_NONE);  
while(DEF_TRUE){
  
  OSSemPend(&DisplaySem,
     0,
     OS_OPT_PEND_BLOCKING,
     0,
     &err);   
  while(err!=OS_ERR_NONE);
  BackColor=GUI_WHITE;
  FrontColor=GUI_BLACK;
  GUI_SetColor(FrontColor);
  GUI_SetTextMode(GUI_TM_NORMAL);
  OSTaskStkChk(&AppTaskStartTCB,&free,&used,&err);
  GUI_DispStringAt("AppTaskStart  used/free:",400,230);
  GUI_DispDecAt(used,660,230,4);
  GUI_DispDecAt(free,710,230,4);
   
  OSTaskStkChk(&App_GUITask2TCB,&free,&used,&err);
  GUI_DispStringAt("App_GUITask2  used/free:",400,270);
  GUI_DispDecAt(used,660,270,4);
  GUI_DispDecAt(free,710,270,4);
  
  OSTaskStkChk(&App_GUITask3TCB,&free,&used,&err);
  GUI_DispStringAt("App_GUITask3  used/free:",400,280);
  GUI_DispDecAt(used,660,280,4);
  GUI_DispDecAt(free,710,280,4);
  
  OSTaskStkChk(&App_GUITask4TCB,&free,&used,&err);
  GUI_DispStringAt("App_GUITask4  used/free:",400,290);
  GUI_DispDecAt(used,660,290,4);
  GUI_DispDecAt(free,710,290,4);
  
  GUI_DispStringAt("os_time_get return:",400,300);
  GUI_DispDecAt(OSTimeGet(&err),660,300,8);
  
  GUI_DispStringAt("os_StartTask CPUUsage and CtxSwCtr is:",400,320);
  GUI_DispDecAt(AppTaskStartTCB.CPUUsage,660,320,8);
  GUI_DispDecAt(AppTaskStartTCB.CtxSwCtr,730,320,8);
  
  GUI_DispStringAt("os_task2 CPUUsage and CtxSwCtr is:",400,350);
  GUI_DispDecAt(App_GUITask2TCB.CPUUsage,660,350,8);
  GUI_DispDecAt(App_GUITask2TCB.CtxSwCtr,730,350,8);
   
  GUI_DispStringAt("os_task4 CPUUsage and CtxSwCtr is:",400,390);
  GUI_DispDecAt(App_GUITask4TCB.CPUUsage,660,390,8);
  GUI_DispDecAt(App_GUITask4TCB.CtxSwCtr,730,390,8);

  __DSB();
  OSSemPost(&DisplaySem,
    OS_OPT_POST_1,
    &err);
  while(err!=OS_ERR_NONE);  
  OSTimeDlyHMSM(0u, 0u, 0, 30u,
      OS_OPT_TIME_HMSM_STRICT,
      &err);
}
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-12-29 10:06:21 | 显示全部楼层
emWin的多任务程序设计很容易出问题,在60期emWin教程里面就有创建三个emWin任务运行,没问题。

我自己设计的程序,从来没有跑过多任务,出问题了不容易找原因。

个人意见,仅供参考,看看其他网友有这方面的经验不。
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2015-12-29 12:34:02 | 显示全部楼层
Windows是不是也不允许多任务使用呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-13 06:09 , Processed in 0.301484 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表