搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2011-9-3 18:23:25 | 显示全部楼层 |阅读模式
在rtconfig.h添加#define RT_LWIP_DHCP,其他内容未做修改,官方原版,按复位键系统即崩溃,错误信息如下
\ | /
- RT -     Thread Operating System
/ | \ 0.4.0 build Sep  3 2011
2006 - 2011 Copyright by rt-thread team
sdcard init failed
File System initialzation failed!
finsh>>Function[rt_malloc] shall not used in ISR
(0) assert failed at rt_malloc:231
重新上电可以正常运行,串口输出信息如下
\ | /
- RT -     Thread Operating System
/ | \ 0.4.0 build Sep  3 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!
好像不允许按键复位

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-9-3 19:20:29 | 显示全部楼层
中断里面用到malloc了。跟踪一下看stack trace,看哪里调用进去了。

出0入0汤圆

 楼主| 发表于 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.
  * @param  None
  * @retval None
  */
void NMI_Handler(void)
{
}

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

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

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

/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
void SVC_Handler(void)
{
}

/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @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****/

出0入0汤圆

 楼主| 发表于 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;
}

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

出0入0汤圆

 楼主| 发表于 2011-9-3 22:04:28 | 显示全部楼层
中断程序改到stm32_eth.c里了,和3.x相比变化挺大,中断处理函数不太好找了

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 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;就不崩溃了;具体有没有问题就不知道了,嘿嘿
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 11:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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