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!
好像不允许按键复位 中断里面用到malloc了。跟踪一下看stack trace,看哪里调用进去了。 汗,网口初始化了可竟然没添加网口中断程序,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****/ 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;
}
/*@}*/
是否是官方的疏忽? 中断程序改到stm32_eth.c里了,和3.x相比变化挺大,中断处理函数不太好找了 回复【楼主位】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>>function shall not used in isr
(0) assert failed at rt_malloc:231
-----------------------------------------------------------------------
是的,0.4.0 beta2版本存在这个问题,需要最新的svn版本或这个月发布的0.4.0 rc1版本才能够修正这个问题。 查到原因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]