硬汉嵌入式论坛

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

[emWin] ewmin+ucosii2.8x的问题

[复制链接]

91

主题

289

回帖

562

积分

金牌会员

积分
562
发表于 2014-8-8 17:50:44 | 显示全部楼层 |阅读模式
移植了ucosii,弄了3个任务,两个是LED闪烁,一个是串口任务,可以正常使用。
然后把ewmin5.20加入,如果LCD显示任务是显示一堆数值,是可以的,没有问题,
如果画一个圆也没有问题,GUI_DrawCircle(120, 60,50);
如果要使用控件,绘制进度条就有问题,屏幕就是黑色的,但是其他任务(LED闪烁)还在运行。
如果是绘制一个填充的多边形(display_draw())就进入Handfault中断错误。

/* LCD显示任务 */
void TaskLCD(void *pdata)
{
    pdata = pdata;
    GUI_SetBkColor(GUI_GREEN);
    GUI_Clear();
    while(1)
    {
        //display_ProgBar();
        display_number();
        //MainTask_display();
        //display_draw();
        //GUI_DrawCircle(120, 60,50);
        OSTimeDlyHMSM(0,0,0,100);
    }
}


void display_number(void)
{
   
    GUI_SetFont(&GUI_Font8x16);
    GUI_SetTextStyle(GUI_TS_NORMAL);
   
    GUI_DispDecAt(-1234,0,150,5);           /* 负号也算一位 */
    GUI_DispDecAt(1234,60,150,4);           /* 显示十进制数"1234"*/
    GUI_DispDecAt(1234,120,150,5);          /* 显示位数多于实际数值,会在前面加0 */
   
    GUI_GotoXY(180,150);
    GUI_DispDecShift(1234,5,2);             /* 显示一个带小数点的整数,小数点也要算位数 */
   
    GUI_GotoXY(240,150);
    GUI_DispSDec(1234,5);                   /* 显示带符号的整数,如果是正数,显示“+”,符号要算位数*/
   
    GUI_GotoXY(300,150);
    GUI_DispSDecShift(1234,6,2);            /* 显示带符号和小数点整数,如果是正数,显示“+”,符号要算位数 */

    GUI_GotoXY(0,170);
    GUI_DispSFloatMin(1.2356,6);            /* 显示浮点数:1.235600,位数表示小数点后的位数 */
   
    GUI_GotoXY(80,170);
    GUI_DispString(GUI_GetVersionString());   
}


void display_draw()
{
    GUI_Init();
    GUI_SetBkColor(GUI_YELLOW);
    GUI_Clear();
    GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);
    GUI_FillCircle(120,64,40);
    GUI_SetDrawMode(GUI_DRAWMODE_XOR);
    GUI_FillCircle(140,84,40);
}

以上函数在裸机上单独运行都是可以的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2014-8-8 17:59:23 | 显示全部楼层
你是在F4板子上面运行的吗
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
 楼主| 发表于 2014-8-10 21:36:56 | 显示全部楼层
我是在V2的板子上运行的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2014-8-11 18:00:59 | 显示全部楼层
你的程序有问题,你得先在while(1)之外先做初始化,然后再绘制一次就行了,不用循环调用绘制。
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
 楼主| 发表于 2014-8-12 08:38:17 | 显示全部楼层
我的初始化部分是在主程序中的,如下,
int main(void)
{   
    unsigned char os_err;
   
    SysTick_init();
    NVIC_Configuration();        
    usart1_init(9600);
    LED_init();
    LCD_InitHard();
    TOUCH_InitHard();
    //SysTick_init();
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);   
    GUI_Init();  
   
    OSInit();
    os_err = OSTaskCreate((void(*)(void *))TaskStart,(void *)0,(OS_STK *)&TASK_START_STK[TaskStart_STK_SIZE - 1],TaskStart_Prio);
   
    OSTimeSet(0);       /* 节拍计数器清0 */
    OSStart();
    return 0;

}
你的意思是不是把LCD显示部分改成这样:

void TaskLCD(void *pdata)
{
    pdata = pdata;
    GUI_SetBkColor(GUI_GREEN);
    GUI_Clear();
    display_ProgBar();
    while(1)
    {      
        OSTimeDlyHMSM(0,0,0,100);
    }
}

我试了一下,还是不行,还是进入Handfault中断。
还是我初始化部分就不对?但是在裸机的情况下是可以的,而且不做任何更改,执行display_number();或GUI_DrawCircle(120, 60,50);是可以的
回复

使用道具 举报

38

主题

136

回帖

40

积分

初级会员

积分
40
发表于 2014-8-12 16:05:50 | 显示全部楼层

回 feiante 的帖子

feiante:我的初始化部分是在主程序中的,如下,
int main(void)
{  
    unsigned char os_err;
    
....... (2014-08-12 08:38) 
你的系统怎么这么初始化呢,UCOS有规范的初始化顺序,一定要按照顺序来,要不后面问题很多的。
回复

使用道具 举报

91

主题

289

回帖

562

积分

金牌会员

积分
562
 楼主| 发表于 2014-8-12 22:14:30 | 显示全部楼层
才学习ucos,什么是规范的初始化顺序
回复

使用道具 举报

38

主题

136

回帖

40

积分

初级会员

积分
40
发表于 2014-8-13 18:13:45 | 显示全部楼层

回 feiante 的帖子

feiante:才学习ucos,什么是规范的初始化顺序 (2014-08-12 22:14) 
可以看下我写的那个UCOS-III教程
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 10:04 , Processed in 0.173179 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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