野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10283|回复: 8

[ucos] 火哥,ucos-ii+ucGUI不能正常运行,求解!

[复制链接]
发表于 2013-7-8 14:12:13 | 显示全部楼层 |阅读模式
ucos-ii单独运行没问题,但是加了ucGUI3.90以后,ucos-ii就不能正常进行任务调度了。
硬件仿真,发现程序一直在GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0)(注:这是由uCGUIBuilder生成的函数)这个函数里出不来,然后其他的任务都没运行。求解!!!
回复

使用道具 举报

发表于 2013-7-8 16:25:39 | 显示全部楼层
排除法解决,慢慢屏蔽不相关代码,再来确定问题位置
回复 支持 反对

使用道具 举报

发表于 2013-7-8 17:43:41 | 显示全部楼层
1. 把你的任务优先级和任务的代码贴一下。
2. GUI_ExecDialogBox是阻塞对话框,不删除是不会执行后面的程序的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-8 20:03:13 | 显示全部楼层
Alice2013 发表于 2013-7-8 17:43
1. 把你的任务优先级和任务的代码贴一下。
2. GUI_ExecDialogBox是阻塞对话框,不删除是不会执行后面的程序 ...

1.任务优先级如下:
#define STARTUP_TASK_PRIO       6
#define TASK_LED2_PRIO       5
#define TASK_LED3_PRIO       4
任务代码如下:
void Task_LED(void *p_arg)
{
    (void)p_arg;                               
           OSTaskCreate(Task_LED2,(void *)0,
           &task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);


        OSTaskCreate(Task_LED3,(void *)0,
           &task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);


    MainTaskbutton1();                   //程序在这里面循环
    while (1)
    {
        LED1( ON );
        OSTimeDlyHMSM(0, 0,0,100);
        LED1( OFF);
        OSTimeDlyHMSM(0, 0,0,100);
               
        WM_Exec();
    }
}

void Task_LED2(void *p_arg)
{
        (void)p_arg;

        while(1)
        {
                LED2(ON);
                OSTimeDlyHMSM(0,0,0,30);
                LED2(OFF);
                GUI_TOUCH_Exec();//获取坐标
                OSTimeDlyHMSM(0,0,0,30);
        }
}

void Task_LED3(void *p_arg)
{
        (void)p_arg;
       
        while(1)
        {
                LED3(ON);
                OSTimeDlyHMSM(0,0,0,800);
                LED3(OFF);
                OSTimeDlyHMSM(0,0,0,800);
                                               
        }
}

其中MainTaskbutton1()是由uCGUIBuilder生成的函数,其中关键内容如下:
void MainTaskbutton1(void)
{
//    GUI_Init();
//        GUI_CURSOR_Show();
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */

    GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);

    //实际上是程序在这里面的WM_Exec()和WM_Exec1()两个函数间不停地循环
}
2.uCGUIBuilder建立的都是这种GUI_ExecDialogBox对话框,这种阻塞对话框应该不会干扰任务的切换啊,任务怎么会
停止呢?
结果是:LED1不亮,LED2和LED3一直亮着,显示屏显示出了正确的窗口和按钮,但是由于任务不能切换,导致GUI_TOUCH_Exec()这个函数执行不了,这才是最悲剧的!
回复 支持 反对

使用道具 举报

发表于 2013-7-8 20:43:04 | 显示全部楼层
1. 你的程序里面是不是Task_LED比Task_LED2和Task_LED3的优先级都要高,
2 而你在Task_LED里面做了一个阻塞式对话框的显示,正如你上面说的在阻塞对话框的程序里面一直是在执行
   WM_Exec()和WM_Exec1()两个函数间不停地循环,这样就无法执行任务的切换, 任务切换需要相应的函数
   ,才能执行切换,比如OSTimeDlyHMSM(0,0,0,30)或OSTimeDly。
3, 所以不建议使用阻塞对话框作为主界面的显示,你把它改成非阻塞的就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-9 09:40:16 | 显示全部楼层
Alice2013 发表于 2013-7-8 20:43
1. 你的程序里面是不是Task_LED比Task_LED2和Task_LED3的优先级都要高,
2 而你在Task_LED里面做了一个阻塞 ...

        OSInit();
        OSTaskCreate(Task_LED,(void *)0,
           &startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);

        OSStart();
1.任务优先级如下:
#define STARTUP_TASK_PRIO       6
#define TASK_LED2_PRIO       5
#define TASK_LED3_PRIO       4
Task_LED的优先级最低,Task_LED3的优先级最高。而且LED2和LED3亮了没有灭(初始化的时候我把3个灯都关了的),也说明任务Task_LED2和任务Task_LED3都是先执行了的,只是执行到OSTimeDlyHMSM()时又切换到到任务Task_LED里就没有再切换回来了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-9 09:44:03 | 显示全部楼层
Alice2013 发表于 2013-7-8 20:43
1. 你的程序里面是不是Task_LED比Task_LED2和Task_LED3的优先级都要高,
2 而你在Task_LED里面做了一个阻塞 ...

3, 所以不建议使用阻塞对话框作为主界面的显示,你把它改成非阻塞的就可以了

主界面对话框怎么才能改成非阻塞的?
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2013-7-9 09:45:40 | 显示全部楼层
Alice2013 发表于 2013-7-8 20:43
1. 你的程序里面是不是Task_LED比Task_LED2和Task_LED3的优先级都要高,
2 而你在Task_LED里面做了一个阻塞 ...

3, 所以不建议使用阻塞对话框作为主界面的显示,你把它改成非阻塞的就可以了

主界面对话框怎么才能改成非阻塞的?
回复 支持 反对

使用道具 举报

发表于 2013-7-12 18:04:58 | 显示全部楼层
lzw520 发表于 2013-7-9 09:45
3, 所以不建议使用阻塞对话框作为主界面的显示,你把它改成非阻塞的就可以了

主界面对话框怎么才能改 ...

void MainTask(void)
{
    GUI_Init();
    WM_SetCreateFlags(WM_CF_MEMDEV);
    WM_SetDesktopColor(GUI_BLUE);      /* Automacally update desktop window */
    //下面的这个就是非阻塞的,关于阻塞和非阻塞,手册里面都有讲解
    GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    while(1)
    {
       GUI_Delay(100);
    }
}  
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-22 11:21 , Processed in 0.029836 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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