MDK ARM,结构体指针作为入参,成员变量地址错误

fulangsuowa 2013-05-27 01:14:09
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上测试,问题依旧;


请大家帮我分析分析,看看是什么原因???
...全文
368 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fulangsuowa 2013-05-27
  • 打赏
  • 举报
回复
问题已解决,原因是引用了另外一个同事的头文件,里面有一个#pragma pack(2),没有用#pragma pack(push)和#pragma pack(pop)做保护。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧