各位大哥,有空帮我解决下问题吗,我在ucosii上移植lwip,没有lwip功能,ucosii是正常的,添加lwip的功能后,ucosii跑着跑着就进入了HardFault_Handler,搞了好多天了实在搞不懂了,请大伙帮帮忙了,谢谢。
下面是main.c中的代码:
#include "stm32f4x7_eth.h"
#include "stm32f4x7_eth_bsp.h"
#include "netconf.h"
#include "main.h"
#include "lwip/tcp.h"
#include "usart.h"
#include <stdio.h>
#include "stm32f4xx.h"
#include "ucos_ii.h"
#include "app_cfg.h"
#include "bsp.h"
#include "led.h"
#include "tcpip.h"
/* this variable is used to create a time reference incremented by 10ms */
__IO uint32_t LocalTime = 0;
uint32_t timingdelay;
USART DebugUart;
unsigned short Sec_flag = 0;//全局变量,代表1s时钟信号
OS_EVENT * MsgQueue; ///<监控任务队列
void * MsgQueueBuf[16]; ///<监控任务入口
OS_STK AppStartTaskStk_1[SYS_TASK_START_STK_SIZE];
#define TASK1_PRIO 11
#define TASK1_STK_SIZE 512//128
static void task1(void *p_arg);
static OS_STK task1_stk[TASK1_STK_SIZE];
/*************************************************************************************
* 函数名称:main()
* 参数 :void
* 返回值 :void
* 描述 :程序主入口main函数
**************************************************************************************/
int main(void)
{
OSInit();
OSTaskCreate(SystemRunTask,
(void *)0,
&AppStartTaskStk_1[SYS_TASK_START_STK_SIZE-1],
SYS_TASK_START_PRIO_1);
OSStart();
return (0);
}
/***************************************************************************
* 函数名称:SystemRunTask()
* 参数 :void
* 返回值 :void
* 描述 :指示系统正常工作的任务执行程序
****************************************************************************/
void SystemRunTask (void *p_arg)
{
unsigned int i,j;
/*add a long delay wait for DP83848 finish reset*/
for(i=0;i<50;i++)
{
for(j=0;j < 65500;j++);
}
(void)p_arg;
OS_CPU_SysTickInit();
/* Configure ethernet (GPIOs, clocks, MAC, DMA) */
ETH_BSP_Config();
/* Initilaize the LwIP stack */
// LwIP_Init();
/* Initilaize the leds rtc and net interrupt */
BSP_Init();
OSTaskCreate(task1, (void *)0,&task1_stk[TASK1_STK_SIZE - 1], TASK1_PRIO);
/* infinite loop */
while(1)
{
OSTimeDly(500);
}
}
static void task1(void *p_arg)
{
INT32U message;
INT8U err;
MsgQueue = OSQCreate(&MsgQueueBuf[0], 16);// 建立监控任务的消息队列
while (1)
{
message = (INT32U)OSQPend(MsgQueue, 0, &err);
switch(message)
{
case MSG_RTC_1SECOND:
STM_EVAL_LEDToggle(LED1);
break;
default:
break;
}
}
}
/*********************************************************************************
*函数名:ETH_IRQHandler
*描述:网络通信中断函数
*返回值:无
**********************************************************************************/
void ETH_IRQHandler(void)
{
OSIntEnter(); /* Tell uC/OS-II that we are starting an ISR */
/* Handles all the received frames */
while(ETH_CheckFrameReceived() != 0)
{
LwIP_Pkt_Handle();
}
LwIP_Periodic_Handle(LocalTime);
/* Clear the Eth DMA Rx IT pending bits */
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
}
// LwIP_Init();这条语句注释掉之后,系统是正常运行的,也就是指示灯一闪一灭,加了它之后,系统立马死掉了
|