10319|11

15

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求救!在LM3s8962使用LwIP建立TCP连接时遇到的问题 [复制链接]

    无操作系统,通过以下程序在keil中建立TCP客户端时,总是会在 tcp_connect()函数里出现问题(FaultISR),但在IAR中式可以的,为什么?lwipopt.h配置是一样的,只不过在IAR中使用的是LwIP1.3.0而在Keil中使用的是LwIP1.3.1.。现在我将源码俯下:

 

 

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "driverlib/ethernet.h"

#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "utils/lwiplib.h"
#include "drivers/rit128x96x4.h"


        
#define My_Mac_ID   {0XFF,0xFF,0xFF,0xFF,0xF1,0xF1}
static const unsigned char pucMACAddress[] = My_Mac_ID;

#define SYSTICKHZ                100
#define SYSTICKMS               (1000 / SYSTICKHZ)
#define SYSTICKUS               (1000000 / SYSTICKHZ)
#define SYSTICKNS               (1000000000 / SYSTICKHZ)

 


#define SYSTICK_INT_PRIORITY    0x80
#define ETHERNET_INT_PRIORITY   0xC0

 

unsigned char IPAddress[] = MY_IP_ID;
unsigned char NetMaskAddr[] = IP_MARK_ID;
unsigned char GwWayAddr[] = MY_GATEWAY_ID;

 

const static char TCP_TestData[]="This is LwIP TCP Client 在Luminary Cortex-M3上的测试!\r\n";

 


void
SysTickIntHandler(void)
{
   
  lwIPTimer(SYSTICKMS);
}

void Delay(unsigned long ulVal)
{
   while(--ulVal!=0);
}



void
DisplayIPAddress(unsigned long ipaddr, unsigned long ulCol,
                 unsigned long ulRow)
{
    char pucBuf[16];
    unsigned char *pucTemp = (unsigned char *)&ipaddr;
     usprintf(pucBuf, "%d.%d.%d.%d", pucTemp[0], pucTemp[1], pucTemp[2],
             pucTemp[3]);

  RIT128x96x4StringDraw(pucBuf, ulCol, ulRow, 15);
}

 

err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
   tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0);     
  
   tcp_close(pcb);
  
   return ERR_OK;
}


void TCP_Client_Init()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr ipaddr;
 
  IP4_ADDR(&ipaddr,192,168,0,127);
 
  Clipcb = tcp_new();                       
 
  tcp_bind(Clipcb,IP_ADDR_ANY,1026);      
 
  tcp_connect(Clipcb,&ipaddr,1026,TcpCli_Connected);
}

 


int
main(void)
{
 unsigned long,ulIPAddr,ulNetMask,ulGWAddr;
 
  unsigned long ulIPAddress;

    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
  
     


    RIT128x96x4Init(1000000);
    RIT128x96x4StringDraw("BOARD A IP ADDRESS", 12, 0, 15);


    SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
    SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);

    SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
    SysTickEnable();
    SysTickIntEnable();

    IntMasterEnable();


 ulIPAddr=0xC0A80064;  //192.168.0.100
    ulNetMask=0xFFFFFF00;  //255.255.255.0
 ulGWAddr=0xC0A80001;  //192.168.0.1

        lwIPInit(pucMACAddress,ulIPAddr, ulNetMask, ulGWAddr, IPADDR_USE_STATIC);

  
   ulIPAddress = lwIPLocalIPAddrGet();
     RIT128x96x4StringDraw("IP:   ", 0, 16, 15);
        RIT128x96x4StringDraw("MASK: ", 0, 24, 15);
        RIT128x96x4StringDraw("GW:   ", 0, 32, 15);
  RIT128x96x4StringDraw("AS A TCP CLIENT!", 0, 40, 15);
        DisplayIPAddress(ulIPAddress, 36, 16);
        ulIPAddress = lwIPLocalNetMaskGet();
        DisplayIPAddress(ulIPAddress, 36, 24);
        ulIPAddress = lwIPLocalGWAddrGet();
        DisplayIPAddress(ulIPAddress, 36, 32);

    while(1)
    {
   TCP_Client_Init();
      Delay(1000000UL); 
      Delay(1000000UL);
      Delay(1000000UL);


    }
}

TCPcon1.zip

552.4 KB, 下载次数: 148

工程文件,放到Lm3s8962目录下可调试

最新回复

#include #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_nvic.h" #include "inc/hw_types.h" #include "inc/hw_sysctl.h" #include "driverlib/ethernet.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/systick.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "utils/lwiplib.h" #include "utils/ustdlib.h" #define My_Mac_ID  {0X00,0x14,0x97,0x0F,0x1D,0xE3}  //存储以太网控制器的物理地址,即MAC地址 #define MY_IP_ID        {192,168,0,100}                   //以太网通信的IP地址 #define IP_MARK_ID    {255,255,255,0}             //255.255.255.0,子网掩码 #define MY_GATEWAY_ID   {192,168,0,1}                     //以太网通信的网关地址 static const unsigned char pucMACAddress[]=My_Mac_ID; static const unsigned char IPAddress[] = MY_IP_ID; static const unsigned char NetMaskAddr[] = IP_MARK_ID; static const unsigned char GwWayAddr[] = MY_GATEWAY_ID; const static unsigned char TCP_TestData[]="This is LwIP TCP Client测试!\r\n"; #define SYSTICKHZ 100 #define SYSTICKMS (1000 / SYSTICKHZ) #define SYSTICKUS (1000000 / SYSTICKHZ) #define SYSTICKNS (1000000000 / SYSTICKHZ) void SysTickIntHandler(void) {       lwIPTimer(SYSTICKMS); } void Delay(unsigned long ulVal) /* 利用循环产生一定的延时 */ { while ( --ulVal != 0 ); }    err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err) { tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0); /* 发送数据 */ tcp_close(pcb); return ERR_OK; } void TCP_Client_Init() {   struct tcp_pcb *Clipcb;   struct ip_addr ipaddr;      IP4_ADDR(&ipaddr,192,168,0,127);      Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb)      tcp_bind(Clipcb,IP_ADDR_ANY,1026);       // 绑定本地IP地址和端口号   tcp_connect(Clipcb,&ipaddr,1026,TcpCli_Connected); } void enet_udp(void) {    struct ip_addr ulIPAddr,ulNetMask,ulGWAddr;       if(REVISION_IS_A2)     {         SysCtlLDOSet(SYSCTL_LDO_2_75V);     }     SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |                    SYSCTL_XTAL_8MHZ);         SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);     SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);     GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);     SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);     SysTickEnable();     SysTickIntEnable();     IntMasterEnable();         IP4_ADDR(&ulIPAddr,IPAddress[3],IPAddress[2],IPAddress[1],IPAddress[0]);         IP4_ADDR(&ulNetMask,NetMaskAddr[3],NetMaskAddr[2],NetMaskAddr[1],NetMaskAddr[0]);         IP4_ADDR(&ulGWAddr,GwWayAddr[3],GwWayAddr[2],GwWayAddr[1],GwWayAddr[0]);         lwIPInit(pucMACAddress,ulIPAddr.addr, ulNetMask.addr, ulGWAddr.addr, IPADDR_USE_STATIC); while(1) {     TCP_Client_Init();     Delay(1000000UL);       Delay(1000000UL);     Delay(1000000UL); } } 怎么没有我要的试验现象啊,我用的是keil4平台,测试工具上看不出数据的发送  详情 回复 发表于 2012-6-4 15:16
 
点赞 关注

回复
举报

10

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看到这些代码真的很亲切 以前经常做这些 不过现在都忘了
 
个人签名汽车租赁
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
我是偶尔进一次FaultISR,直接在里面break试试
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

4
 

根本就不能确定错误到底出现在哪儿?在单步调试的时候,有时候这里产生FaultISR,有时有在另一个地方,有时候能能过,有时候不能通过。

 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

5
 
经过进一步的分析,我发现同样的程序在IAR里边就能成功,在Keil里边就是硬Fault,伤心啊...
 
 
 

回复

640

帖子

0

TA的资源

五彩晶圆(初级)

6
 
我不知道,顶一顶,盼望高手出现。:$
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

7
 
:( 楼主最后怎么解决的问题?
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(初级)

8
 
如楼主所述,我猜测是iar和keil配置分配的堆栈空间不同,你lwip在keil里可能已经写到了堆栈之类的空间去了。
其实,进入中断后,你可以去看 user mode 或者sys mode下的pc是多少,
据此找到出事的代码处。我猜测多数是在lwip分配一个新内存区后,另外一个进程从函数返回就挂了。
这种鸟事,我之前干一个项目时把我折腾的那个叫惨!
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

9
 
我也是被折腾惨了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

10
 

winge再详细解释一下吧

还是不太明白:L
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

11
 
我最后检查出来是LWIP的缓冲区溢出了:D
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

12
 

求救!在LM3s8962使用LwIP建立TCP连接时遇到的问题

#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"

#include "driverlib/ethernet.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"

#include "utils/lwiplib.h"
#include "utils/ustdlib.h"


#define My_Mac_ID  {0X00,0x14,0x97,0x0F,0x1D,0xE3}  //存储以太网控制器的物理地址,即MAC地址
#define MY_IP_ID        {192,168,0,100}                   //以太网通信的IP地址
#define IP_MARK_ID    {255,255,255,0}             //255.255.255.0,子网掩码
#define MY_GATEWAY_ID   {192,168,0,1}                     //以太网通信的网关地址
static const unsigned char pucMACAddress[]=My_Mac_ID;
static const unsigned char IPAddress[] = MY_IP_ID;
static const unsigned char NetMaskAddr[] = IP_MARK_ID;
static const unsigned char GwWayAddr[] = MY_GATEWAY_ID;

const static unsigned char TCP_TestData[]="This is LwIP TCP Client测试!\r\n";
#define SYSTICKHZ 100
#define SYSTICKMS (1000 / SYSTICKHZ)
#define SYSTICKUS (1000000 / SYSTICKHZ)
#define SYSTICKNS (1000000000 / SYSTICKHZ)


void
SysTickIntHandler(void)
{
   
  lwIPTimer(SYSTICKMS);
}

void Delay(unsigned long ulVal) /* 利用循环产生一定的延时 */
{
while ( --ulVal != 0 );
}
  
err_t TcpCli_Connected(void *arg,struct tcp_pcb *pcb,err_t err)
{
tcp_write(pcb,TCP_TestData,sizeof(TCP_TestData),0); /* 发送数据 */
tcp_close(pcb);
return ERR_OK;
}


void TCP_Client_Init()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr ipaddr;
  
  IP4_ADDR(&ipaddr,192,168,0,127);
  
  Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb)
  
  tcp_bind(Clipcb,IP_ADDR_ANY,1026);       // 绑定本地IP地址和端口号
  tcp_connect(Clipcb,&ipaddr,1026,TcpCli_Connected);
}



void
enet_udp(void)
{

   struct ip_addr ulIPAddr,ulNetMask,ulGWAddr;
      if(REVISION_IS_A2)
    {
        SysCtlLDOSet(SYSCTL_LDO_2_75V);
    }
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);
   
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
    SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);

    SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
    SysTickEnable();
    SysTickIntEnable();
    IntMasterEnable();

        IP4_ADDR(&ulIPAddr,IPAddress[3],IPAddress[2],IPAddress[1],IPAddress[0]);
        IP4_ADDR(&ulNetMask,NetMaskAddr[3],NetMaskAddr[2],NetMaskAddr[1],NetMaskAddr[0]);
        IP4_ADDR(&ulGWAddr,GwWayAddr[3],GwWayAddr[2],GwWayAddr[1],GwWayAddr[0]);
        lwIPInit(pucMACAddress,ulIPAddr.addr, ulNetMask.addr, ulGWAddr.addr, IPADDR_USE_STATIC);

while(1)
{
    TCP_Client_Init();
    Delay(1000000UL);  
    Delay(1000000UL);
    Delay(1000000UL);
}
}

怎么没有我要的试验现象啊,我用的是keil4平台,测试工具上看不出数据的发送
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表