请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0 M0 向结构体赋值进入HardFault异常

[复制链接]
hgh22102 提问时间:2016-8-10 12:07 /
现在有一个项目,使用STM32F030R8单片机,外挂W5500 TCP/IP协议栈,开发环境使用MDK5.14;单片机已更换过,或者单独运行有异常的代码,问题还是存在的;
单片机ROM为64K,内存8K,MDK使用默认设置;

项目编译后,调试运行到结构体赋值时产生了HardFault异常,找不到原因!
############MAP文件的信息#######################
==============================================================================


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   

     28704       1750       4984        172       3580     367126   Grand Totals
     28704       1750       4984        172       3580     367126   ELF Image Totals
     28704       1750       4984        172          0          0   ROM Totals

==============================================================================

    Total RO  Size (Code + RO Data)                33688 (  32.90kB)
    Total RW  Size (RW Data + ZI Data)              3752 (   3.66kB)
    Total ROM Size (Code + RO Data + RW Data)      33860 (  33.07kB)

==============================================================================

######################代码#########################
下面是代码:
  头文件中的结构体定义:
typedef struct _RIP_MSG
{
uint32 xid;
   uint8  op;
   uint8  htype;
   uint8  hlen;
   uint8  hops;
   uint16 secs;
   uint16 flags;
   uint8  ciaddr[4];
   uint8  yiaddr[4];
   uint8  siaddr[4];
   uint8  giaddr[4];
   uint8  chaddr[16];
   uint8  sname[64];
   uint8  file[128];
   uint8  OPT[312];

}RIP_MSG;
---------------------------------------------------------------------------------------------------------------------
C文件中的代码:
uint8 EXTERN_DHCPBUF[1024];//定义数组
RIP_MSG * pRIPMSG = (RIP_MSG*)EXTERN_DHCPBUF;                        //定义结构体指针
---------------------------------------------------------------------------------------------------------------------
产生异常的代码(如果注释掉这些代码,整个工程就可以正常运行):
        memset((void*)pRIPMSG,0,sizeof(RIP_MSG));                        //  发生异常  将结构体初始化为0 ,
或:
        pRIPMSG->op = DHCP_BOOTREQUEST;//没异常
        pRIPMSG->htype = DHCP_HTYPE10MB;//没异常
        pRIPMSG->hlen = DHCP_HLENETHERNET;//没异常
        pRIPMSG->hops = DHCP_HOPS;//没异常
        temp= (unsigned int *)pRIPMSG->xid; //没异常
  *temp=  htonl(DHCP_XID);  //发生异常  这里htonl(DHCP_XID)的数值=0x78563412;



调试时的汇编代码:
    99:         temp= (unsigned int *)pRIPMSG->xid;
0x08005FB6 489F      LDR      r0,[pc,#636]  ; @0x08006234
0x08005FB8 6800      LDR      r0,[r0,#0x00]
0x08005FBA 6805      LDR      r5,[r0,#0x00]
   100:   *temp=  htonl(DHCP_XID);
0x08005FBC 489E      LDR      r0,[pc,#632]  ; @0x08006238
0x08005FBE 6800      LDR      r0,[r0,#0x00]
0x08005FC0 F7FFFBFC  BL.W     htonl (0x080057BC)
0x08005FC4 6028      STR      r0,[r5,#0x00]  //在这里发生异常

---------------------------------------------------------------------------------------------------------------------
麻烦各位,帮忙看看哪里有问题?






收藏 1 评论13 发布时间:2016-8-10 12:07

举报

13个回答
wm20031015 回答时间:2016-8-10 14:21:47
temp= (unsigned int *)pRIPMSG->xid; //查一下temp指针指向的地址,可能是4字节对齐问题
hgh22102 回答时间:2016-8-10 16:21:53
wm20031015 发表于 2016-8-10 14:21
temp= (unsigned int *)pRIPMSG->xid; //查一下temp指针指向的地址,可能是4字节对齐问题 ...

这个地址是4字节对齐的,当需要赋值下一个元素时,PC值会加4;这个结构体里面只有这一个是4字节,其他都是单字节或2个字节
lulugl 回答时间:2016-8-16 09:29:50
我来学习一下结构体的用法,不知道哪位大神推荐一下,谢谢
anobodykey 回答时间:2016-8-16 09:31:31
memset((void*)pRIPMSG,0,sizeof(RIP_MSG));这个第一个参数你转成void指针不对吧,应该是char指针才对吧
arm8686 回答时间:2016-8-16 10:20:23
memset((void*)pRIPMSG,0,sizeof(RIP_MSG));                        //  发生异常  将结构体初始化为0

RIP_MSG 只是一个形参。
需要声明一个实参。
RIP_MSG Rip_Msg;
arm8686 回答时间:2016-8-16 10:23:28
还有这样的测试方式:
使用 1024 直接替换 sizeof(RIP_MSG) 。这样可能会出现对齐的问题,可以先试试。
应该不会在初始化阶段就进入异常。
langtian99 回答时间:2016-8-16 10:39:26
为什么要引入temp,  这样"pRIPMSG->xid=htonl(DHCP_XID);"不甘心?
无薪税绵 回答时间:2016-8-16 10:43:13
查一下这个
temp= (unsigned int *)pRIPMSG->xid;

temp应该是个指针吧,看看地址是否正常。
野火_firege 回答时间:2016-8-16 18:59:13
代码好多,帮顶
feixiang20 回答时间:2016-8-16 21:38:35
先要定位到引起出错的那条指令,才好找出原因
zero99 回答时间:2016-9-1 09:29:28
问题解决了吗
隔壁老谢 回答时间:2016-11-3 10:13:46
楼主你好,我也遇到同样的问题,程序卡死在        pRIPMSG->xid = DHCP_XID;//htonl(DHCP_XID);。该怎么解决呢?求指教
海欣景景 回答时间:2021-10-21 17:43:55
大佬问题解决了吗
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版