2017-10-06 131 views
0

我很难找到当前硬故障的原因。 我使用freertos静态内存分配(没有malloc曾经使用)我使用新的预先分配的缓冲区(新(&缓冲区) 我已确保所有线程对齐(4) 每当我使用我的应用程序从freertos调用“启动第一个任务”跳转到hardfault。stm32 freertos hardfault - snprintf/vsnprintf/sprintf

我编写“嵌入式C++”代码,基本上C89带有命名空间和类,所以除了C++ 。每个包含c文件(.h)都包含extern“C”,所以永远不会有联系问题。

我已经用newlib,newlib nano和tinyprintf从空余时间的库中进行了测试,没有区别

也,我从来没有对malloc的调用断言失败,让我“挺”确保没有newlib函数访问的malloc(我说的对吗?)

互联网表明其无论是动态内存分配问题或堆栈问题。我怎么能证明是什么导致硬故障?我相信提示我的堆栈被损坏,因为我的printf调用没有错。我怎么能证明这一点? (我从来没有调试堆栈,并需要一些帮助调试堆栈指针)。

还有其他想法吗?

非常感谢你

例如:

(void) vsnprintf(_log_buffer, C_LOG_BUFFER_SIZE, format, args); // hardfault 
(void) sprintf(_log_buffer, "huhu"); // no hardfault 

动态分配会覆盖:

__ATL_LINK_EXTERN_C void *malloc(size_t size) 
{ 
    (void) size; 

    atl::os::assert::failed((char*)__FILE__,__LINE__); 
    return NULL; 
} 

__ATL_LINK_EXTERN_C void * calloc(size_t size1, size_t size2) 
{ 
    (void) size1; 
    (void) size2; 

    atl::os::assert::failed((char*)__FILE__,__LINE__); 
    return NULL; 
} 

__ATL_LINK_EXTERN_C void *realloc(void * ptr, size_t size) 
{ 
    (void) ptr; 
    (void) size; 

    atl::os::assert::failed((char*)__FILE__,__LINE__); 
    return NULL; 
} 

__ATL_LINK_EXTERN_C void free(void * ptr) 
{ 
    (void) ptr; 

    atl::os::assert::failed((char*)__FILE__,__LINE__); 
} 

FreeRTOS的配置:

/* 
    FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. 
    All rights reserved 

    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. 

    This file is part of the FreeRTOS distribution. 

    FreeRTOS is free software; you can redistribute it and/or modify it under 
    the terms of the GNU General Public License (version 2) as published by the 
    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. 

    *************************************************************************** 
    >>! NOTE: The modification to the GPL is included to allow you to  !<< 
    >>! distribute a combined work that includes FreeRTOS without being !<< 
    >>! obliged to provide the source code for proprietary components  !<< 
    >>! outside of the FreeRTOS kernel.         !<< 
    *************************************************************************** 

    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY 
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
    FOR A PARTICULAR PURPOSE. Full license text is available on the following 
    link: http://www.freertos.org/a00114.html 

    *************************************************************************** 
    *                  * 
    * FreeRTOS provides completely free yet professionally developed, * 
    * robust, strictly quality controlled, supported, and cross   * 
    * platform software that is more than just the market leader, it  * 
    * is the industry's de facto standard.        * 
    *                  * 
    * Help yourself get started quickly while simultaneously helping  * 
    * to support the FreeRTOS project by purchasing a FreeRTOS   * 
    * tutorial book, reference manual, or both:       * 
    * http://www.FreeRTOS.org/Documentation        * 
    *                  * 
    *************************************************************************** 

    http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading 
    the FAQ page "My application does not run, what could be wrong?". Have you 
    defined configASSERT()? 

    http://www.FreeRTOS.org/support - In return for receiving this top quality 
    embedded software for free we request you assist our global community by 
    participating in the support forum. 

    http://www.FreeRTOS.org/training - Investing in training allows your team to 
    be as productive as possible as early as possible. Now you can receive 
    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers 
    Ltd, and the world's leading authority on the world's leading RTOS. 

    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, 
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS 
    compatible FAT file system, and our tiny thread aware UDP/IP stack. 

    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. 
    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. 

    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High 
    Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS 
    licenses offer ticketed support, indemnification and commercial middleware. 

    http://www.SafeRTOS.com - High Integrity Systems also provide a safety 
    engineered and independently SIL3 certified version for use in safety and 
    mission critical applications that require provable dependability. 

    1 tab == 4 spaces! 
*/ 

#ifndef FREERTOS_CONFIG_H 
#define FREERTOS_CONFIG_H 

/*----------------------------------------------------------- 
* Application specific definitions. 
* 
* These definitions should be adjusted for your particular hardware and 
* application requirements. 
* 
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE 
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
* 
* See http://www.freertos.org/a00110.html. 
*----------------------------------------------------------*/ 

/* USER CODE BEGIN Includes */   
/* Section where include file can be added */ 
/* USER CODE END Includes */ 

/* Ensure stdint is only used by the compiler, and not the assembler. */ 
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) 
    #include <stdint.h> 
    extern uint32_t SystemCoreClock; 
/* USER CODE BEGIN 0 */   
    extern void configureTimerForRunTimeStats(void); 
    extern unsigned long getRunTimeCounterValue(void); 
/* USER CODE END 0 */  
#endif 

#define configUSE_PREEMPTION      1 
#define configSUPPORT_STATIC_ALLOCATION   1 
#define configSUPPORT_DYNAMIC_ALLOCATION   0 
#define configUSE_IDLE_HOOK      1 
#define configUSE_TICK_HOOK      1 
#define configCPU_CLOCK_HZ      (SystemCoreClock) 
#define configTICK_RATE_HZ      ((TickType_t)1000) 
#define configMAX_PRIORITIES      (7) 
#define configMINIMAL_STACK_SIZE     ((uint16_t)32) // MOD was 128 
#define configMAX_TASK_NAME_LEN     (32) // mod was 16 
#define configGENERATE_RUN_TIME_STATS   1 
#define configUSE_TRACE_FACILITY     1 
#define configUSE_STATS_FORMATTING_FUNCTIONS  1 
#define configUSE_16_BIT_TICKS     0 
#define configUSE_MUTEXES      1 
#define configQUEUE_REGISTRY_SIZE    8 
#define configCHECK_FOR_STACK_OVERFLOW   1 
#define configUSE_MALLOC_FAILED_HOOK    1 
#define configUSE_DAEMON_TASK_STARTUP_HOOK  1 
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 

/* Co-routine definitions. */ 
#define configUSE_CO_ROUTINES     0 
#define configMAX_CO_ROUTINE_PRIORITIES   (2) 

/* Software timer definitions. */ 
#define configUSE_TIMERS       1 
#define configTIMER_TASK_PRIORITY    (2) 
#define configTIMER_QUEUE_LENGTH     10 
#define configTIMER_TASK_STACK_DEPTH    256 

/* Set the following definitions to 1 to include the API function, or zero 
to exclude the API function. */ 
#define INCLUDE_vTaskPrioritySet   1 
#define INCLUDE_uxTaskPriorityGet   1 
#define INCLUDE_vTaskDelete     1 
#define INCLUDE_vTaskCleanUpResources  1 
#define INCLUDE_vTaskSuspend    1 
#define INCLUDE_vTaskDelayUntil    1 
#define INCLUDE_vTaskDelay     1 
#define INCLUDE_xTaskGetSchedulerState  1 
#define INCLUDE_xTimerPendFunctionCall  1 
#define INCLUDE_xQueueGetMutexHolder  1 
#define INCLUDE_xSemaphoreGetMutexHolder 1 
#define INCLUDE_pcTaskGetTaskName   1 
#define INCLUDE_uxTaskGetStackHighWaterMark 1 
#define INCLUDE_xTaskGetCurrentTaskHandle 1 
#define INCLUDE_eTaskGetState    1 
#define INCLUDE_xTaskAbortDelay    1 
#define INCLUDE_xTaskGetHandle    1 

/* Cortex-M specific definitions. */ 
#ifdef __NVIC_PRIO_BITS 
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ 
#define configPRIO_BITS   __NVIC_PRIO_BITS 
#else 
#define configPRIO_BITS   4 
#endif 

/* The lowest interrupt priority that can be used in a call to a "set priority" 
function. */ 
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 

/* The highest interrupt priority that can be used by any interrupt service 
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL 
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER 
PRIORITY THAN THIS! (higher priorities are lower numeric values. */ 
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 

/* Interrupt priorities used by the kernel port layer itself. These are generic 
to all Cortex-M ports, and do not rely on any particular library functions. */ 
#define configKERNEL_INTERRUPT_PRIORITY  (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) 
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! 
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ 
#define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS)) 

/* Normal assert() semantics without relying on the provision of an assert.h 
header file. */ 
/* USER CODE BEGIN 1 */ 
#define configASSERT(x) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for(;;);} 
/* USER CODE END 1 */ 

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS 
standard names. */ 
#define vPortSVCHandler SVC_Handler 
#define xPortPendSVHandler PendSV_Handler 

/* IMPORTANT: This define MUST be commented when used with STM32Cube firmware, 
       to prevent overwriting SysTick_Handler defined within STM32Cube HAL */ 
/* #define xPortSysTickHandler SysTick_Handler */ 

/* USER CODE BEGIN 2 */  
/* Definitions needed when configGENERATE_RUN_TIME_STATS is on */ 
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats 
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue  
/* USER CODE END 2 */ 

/* USER CODE BEGIN Defines */   
/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */ 
/* USER CODE END Defines */ 

#endif /* FREERTOS_CONFIG_H */ 

回答

0

那么你的调试器说?你检查了什么是真正的HF,以及它发生在哪里?你有一个处理所有可能的HF吗?它使调试变得更加复杂 - 并编写正确的调试,谷歌“当发生HF时如何从堆栈中获取存储的寄存器值”(http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html)。当你完成所有工作后,你就可以开始适当的调查了。

不幸的是,HF-s很难诊断“懒惰的方式”。一些代码编写是绝对必要的。

+0

PeterJ_01。当我向我的硬件故障处理程序的入口点添加合适的指令并实现上面的prvGetRegistersFromStack时,它说“undef引用prvGetRegistersFromStack”。 我已经在这里发布了一些关于堆栈调用图的屏幕截图: [link](https://i.imgur.com/bJJEzW8.png) [link](https://i.imgur.com/Xc2PpqZ。 PNG) [链接](https://i.imgur.com/wXw0xIf.png) –

+0

我建议编写单独的处理程序,不要默认这个。如何正确编译代码?我不是C++专家,但我敢打赌,_缺失,函数必须声明为“C” –

+0

PeterJ_01。是的,这就是我所做的,每个处理程序都被声明为extern“C”。皮层硬汉处理程序只是一个宏,所以它直接跳到hardfault hander。这里没有C++编码。 “_失踪”是什么意思? –