OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3441|回复: 7

HardFault_Handler 死循环

[复制链接]

5

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-2-26
在线时间
7 小时
发表于 2017-3-4 09:17:13 | 显示全部楼层 |阅读模式
9金钱
程序用的光盘上的RAW_TCP服务器程序,在tcp_server_test函数里增加了些代码,程序如下。每次客户端发送数据时,就会进入到HardFault_Handler死循环里。麻烦大神给看下是什么原因/
void tcp_server_test(void)
{
        err_t err;  
        struct tcp_pcb *tcppcbnew;          //定义一个TCP服务器控制块
        struct tcp_pcb *tcppcbconn;          //定义一个TCP服务器控制块
       
        u8 *tbuf;
        u8 key;
        u8 res=0;               
        u8 t=0;
        u16 byte_len,i,byte_addr;
        u8 byte_cmd,byte_subcmd;
        int byte_cs;
       
        LCD_Clear(WHITE);        //清屏
        POINT_COLOR=RED;         //红色字体
        LCD_ShowString(30,30,200,16,16,"WARSHIP STM32F103");
        LCD_ShowString(30,50,200,16,16,"TCP Server Test");
        LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");  
        LCD_ShowString(30,90,200,16,16,"KEY0:Send data");  
        LCD_ShowString(30,110,200,16,16,"KEY_UPuit");  
        tbuf=mymalloc(SRAMIN,200);        //申请内存
        if(tbuf==NULL)return ;                //内存申请失败了,直接退出
        sprintf((char*)tbuf,"Server IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);//服务器IP
        LCD_ShowString(30,130,210,16,16,tbuf);  
        sprintf((char*)tbuf,"Server Port:%d",TCP_SERVER_PORT);//服务器端口号
        LCD_ShowString(30,150,210,16,16,tbuf);
        tcppcbnew=tcp_new();        //创建一个新的pcb
        if(tcppcbnew)                        //创建成功
        {
                err=tcp_bind(tcppcbnew,IP_ADDR_ANY,TCP_SERVER_PORT);        //将本地IP与指定的端口号绑定在一起,IP_ADDR_ANY为绑定本地所有的IP地址
                if(err==ERR_OK)        //绑定完成
                {
                        tcppcbconn=tcp_listen(tcppcbnew);                         //设置tcppcb进入监听状态
                        tcp_accept(tcppcbconn,tcp_server_accept);         //初始化LWIP的tcp_accept的回调函数
                }else res=1;  
        }else res=1;
        POINT_COLOR=BLUE;//蓝色字体
        while(res==0)
        {
                key=KEY_Scan(0);
                if(key==WKUP_PRES)break;
                if(key==KEY0_PRES)//KEY0按下了,发送数据
                {
                        tcp_server_flag|=1<<7;//标记要发送数据
                }
                if(tcp_server_flag&1<<6)//是否收到数据?
                {
                //        LCD_Fill(30,210,lcddev.width-1,lcddev.height-1,WHITE);//清上一次数据
                //        LCD_ShowString(30,210,lcddev.width-30,lcddev.height-210,16,tcp_server_recvbuf);//显示接收到的数据       
                        if(tcp_server_recvbuf[0]==0x68)
                        {
                               
                                byte_cs=0;
                                byte_len=tcp_server_recvbuf[1]+(tcp_server_recvbuf[2]<<8);
                                byte_addr=tcp_server_recvbuf[4]+(tcp_server_recvbuf[5]<<8);
                                byte_cmd=tcp_server_recvbuf[6];
                                byte_subcmd=tcp_server_recvbuf[7];
                                for(i=0;i<byte_len;i++)
                                        byte_cs=byte_cs+tcp_server_recvbuf[4+i];
                                byte_cs=~byte_cs;
                                byte_cs+=1;
                                byte_cs=byte_cs&0xFF;
                                tcp_server_sendbuf="";
                                tcp_server_sendbuf[0]=0x68;                        //帧起始符
                                tcp_server_sendbuf[3]=0x63;                        //界定符
                                tcp_server_sendbuf[4]=(u8)byte_addr;        //地址低位
                                tcp_server_sendbuf[5]=(u8)(byte_addr>>8);        //地址高位
                                tcp_server_sendbuf[6]=byte_cmd;        //功能号
                                tcp_server_sendbuf[7]=byte_subcmd+100;//子功能号
                                tcp_server_sendbuf[1]=0;//长度低位
                                tcp_server_sendbuf[2]=5;//长度高位
                                if ((u8)byte_cs==tcp_server_recvbuf[4+i])
                                        tcp_server_sendbuf[8]=0x66;
                                else
                                        tcp_server_sendbuf[8]=0x33;
                                byte_cs=0;
                                for(i=0;i<5;i++)
                                        byte_cs=byte_cs+tcp_server_sendbuf[4+i];
                                byte_cs=~byte_cs;
                                byte_cs+=1;
                                byte_cs=byte_cs&0xFF;
                                tcp_server_sendbuf[4+i]=(u8)byte_cs;
                                tcp_server_sendbuf[5+i]=0x16;
                                tcp_server_flag|=1<<7;//标记要发送数据
                        }
                        tcp_server_flag&=~(1<<6);//标记数据已经被处理了.
                }
                if(tcp_server_flag&1<<5)//是否连接上?
                {
                        sprintf((char*)tbuf,"Client IP:%d.%d.%d.%d",lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);//客户端IP
                        LCD_ShowString(30,170,230,16,16,tbuf);
                        POINT_COLOR=RED;
                        LCD_ShowString(30,190,lcddev.width-30,lcddev.height-190,16,"Receive Data:");//提示消息               
                        POINT_COLOR=BLUE;//蓝色字体
                }else if((tcp_server_flag&1<<5)==0)
                {
                        LCD_Fill(30,170,lcddev.width-1,lcddev.height-1,WHITE);//清屏
                }
                lwip_periodic_handle();
                lwip_pkt_handle();
                delay_ms(2);
                t++;
                if(t==200)
                {
                        t=0;
                        LED0=!LED0;
                }
        }   
        tcp_server_connection_close(tcppcbnew,0);//关闭TCP Server连接
        tcp_server_connection_close(tcppcbconn,0);//关闭TCP Server连接
        tcp_server_remove_timewait();
        memset(tcppcbnew,0,sizeof(struct tcp_pcb));
        memset(tcppcbconn,0,sizeof(struct tcp_pcb));
        myfree(SRAMIN,tbuf);
        LCD_Clear(WHITE);                        //清屏
        POINT_COLOR = RED;
        LCD_ShowString(30,30,200,16,16,"WARSHIP STM32F103");
        LCD_ShowString(30,50,200,16,16,"TCP Server Test");
        LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
       
        POINT_COLOR=BLUE;
        LCD_ShowString(30,90,200,16,16,"Connect break!");  
        LCD_ShowString(30,110,200,16,16,"KEY1:Connect");
}

最佳答案

查看完整内容[请看2#楼]

tcp_server_sendbuf=""; 这句以后,你一直在作死。。。 然后到4的时候,终于死了。 问题就在这里,你不要写:tcp_server_sendbuf="";
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-4 09:17:14 | 显示全部楼层
tcp_server_sendbuf="";
这句以后,你一直在作死。。。
然后到4的时候,终于死了。
问题就在这里,你不要写:tcp_server_sendbuf="";
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2017-2-26
在线时间
7 小时
 楼主| 发表于 2017-3-4 09:18:20 | 显示全部楼层
tcp_server_sendbuf[4]=(u8)byte_addr;        //地址低位
每次运行到这就出错
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-11-27
在线时间
14 小时
发表于 2017-4-20 09:06:45 | 显示全部楼层
正点原子 发表于 2017-3-4 09:17
tcp_server_sendbuf="";
这句以后,你一直在作死。。。
然后到4的时候,终于死了。

什么意思啊?原子哥求指教
回复

使用道具 举报

darkise 该用户已被删除
发表于 2017-4-20 09:34:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-11-27
在线时间
14 小时
发表于 2017-4-20 09:49:27 | 显示全部楼层
为什么指针指向的“”空间只有1byte呢?
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-11-27
在线时间
14 小时
发表于 2017-4-20 09:49:51 | 显示全部楼层
darkise 发表于 2017-4-20 09:34
tcp_server_sendbuf是一个指针,tcp_server_sendbuf="";是把这个指针指向了另一个空间,这个空间只有1byt ...

为什么指针指向的“”空间只有1byte呢?
回复

使用道具 举报

darkise 该用户已被删除
发表于 2017-4-20 10:09:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 01:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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