wenhenshi 发表于 2011-9-3 18:23:25

RT-Thread-0.4.0 beta2版STM32F107分支,在rtconfig.h添加#define RT_LWIP_DHCP后按复

在rtconfig.h添加#define RT_LWIP_DHCP,其他内容未做修改,官方原版,按复位键系统即崩溃,错误信息如下
\ | /
- RT -   Thread Operating System
/ | \ 0.4.0 build Sep3 2011
2006 - 2011 Copyright by rt-thread team
sdcard init failed
File System initialzation failed!
finsh>>Function shall not used in ISR
(0) assert failed at rt_malloc:231
重新上电可以正常运行,串口输出信息如下
\ | /
- RT -   Thread Operating System
/ | \ 0.4.0 build Sep3 2011
2006 - 2011 Copyright by rt-thread team
sdcard init failed
File System initialzation failed!
finsh>>Acquired IP address from DHCP server:192.168.18.10
TCP/IP initialized!
好像不允许按键复位

mbbill 发表于 2011-9-3 19:20:29

中断里面用到malloc了。跟踪一下看stack trace,看哪里调用进去了。

wenhenshi 发表于 2011-9-3 20:42:53

汗,网口初始化了可竟然没添加网口中断程序,stm32f10x_it.c程序如下
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include <board.h>
#include <rtthread.h>

/** @addtogroup Template_Project
* @{
*/

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M3 Processor Exceptions Handlers                         */
/******************************************************************************/

/**
* @brief   This function handles NMI exception.
* @paramNone
* @retval None
*/
void NMI_Handler(void)
{
}

/**
* @briefThis function handles Memory Manage exception.
* @paramNone
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles Bus Fault exception.
* @paramNone
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles Usage Fault exception.
* @paramNone
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles SVCall exception.
* @paramNone
* @retval None
*/
void SVC_Handler(void)
{
}

/**
* @briefThis function handles Debug Monitor exception.
* @paramNone
* @retval None
*/
void DebugMon_Handler(void)
{
}

void SysTick_Handler(void)
{
    extern void rt_hw_timer_handler(void);
    rt_hw_timer_handler();
}

/******************************************************************************/
/*               STM32F10x Peripherals Interrupt Handlers                   */
/*Add here the Interrupt Handler for the used peripheral(s) (PPP), for the*/
/*available peripheral interrupt handler's name please refer to the startup */
/*file (startup_stm32f10x_xx.s).                                          */
/******************************************************************************/

/*******************************************************************************
* Function Name: USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
#ifdef RT_USING_UART1
    extern struct rt_device uart1_device;
        extern void rt_hw_serial_isr(struct rt_device *device);
       
    /* enter interrupt */
    rt_interrupt_enter();

    rt_hw_serial_isr(&uart1_device);

    /* leave interrupt */
    rt_interrupt_leave();
#endif
}

/*******************************************************************************
* Function Name: USART2_IRQHandler
* Description    : This function handles USART2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
#ifdef RT_USING_UART2
    extern struct rt_device uart2_device;
        extern void rt_hw_serial_isr(struct rt_device *device);

    /* enter interrupt */
    rt_interrupt_enter();

    rt_hw_serial_isr(&uart2_device);

    /* leave interrupt */
    rt_interrupt_leave();
#endif
}

/*******************************************************************************
* Function Name: USART3_IRQHandler
* Description    : This function handles USART3 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART3_IRQHandler(void)
{
#ifdef RT_USING_UART3
    extern struct rt_device uart3_device;
        extern void rt_hw_serial_isr(struct rt_device *device);

    /* enter interrupt */
    rt_interrupt_enter();

    rt_hw_serial_isr(&uart3_device);

    /* leave interrupt */
    rt_interrupt_leave();
#endif
}

/**
* @}
*/


/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/

wenhenshi 发表于 2011-9-3 20:46:01

application.c程序如下
#include <board.h>
#include <rtthread.h>

#ifdef RT_USING_DFS
/* dfs init */
#include <dfs_init.h>
/* dfs filesystem:ELM filesystem init */
#include <dfs_elm.h>
/* dfs Filesystem APIs */
#include <dfs_fs.h>
#endif

#ifdef RT_USING_LWIP
#include <lwip/sys.h>
#include <lwip/api.h>
#include <netif/ethernetif.h>
#include "stm32_eth.h"
#endif

void rt_init_thread_entry(void* parameter)
{
/* Filesystem Initialization */
#ifdef RT_USING_DFS
        {
                /* init the device filesystem */
                dfs_init();

#ifdef RT_USING_DFS_ELMFAT
                /* init the elm chan FatFs filesystam*/
                elm_init();

                /* mount sd card fat partition 1 as root directory */
                if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
                {
                        rt_kprintf("File System initialized!\n");
                }
                else
                        rt_kprintf("File System initialzation failed!\n");
#endif
        }
#endif

/* LwIP Initialization */
#ifdef RT_USING_LWIP
        {
                extern void lwip_sys_init(void);

                /* register ethernetif device */
                eth_system_device_init();

                rt_hw_stm32_eth_init();
                /* re-init device driver */
                rt_device_init_all();

                /* init lwip system */
                lwip_sys_init();
                rt_kprintf("TCP/IP initialized!\n");
        }
#endif
}

int rt_application_init()
{
        rt_thread_t init_thread;

#if (RT_THREAD_PRIORITY_MAX == 32)
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 8, 20);
#else
        init_thread = rt_thread_create("init",
                                                                rt_init_thread_entry, RT_NULL,
                                                                2048, 80, 20);
#endif

        if (init_thread != RT_NULL)
                rt_thread_startup(init_thread);

        return 0;
}

/*@}*/
是否是官方的疏忽?

wenhenshi 发表于 2011-9-3 22:04:28

中断程序改到stm32_eth.c里了,和3.x相比变化挺大,中断处理函数不太好找了

ffxz 发表于 2011-9-3 23:04:43

回复【楼主位】wenhenshi
在rtconfig.h添加#define rt_lwip_dhcp,其他内容未做修改,官方原版,按复位键系统即崩溃,错误信息如下
\ | /
- rt -   thread operating system
/ | \ 0.4.0 build sep3 2011
2006 - 2011 copyright by rt-thread team
sdcard init failed
file system initialzation failed!
finsh&gt;&gt;function shall not used in isr
(0) assert failed at rt_malloc:231
-----------------------------------------------------------------------

是的,0.4.0 beta2版本存在这个问题,需要最新的svn版本或这个月发布的0.4.0 rc1版本才能够修正这个问题。

wenhenshi 发表于 2011-9-4 01:52:32

查到原因stm32_eth.c内中断处理函数void EXTI9_5_IRQHandler(void)--》netif_set_link_up(stm32_eth_device.parent.netif)--》
dhcp_network_changed(netif)--》 dhcp_discover(netif)--》result = dhcp_create_request(netif);--》dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM)--》memp_malloc();产生的错误
于是写了个函数void XXX(void);函数内部包含netif_set_link_up(stm32_eth_device.parent.netif);并把原位置netif_set_link_up(stm32_eth_device.parent.netif)函数屏蔽掉,声明一全局变量初始化为0;
进入中断函数void EXTI9_5_IRQHandler(void)内部原netif_set_link_up(stm32_eth_device.parent.netif)位置把全局变量设为1;
然后把void XXX(void)放到空闲任务函数void rt_thread_idle_entry(void* parameter)中,判断全局变量为1调用void XXX(void)
调用完成后把全局变量设为0;就不崩溃了;具体有没有问题就不知道了,嘿嘿
页: [1]
查看完整版本: RT-Thread-0.4.0 beta2版STM32F107分支,在rtconfig.h添加#define RT_LWIP_DHCP后按复