MDK-ARM:4.53.0.0
Ucos:V2.91
lcd_if.h中信息结构体定义
typedef struct
{
B_T stB;
Z_T stZ;
D_T stD;
W_T stW;
OB_T stOB;
OD_T stOD;
E_T stE;
} INFO_T;
extern INFO_T g_stInfo;
lcd_if.c中全部变量定义及任务定义:
INFO_T g_stInfo;
void get_info_task(void* pvParam)
{
u8 ucErr = 0;
u8 ucRate = 0;
E_T stEvent;
/* 初始化 */
…………
while (1)
{
/* 如果从队列中获取stE成功,将其copy给g_stInfo.stE */
if (0 == get_event(&stE))
{
memcpy(&g_stInfo.stE, stEvent,sizeof(stEvent));
}
else
{
Switch (ucRate)
{
/* 根据不同情况给g_stInfo的其他成员赋值 */
}
}
OSTimeDlyHMSM(0, 0 , 0, 200);
}
}
lcd_display.c文件中,包含lcd_if.h,任务定义:
void lcd_update_static(INFO_T *pstInfo)
{
/* 此函数根据pstInfo计算绘图的个数和颜色,由于发生地址指向错误,pstInfo->stZ.ucZNum,pstInfo->stOB.ucNum均取值错误,导致计算失败 */
……
return;
}
void lcd_display_task(void *pvParam)
{
u8 ucErr = 0;
/* 初始化 */
…………
while (1)
{
if (NORMAL_DISPLAY == g_enDisplayState)
{
if (g_stDrawCtrlFlag.b1Update)
{
lcd_update_static(&g_stInfo);
lcd_update_dynamic(&g_stInfo, &g_stLcdLast);
g_stDrawCtrlFlag.b1Update = 0;
}
lcd_draw_update_data(&g_stInfo);
lcd_draw_status_icon(&g_stInfo);
OSTimeDlyHMSM(0, 0, 0, 300);
}
}
}
现象如下:
1. 当调试进入lcd_update_static后,如图,g_stInfo和pstInfo的成员地址不一样,导致取值错误
(由于是公司代码,不敢完全上传,故屏蔽部分定义,望见谅)
2. 如果我在B_T或者D_T加入unsigned char aucRev[2], 会导致get_info_task任务中的memcpy出错,直接进入HardFault_Handler错误中断;调整stD放在第一个或者最后一个,均会发生此现象;
3. 在MDK-ARM:4.23.0.0上测试,问题依旧;
请大家帮我分析分析,看看是什么原因???