|
我用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 )这里。如图
。没有进入栈溢出钩子函数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);
} |
|