硬汉嵌入式论坛

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

[emWin] 用Emwin的Graph小工具更新数据出现死机,卡死在FreeRTOS内

[复制链接]

6

主题

41

回帖

59

积分

初级会员

积分
59
发表于 2016-12-27 15:02:13 | 显示全部楼层 |阅读模式
我用FreeRtos创建了3个任务 分别是TaskLed  ,TaskKey ,TaskEmwin,优先级分别是2 3 4,中断分组是组4(即16个抢占式优先级,0个子优先级)。
创建两个定时器中断 串口发送中断(优先级3)和定时器3中断(优先级13) freertos 配置为一秒1000个tick。(中断优先级和freertos任务优先级的关系式怎么样的?)
串口发送中断在emwin任务中不停打印GUI_ALLOC_GetNumFreeBytes,同时执行GUI_EXE();
定时器3 10ms中断获取ADC数值并执行 GRAPH_DATA_YT_AddValue(_ahData[0], Adc);函数更新数据。执行一段时间后freertos会卡死在void vListInsert( List_t * const pxList, ListItem_t * constpxNewListItem )这里。如图   QQ图片20161227143737.png 。没有进入栈溢出钩子函数vApplicationStackOverflowHook和HardFault_Handler.如果我在中断里吧GRAPH_DATA_YT_AddValue(_ahData[0], Adc)注释掉不会有问题。下面是graph函数

#include "GraphDemo.h"
static GRAPH_SCALE_Handle _hScaleV;   // Handle of vertical scale
static GRAPH_SCALE_Handle _hScaleH;   // Handle of horizontal scale
static GRAPH_DATA_Handle  _ahData[1];
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[]=
{
  {FRAMEWIN_CreateIndirect, "Graph widget demo",  0                ,   0,   0, 320, 240, FRAMEWIN_CF_MOVEABLE},
  { GRAPH_CreateIndirect,     0,                   GUI_ID_GRAPH0    ,   5,   5, 265, 170 },
  { SLIDER_CreateIndirect,     NULL,               GUI_ID_SLIDER0,       115,180, 100,16, 0,0},

};
void InitDialog2(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    WM_HWIN  hItem = WM_GetDialogItem(hWin, GUI_ID_GRAPH0);;
    FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
    _ahData[0] =GRAPH_DATA_YT_Create(GUI_RED,5000,0,0);
      GRAPH_AttachData(hItem, _ahData[0]);
    GRAPH_SetGridDistY(hItem, 25);
    GRAPH_SetGridVis(hItem, 1);
    GRAPH_SetGridFixedX(hItem, 1);
    _hScaleV = GRAPH_SCALE_Create( 35, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 25);
    GRAPH_SCALE_SetTextColor(_hScaleV, GUI_YELLOW);
    GRAPH_AttachScale(hItem, _hScaleV);
    _hScaleH = GRAPH_SCALE_Create(155, GUI_TA_HCENTER, GRAPH_SCALE_CF_HORIZONTAL, 50);
    GRAPH_SCALE_SetTextColor(_hScaleH, GUI_DARKGREEN);
    GRAPH_AttachScale(hItem, _hScaleH);
}

static void _cbCallback2(WM_MESSAGE *pMsg)
{
    int NCode, Id;
    WM_HWIN hicon,hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:        
            break;
        case WM_INIT_DIALOG:            
                InitDialog2(pMsg);
            break;
        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                        hicon = WM_GetDialogItem(WM_HBKWIN, GUI_ID_ICONVIEW0);
                        WM_SetFocus(hicon);
                        GUI_EndDialog(hWin, 1);   
                        TIM_Cmd(TIM3, DISABLE);
                        GRAPH_DATA_YT_Clear(_ahData[0]);
                    break;
                case GUI_KEY_ENTER:
                    break;                 
            }
            break;                    
        default:
            WM_DefaultProc(pMsg);
    }

}

void DEMO_GraphView(void)
{
    WM_HWIN hDlg;
    WM_HWIN hGraph = 0;
    portBASE_TYPE  pdStatus;
    hDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbCallback2, 0, 0, 0);
    TIM3_Int_Init(1000,7199);
}
void TIM3_IRQHandler(void)   
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
            _AddValues(Get_Adc(1)/20);
            TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );     
        }
}
void _AddValues(I16 pAdc)
{
     GRAPH_DATA_YT_AddValue(_ahData[0], pAdc);
}
回复

使用道具 举报

6

主题

41

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2016-12-27 15:08:31 | 显示全部楼层
IMG_1876.JPG
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-27 15:08:50 | 显示全部楼层
建议不要在硬件中断里面更新Greaph,不安全。

给对话框创建emWin自带的定时器,使用自带的定时器更新。
回复

使用道具 举报

6

主题

41

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2016-12-27 15:10:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:建议不要在硬件中断里面更新Greaph,不安全。

给对话框创建emWin自带的定时器,使用自带的定时器更新。
 (2016-12-27 15:08) 
自带的定时器更新 为什么1ms特别慢
回复

使用道具 举报

6

主题

41

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2016-12-27 15:11:53 | 显示全部楼层
另外这个函数GRAPH_DATA_YT_AddValue(_ahData[0], pAdc)。我能调用多快怎么知道?
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2016-12-27 15:12:00 | 显示全部楼层

回 tianheyun 的帖子

tianheyun:自带的定时器更新 为什么1ms特别慢 (2016-12-27 15:10)
这种图形更新不要太快,一般一秒左右就可以的。 实际执行更新是在GUI_Delay的时候。
更新快了,眼睛也看不到的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-27 15:12:02 | 显示全部楼层

回 tianheyun 的帖子

tianheyun:自带的定时器更新 为什么1ms特别慢 (2016-12-27 15:10) 
Graph控件就是这样的,不适合高速显示,仅适合慢速的温度曲线等功能。
回复

使用道具 举报

6

主题

41

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2016-12-27 15:19:23 | 显示全部楼层
我用硬件定时器更新其实可以很快,这个控件如果不能更新这么快,根本就不适用啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-27 15:21:47 | 显示全部楼层

回 tianheyun 的帖子

tianheyun:我用硬件定时器更新其实可以很快,这个控件如果不能更新这么快,根本就不适用啊 (2016-12-27 15:19) 
是的,不实用。价值不大
回复

使用道具 举报

6

主题

41

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2016-12-27 15:49:12 | 显示全部楼层




我拍了两个视频一个是硬件定时器一个是软定时 这差太多
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-27 16:09:59 | 显示全部楼层

回 tianheyun 的帖子

tianheyun:



我拍了两个视频一个是硬件定时器一个是软定时 这差太多 (2016-12-27 15:49)
其实一样的,第一个演示里面,你可以多调用几次GRAPH_DATA_YT_AddValue
循环调用260次。然后再刷新,就跟第二种效果一样。
回复

使用道具 举报

6

主题

41

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2016-12-27 17:13:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:其实一样的,第一个演示里面,你可以多调用几次GRAPH_DATA_YT_AddValue
循环调用260次。然后再刷新,就跟第二种效果一样。

 (2016-12-27 16:09) 
我刚才试了下,确实这样,再问个问题,我看示波器都有存储深度这个参数,那如果一次连续高速采样放入RAM后续处理,如果存储深度满了去处理显示。会不会出现此时刻正在显示时波形漏采?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-12-28 10:17:30 | 显示全部楼层

回 tianheyun 的帖子

tianheyun:我刚才试了下,确实这样,再问个问题,我看示波器都有存储深度这个参数,那如果一次连续高速采样放入RAM后续处理,如果存储深度满了去处理显示。会不会出现此时刻正在显示时波形漏采? (2016-12-27 17:13) 
满了的话,防止后续波形覆盖。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-18 07:43 , Processed in 0.059673 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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