无操作系统,通过以下程序在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);
}
}
工程文件,放到Lm3s8962目录下可调试
根本就不能确定错误到底出现在哪儿?在单步调试的时候,有时候这里产生FaultISR,有时有在另一个地方,有时候能能过,有时候不能通过。