From ec117e062784652779a9895f2d25ebb87a0d21df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Fri, 21 Aug 2020 23:25:03 +0200 Subject: [PATCH] Change linker script and startup code. This is my own code from my template. It is much cleaner than the old code. --- stm-firmware/Makefile | 4 +- stm-firmware/adc-meas.c | 16 +- stm-firmware/boot/startup_stm32f407vx.c | 314 ++++++++++++++ stm-firmware/boot/startup_stm32f4xx.S | 519 ------------------------ stm-firmware/button.c | 4 +- stm-firmware/main.c | 17 +- stm-firmware/oven-driver.c | 4 +- stm-firmware/reflow-menu.c | 4 +- stm-firmware/shell.c | 2 +- stm-firmware/stack-check.c | 8 +- stm-firmware/stm32f407vet6_flash.ld | 316 +++++++-------- stm-firmware/syscalls.c | 15 +- stm-firmware/systick.c | 6 +- stm-firmware/ui/lcd.c | 2 +- 14 files changed, 493 insertions(+), 738 deletions(-) create mode 100644 stm-firmware/boot/startup_stm32f407vx.c delete mode 100644 stm-firmware/boot/startup_stm32f4xx.S diff --git a/stm-firmware/Makefile b/stm-firmware/Makefile index 2c64ba1..a2f5d0e 100644 --- a/stm-firmware/Makefile +++ b/stm-firmware/Makefile @@ -3,8 +3,8 @@ #Compiler: arm-none-eabi ##################################################################################### #Add Files and Folders below######################################################### -CFILES = main.c syscalls.c setup/system_stm32f4xx.c systick.c -ASFILES = boot/startup_stm32f4xx.S +CFILES = main.c syscalls.c setup/system_stm32f4xx.c systick.c boot/startup_stm32f407vx.c +ASFILES = INCLUDEPATH = -Iinclude OBJDIR_BASE = obj diff --git a/stm-firmware/adc-meas.c b/stm-firmware/adc-meas.c index d96ed9e..40361fc 100644 --- a/stm-firmware/adc-meas.c +++ b/stm-firmware/adc-meas.c @@ -32,22 +32,22 @@ #include #include -static float IN_SECTION(.ccmram) pt1000_offset; -static float IN_SECTION(.ccmram) pt1000_sens_dev; -static bool IN_SECTION(.ccmram) calibration_active; -static float IN_SECTION(.ccmram) filter_alpha; +static float IN_SECTION(.ccm.bss) pt1000_offset; +static float IN_SECTION(.ccm.bss) pt1000_sens_dev; +static bool IN_SECTION(.ccm.bss) calibration_active; +static float IN_SECTION(.ccm.bss) filter_alpha; /** * @brief Filtered PT1000 resistance value. * @note This value is not yet calibrated. Use @ref adc_pt1000_get_current_resistance to get this value with calibration. */ -static volatile float IN_SECTION(.ccmram) pt1000_res_raw_lf; +static volatile float IN_SECTION(.ccm.bss) pt1000_res_raw_lf; static volatile int * volatile streaming_flag_ptr = NULL; -static uint32_t IN_SECTION(.ccmram) filter_startup_cnt; -static volatile float IN_SECTION(.ccmram) adc_pt1000_raw_reading_hf; +static uint32_t IN_SECTION(.ccm.bss) filter_startup_cnt; +static volatile float IN_SECTION(.ccm.bss) adc_pt1000_raw_reading_hf; static volatile uint16_t dma_sample_buffer[ADC_PT1000_DMA_AVG_SAMPLES]; -static volatile uint32_t IN_SECTION(.ccmram) adc_watchdog_counter = 0UL; +static volatile uint32_t IN_SECTION(.ccm.bss) adc_watchdog_counter = 0UL; volatile float * volatile stream_buffer = NULL; volatile uint32_t stream_count; diff --git a/stm-firmware/boot/startup_stm32f407vx.c b/stm-firmware/boot/startup_stm32f407vx.c new file mode 100644 index 0000000..71a3d80 --- /dev/null +++ b/stm-firmware/boot/startup_stm32f407vx.c @@ -0,0 +1,314 @@ +/* +* STM32F4 Startup Code for STM32F407 devices +* Copyright (C) 2017 Mario Hüttel +* +* This file is part of 'STM32F4 code template'. +* +* It is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, version 2 of the License. +* +* This code 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. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this template. If not, see . +* ------------------------------------------------------------------------ +*/ + +/* C++ library init */ +# if defined(__cplusplus) +extern "C" { + extern void __libc_init_array(void); +} +#endif + +/* Defines for weak default handlers */ +#define WEAK __attribute__((weak)) +#define ALIAS(func) __attribute__ ((weak, alias (#func))) + +/* Define for section mapping */ +#define SECTION(sec) __attribute__((section(sec))) + +/* Handler prototypes */ +#if defined(_cplusplus) +extern "C" { +#endif + + +/* Interrupt Defualt handler */ +WEAK void __int_default_handler(void); + +/* Core Interrupts */ +void Reset_Handler(void); +void NMI_Handler(void) ALIAS(__int_default_handler); +void HardFault_Handler(void) ALIAS(__int_default_handler); +void MemManage_Handler(void) ALIAS(__int_default_handler); +void BusFault_Handler(void) ALIAS(__int_default_handler); +void UsageFault_Handler(void) ALIAS(__int_default_handler); +void SVC_Handler(void) ALIAS(__int_default_handler); +void DebugMon_Handler(void) ALIAS(__int_default_handler); +void PendSV_Handler(void) ALIAS(__int_default_handler); +void SysTick_Handler(void) ALIAS(__int_default_handler); + +/* Peripheral Interrupts (by default mapped onto Default Handler) */ +void WWDG_IRQHandler(void) ALIAS(__int_default_handler); +void PVD_IRQHandler(void) ALIAS(__int_default_handler); +void TAMP_STAMP_IRQHandler(void) ALIAS(__int_default_handler); +void RTC_WKUP_IRQHandler(void) ALIAS(__int_default_handler); +void FLASH_IRQHandler(void) ALIAS(__int_default_handler); +void RCC_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI0_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI1_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI2_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI3_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI4_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream0_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream1_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream2_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream3_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream4_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream5_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream6_IRQHandler(void) ALIAS(__int_default_handler); +void ADC_IRQHandler(void) ALIAS(__int_default_handler); +void CAN1_TX_IRQHandler(void) ALIAS(__int_default_handler); +void CAN1_RX0_IRQHandler(void) ALIAS(__int_default_handler); +void CAN1_RX1_IRQHandler(void) ALIAS(__int_default_handler); +void CAN1_SCE_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI9_5_IRQHandler(void) ALIAS(__int_default_handler); +void TIM1_BRK_TIM9_IRQHandler(void) ALIAS(__int_default_handler); +void TIM1_UP_TIM10_IRQHandler(void) ALIAS(__int_default_handler); +void TIM1_TRG_COM_TIM11_IRQHandler(void) ALIAS(__int_default_handler); +void TIM1_CC_IRQHandler(void) ALIAS(__int_default_handler); +void TIM2_IRQHandler(void) ALIAS(__int_default_handler); +void TIM3_IRQHandler(void) ALIAS(__int_default_handler); +void TIM4_IRQHandler(void) ALIAS(__int_default_handler); +void I2C1_EV_IRQHandler(void) ALIAS(__int_default_handler); +void I2C1_ER_IRQHandler(void) ALIAS(__int_default_handler); +void I2C2_EV_IRQHandler(void) ALIAS(__int_default_handler); +void I2C2_ER_IRQHandler(void) ALIAS(__int_default_handler); +void SPI1_IRQHandler(void) ALIAS(__int_default_handler); +void SPI2_IRQHandler(void) ALIAS(__int_default_handler); +void USART1_IRQHandler(void) ALIAS(__int_default_handler); +void USART2_IRQHandler(void) ALIAS(__int_default_handler); +void USART3_IRQHandler(void) ALIAS(__int_default_handler); +void EXTI15_10_IRQHandler(void) ALIAS(__int_default_handler); +void RTC_Alarm_IRQHandler(void) ALIAS(__int_default_handler); +void OTG_FS_WKUP_IRQHandler(void) ALIAS(__int_default_handler); +void TIM8_BRK_TIM12_IRQHandler(void) ALIAS(__int_default_handler); +void TIM8_UP_TIM13_IRQHandler(void) ALIAS(__int_default_handler); +void TIM8_TRG_COM_TIM14_IRQHandler(void) ALIAS(__int_default_handler); +void TIM8_CC_IRQHandler(void) ALIAS(__int_default_handler); +void DMA1_Stream7_IRQHandler(void) ALIAS(__int_default_handler); +void FSMC_IRQHandler(void) ALIAS(__int_default_handler); +void SDIO_IRQHandler(void) ALIAS(__int_default_handler); +void TIM5_IRQHandler(void) ALIAS(__int_default_handler); +void SPI3_IRQHandler(void) ALIAS(__int_default_handler); +void UART4_IRQHandler(void) ALIAS(__int_default_handler); +void UART5_IRQHandler(void) ALIAS(__int_default_handler); +void TIM6_DAC_IRQHandler(void) ALIAS(__int_default_handler); +void TIM7_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream0_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream1_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream2_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream3_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream4_IRQHandler(void) ALIAS(__int_default_handler); +void ETH_IRQHandler(void) ALIAS(__int_default_handler); +void ETH_WKUP_IRQHandler(void) ALIAS(__int_default_handler); +void CAN2_TX_IRQHandler(void) ALIAS(__int_default_handler); +void CAN2_RX0_IRQHandler(void) ALIAS(__int_default_handler); +void CAN2_RX1_IRQHandler(void) ALIAS(__int_default_handler); +void CAN2_SCE_IRQHandler(void) ALIAS(__int_default_handler); +void OTG_FS_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream5_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream6_IRQHandler(void) ALIAS(__int_default_handler); +void DMA2_Stream7_IRQHandler(void) ALIAS(__int_default_handler); +void USART6_IRQHandler(void) ALIAS(__int_default_handler); +void I2C3_EV_IRQHandler(void) ALIAS(__int_default_handler); +void I2C3_ER_IRQHandler(void) ALIAS(__int_default_handler); +void OTG_HS_EP1_OUT_IRQHandler(void) ALIAS(__int_default_handler); +void OTG_HS_EP1_IN_IRQHandler(void) ALIAS(__int_default_handler); +void OTG_HS_WKUP_IRQHandler(void) ALIAS(__int_default_handler); +void OTG_HS_IRQHandler(void) ALIAS(__int_default_handler); +void DCMI_IRQHandler(void) ALIAS(__int_default_handler); +void CRYP_IRQHandler(void) ALIAS(__int_default_handler); +void HASH_RNG_IRQHandler(void) ALIAS(__int_default_handler); +void FPU_IRQHandler(void) ALIAS(__int_default_handler); + +extern int main(void); +extern void SystemInit(void); + +extern void __ld_top_of_stack(void); +#if defined(_cplusplus) +extern "C" } +#endif + +void (* const vector_table[])(void) SECTION(".vectors") = { + &__ld_top_of_stack, + /* Core Interrupts */ + Reset_Handler, + NMI_Handler, + HardFault_Handler, + MemManage_Handler, + BusFault_Handler, + UsageFault_Handler, + 0, + 0, + 0, + 0, + SVC_Handler, + DebugMon_Handler, + 0, + PendSV_Handler, + SysTick_Handler, + /* Peripheral Interrupts */ + WWDG_IRQHandler, + PVD_IRQHandler, + TAMP_STAMP_IRQHandler, + RTC_WKUP_IRQHandler, + FLASH_IRQHandler, + RCC_IRQHandler, + EXTI0_IRQHandler, + EXTI1_IRQHandler, + EXTI2_IRQHandler, + EXTI3_IRQHandler, + EXTI4_IRQHandler, + DMA1_Stream0_IRQHandler, + DMA1_Stream1_IRQHandler, + DMA1_Stream2_IRQHandler, + DMA1_Stream3_IRQHandler, + DMA1_Stream4_IRQHandler, + DMA1_Stream5_IRQHandler, + DMA1_Stream6_IRQHandler, + ADC_IRQHandler, + CAN1_TX_IRQHandler, + CAN1_RX0_IRQHandler, + CAN1_RX1_IRQHandler, + CAN1_SCE_IRQHandler, + EXTI9_5_IRQHandler, + TIM1_BRK_TIM9_IRQHandler, + TIM1_UP_TIM10_IRQHandler, + TIM1_TRG_COM_TIM11_IRQHandler, + TIM1_CC_IRQHandler, + TIM2_IRQHandler, + TIM3_IRQHandler, + TIM4_IRQHandler, + I2C1_EV_IRQHandler, + I2C1_ER_IRQHandler, + I2C2_EV_IRQHandler, + I2C2_ER_IRQHandler, + SPI1_IRQHandler, + SPI2_IRQHandler, + USART1_IRQHandler, + USART2_IRQHandler, + USART3_IRQHandler, + EXTI15_10_IRQHandler, + RTC_Alarm_IRQHandler, + OTG_FS_WKUP_IRQHandler, + TIM8_BRK_TIM12_IRQHandler, + TIM8_UP_TIM13_IRQHandler, + TIM8_TRG_COM_TIM14_IRQHandler, + TIM8_CC_IRQHandler, + DMA1_Stream7_IRQHandler, + FSMC_IRQHandler, + SDIO_IRQHandler, + TIM5_IRQHandler, + SPI3_IRQHandler, + UART4_IRQHandler, + UART5_IRQHandler, + TIM6_DAC_IRQHandler, + TIM7_IRQHandler, + DMA2_Stream0_IRQHandler, + DMA2_Stream1_IRQHandler, + DMA2_Stream2_IRQHandler, + DMA2_Stream3_IRQHandler, + DMA2_Stream4_IRQHandler, + ETH_IRQHandler, + ETH_WKUP_IRQHandler, + CAN2_TX_IRQHandler, + CAN2_RX0_IRQHandler, + CAN2_RX1_IRQHandler, + CAN2_SCE_IRQHandler, + OTG_FS_IRQHandler, + DMA2_Stream5_IRQHandler, + DMA2_Stream6_IRQHandler, + DMA2_Stream7_IRQHandler, + USART6_IRQHandler, + I2C3_EV_IRQHandler, + I2C3_ER_IRQHandler, + OTG_HS_EP1_OUT_IRQHandler, + OTG_HS_EP1_IN_IRQHandler, + OTG_HS_WKUP_IRQHandler, + OTG_HS_IRQHandler, + DCMI_IRQHandler, + CRYP_IRQHandler, + HASH_RNG_IRQHandler, + FPU_IRQHandler +}; + +static void __init_section(unsigned int *src_start, unsigned int *dest_start, unsigned int *dest_end) { + unsigned int *get, *put; + + put = dest_start; + get = src_start; + + while ((unsigned int)put < (unsigned int)dest_end) { + *(put++) = *(get++); + } +} + +static void __fill_zero(unsigned int *start, unsigned int *end) { + while ((unsigned int) start < (unsigned int)end) { + *(start++) = 0x00000000; + } +} + +extern unsigned int __ld_load_data; +extern unsigned int __ld_sdata_ccm; +extern unsigned int __ld_edata_ccm; +extern unsigned int __ld_load_ccm_data; +extern unsigned int __ld_sdata_ccm; +extern unsigned int __ld_edata_ccm; +extern unsigned int __ld_sbss_ccm; +extern unsigned int __ld_ebss_ccm; +extern unsigned int __ld_sdata; +extern unsigned int __ld_edata; +extern unsigned int __ld_sbss; +extern unsigned int __ld_ebss; +extern unsigned int __ld_sheap; +extern unsigned int __ld_eheap; + +void Reset_Handler(void) { + /* Stack is already initialized by hardware */ + + /* Copy .data section */ + __init_section(&__ld_load_data, &__ld_sdata, &__ld_edata); + /* Fill bss with zero */ + __fill_zero(&__ld_sbss, &__ld_ebss); + /* Fill Heap with zero */ + __fill_zero(&__ld_sheap, &__ld_eheap); + /* Fill static CCM memory with zeroes */ + __fill_zero(&__ld_sbss_ccm, &__ld_ebss_ccm); + /* Init CCM RAM data section */ + __init_section(&__ld_load_ccm_data, &__ld_sdata_ccm, &__ld_edata_ccm); + + /* Set clocks, waitstates, ART operation etc. */ + SystemInit(); + + /* C++ init function */ +#if defined(__cplusplus) + __libc_init_array(); +#endif + /* Call main */ + main(); + + /* Catch return from main() */ + while(1); +} + +WEAK void __int_default_handler(void) +{ + while(1); +} diff --git a/stm-firmware/boot/startup_stm32f4xx.S b/stm-firmware/boot/startup_stm32f4xx.S deleted file mode 100644 index 3a320f2..0000000 --- a/stm-firmware/boot/startup_stm32f4xx.S +++ /dev/null @@ -1,519 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f4xx.s - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief STM32F4xx Devices vector table for Atollic TrueSTUDIO toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system and the external SRAM mounted on - * STM324xG-EVAL board to be used as data memory (optional, - * to be enabled by user) - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M4 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m4 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call static constructors */ - //bl __libc_init_array -/* Call the application's entry point.*/ - - /* Enable FPU hard */ - LDR.W R0, =0xE000ED88 - LDR R1, [R0] - ORR R1, R1, #(0xF << 20) - STR R1, [R0] - - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -*******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word CRYP_IRQHandler /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak CRYP_IRQHandler - .thumb_set CRYP_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/stm-firmware/button.c b/stm-firmware/button.c index 4d30ab1..ec6a3fb 100644 --- a/stm-firmware/button.c +++ b/stm-firmware/button.c @@ -27,8 +27,8 @@ #include #include -static volatile uint64_t IN_SECTION(.ccmram) to_active_timestamp; -static volatile enum button_state IN_SECTION(.ccmram) int_state; +static volatile uint64_t IN_SECTION(.ccm.bss) to_active_timestamp; +static volatile enum button_state IN_SECTION(.ccm.bss) int_state; void button_init() { diff --git a/stm-firmware/main.c b/stm-firmware/main.c index c1dfe68..7e79ad8 100644 --- a/stm-firmware/main.c +++ b/stm-firmware/main.c @@ -115,7 +115,7 @@ static inline void setup_shell_uart(struct stm_uart *uart) static bool mount_sd_card_if_avail(bool mounted) { FRESULT res; - static uint8_t IN_SECTION(.ccmram) inserted_counter = 0; + static uint8_t IN_SECTION(.ccm.bss) inserted_counter = 0; if (sdio_check_inserted() && mounted) { memset(fs_ptr, 0, sizeof(FATFS)); @@ -185,20 +185,6 @@ static void handle_shell_uart_input(shellmatta_handle_t shell_handle) shell_handle_input(shell_handle, uart_input, uart_input_len); } -static void zero_ccm_ram(void) -{ - /* These extern variables are placed in the linker script */ - extern char _sccmram; - extern char _eccmram; - uint32_t len; - uint32_t i; - uint32_t *ptr = (uint32_t *)&_sccmram; - - len = (uint32_t)&_eccmram - (uint32_t)&_sccmram; - for (i = 0; i < len; i++) - ptr[i] = 0UL; -} - int main(void) { bool cal_active; @@ -210,7 +196,6 @@ int main(void) shellmatta_handle_t shell_handle; int menu_wait_request; uint64_t quarter_sec_timestamp = 0ULL; - zero_ccm_ram(); setup_system(); shell_handle = shell_init(write_shell_callback); diff --git a/stm-firmware/oven-driver.c b/stm-firmware/oven-driver.c index cda37a1..e108525 100644 --- a/stm-firmware/oven-driver.c +++ b/stm-firmware/oven-driver.c @@ -27,10 +27,10 @@ #include #include -static struct pid_controller IN_SECTION(.ccmram) oven_pid; +static struct pid_controller IN_SECTION(.ccm.bss) oven_pid; static bool oven_pid_running = false; static bool oven_pid_aborted = false; -static uint8_t IN_SECTION(.ccmram) oven_driver_power_level = 0U; +static uint8_t IN_SECTION(.ccm.bss) oven_driver_power_level = 0U; void oven_driver_init() { diff --git a/stm-firmware/reflow-menu.c b/stm-firmware/reflow-menu.c index ca5e5d9..68806dc 100644 --- a/stm-firmware/reflow-menu.c +++ b/stm-firmware/reflow-menu.c @@ -34,8 +34,8 @@ #include #include -static char IN_SECTION(.ccmram) display_buffer[4][21] = {0}; -static struct lcd_menu IN_SECTION(.ccmram) reflow_menu; +static char IN_SECTION(.ccm.bss) display_buffer[4][21] = {0}; +static struct lcd_menu IN_SECTION(.ccm.bss) reflow_menu; static struct lcd_menu * const reflow_menu_ptr = &reflow_menu; static void update_display_buffer(uint8_t row, const char *data) diff --git a/stm-firmware/shell.c b/stm-firmware/shell.c index 282ad9b..01d9758 100644 --- a/stm-firmware/shell.c +++ b/stm-firmware/shell.c @@ -45,7 +45,7 @@ extern struct stm_uart shell_uart; static shellmatta_instance_t shell; static char shell_buffer[512]; -static char IN_SECTION(.ccmram) history_buffer[600]; +static char IN_SECTION(.ccm.bss) history_buffer[600]; static shellmatta_retCode_t shell_cmd_ver(const shellmatta_handle_t handle, const char *arguments, diff --git a/stm-firmware/stack-check.c b/stm-firmware/stack-check.c index 4a40dff..666014d 100644 --- a/stm-firmware/stack-check.c +++ b/stm-firmware/stack-check.c @@ -21,8 +21,8 @@ #include #include -extern char _estack; -extern char heap_top; +extern char __ld_top_of_stack; +extern char __ld_eheap; int32_t stack_check_get_usage() { @@ -30,7 +30,7 @@ int32_t stack_check_get_usage() uint32_t stack_ptr; stack_ptr = read_stack_pointer(); - stack_top = (uint32_t)&_estack; + stack_top = (uint32_t)&__ld_top_of_stack; return stack_top - stack_ptr; } @@ -41,7 +41,7 @@ int32_t stack_check_get_free() uint32_t stack_ptr; stack_ptr = read_stack_pointer(); - upper_heap_boundary = (uint32_t)&heap_top; + upper_heap_boundary = (uint32_t)&__ld_eheap; return stack_ptr - upper_heap_boundary; } diff --git a/stm-firmware/stm32f407vet6_flash.ld b/stm-firmware/stm32f407vet6_flash.ld index c90ee90..bc66eca 100644 --- a/stm-firmware/stm32f407vet6_flash.ld +++ b/stm-firmware/stm32f407vet6_flash.ld @@ -1,189 +1,157 @@ /* -***************************************************************************** -** -** File : stm32_flash.ld -** -** Abstract : Linker script for STM32F407VG Device with -** 1024KByte FLASH, 192KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Environment : Atollic TrueSTUDIO(R) -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -** (c)Copyright Atollic AB. -** You may use this file as-is or modify it according to the needs of your -** project. Distribution of this file (unmodified or modified) is not -** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the -** rights to distribute the assembled, compiled & linked contents of this -** file as part of an application binary file, provided that it is built -** using the Atollic TrueSTUDIO(R) toolchain. -** -***************************************************************************** -*/ +* STM32F407VE Linkerscript for FLASH normal flash code execution +* Copyright (C) 2017 Mario Hüttel +* +* This file is part of 'STM32F407 code template'. +* +* It is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, version 2 of the License. +* +* This code 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. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this template. If not, see . +* -------------------------------------------------------------------- +* FLASH: 512K +* RAM: 128K +* CCM RAM: 64L +* FPU: fpv4-sp-d16 +* -/* Entry Point */ +/* USER PARAMETERS */ +__ld_stack_size = 0x3000; +__ld_heap_size = 0x2100; + +/* END OF USER PARAMETERS */ ENTRY(Reset_Handler) +__ld_top_of_stack = 0x20020000; /* One byte above the end of the SRAM. Stack is pre-decrewmenting, so this is okay */ -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of 128K RAM on AHB bus*/ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x2100; /* required amount of heap (DEFAULT 0) */ -_Min_Stack_Size = 0x3000 ; /* required amount of stack */ -/* recommended min stack size for printf=0x2000, orig = 0x400 */ - -/* Specify the memory areas */ +/* Available memory areas */ MEMORY { - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K - CCM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K + FLASH (xr) : ORIGIN = 0x08000000, LENGTH = 512K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K + CCM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K } -/* Define output sections */ SECTIONS { - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH + .vectors : + { + . = ALIGN(4); + KEEP(*(.vectors)) + . = ALIGN(4); + } >FLASH + + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP(*(.init)) /* Constructors */ + KEEP(*(.fini)) /* Destructors */ + } >FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } >FLASH + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + /* Constructor/Destructor tables */ + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array*)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) + /* Initialized CCM data */ + __ld_load_ccm_data = LOADADDR(.ccmdata); + .ccmdata : + { + . = ALIGN(4); + __ld_sdata_ccm = .; + *(.ccm.data) + *(.ccm.data*) + . = ALIGN(4); + __ld_edata_ccm = .; + } >CCM AT> FLASH + + .ccmbss (NOLOAD) : + { + . = ALIGN(4); + __ld_sbss_ccm = .; + *(.ccm.bss) + *(.ccm.bss*) + . = ALIGN(4); + __ld_ebss_ccm = .; + } >CCM - KEEP (*(.init)) - KEEP (*(.fini)) + /* Initialized Data */ + __ld_load_data = LOADADDR(.data); + .data : + { + . = ALIGN(4); + __ld_sdata = .; + *(.data) + *(.data*) + . = ALIGN(4); + __ld_edata = .; + } >RAM AT> FLASH + + /* Uninitialized static data */ + .bss (NOLOAD) : + { + . = ALIGN(4); + __ld_sbss = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __ld_ebss = .; + } >RAM - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - _exit = .; - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section */ - .ccmram (NOLOAD): - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCM - - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss (NOLOAD): - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack (NOLOAD): - { - . = ALIGN(8); - PROVIDE (heap_low = .); /* for _sbrk */ - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - PROVIDE (heap_top = .); /* for _sbrk */ - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /*/DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - }*/ - - .ARM.attributes 0 : { *(.ARM.attributes) } + .heap_stack (NOLOAD) : + { + . = ALIGN(4); + __ld_sheap = .; + . = . + __ld_heap_size; + __ld_eheap = .; + . = . + __ld_stack_size; + . = ALIGN(4); + } >RAM } + diff --git a/stm-firmware/syscalls.c b/stm-firmware/syscalls.c index 84ee039..2ba98b9 100644 --- a/stm-firmware/syscalls.c +++ b/stm-firmware/syscalls.c @@ -27,19 +27,19 @@ extern struct stm_uart shell_uart; char* _sbrk(int incr) { - extern char heap_low; // Defined by the linker - extern char heap_top; + extern char __ld_sheap; // Defined by the linker + extern char __ld_eheap; static char *heap_end; char *prev_heap_end; if (heap_end == 0) { - heap_end = &heap_low; + heap_end = &__ld_sheap; } prev_heap_end = heap_end; - if (heap_end + incr > &heap_top) { + if (heap_end + incr > &__ld_eheap) { errno = ENOMEM; return (char *)-1; } @@ -110,3 +110,10 @@ int _kill(int pid) return -1; } +void _exit(int pid) +{ + (void)pid; + + while(1); +} + diff --git a/stm-firmware/systick.c b/stm-firmware/systick.c index ad801bc..553d6ca 100644 --- a/stm-firmware/systick.c +++ b/stm-firmware/systick.c @@ -27,9 +27,9 @@ #include #include -volatile uint32_t IN_SECTION(.ccmram) wait_tick_ms = 0UL; -volatile uint64_t IN_SECTION(.ccmram) global_tick_ms = 0ULL; -volatile uint32_t IN_SECTION(.ccmram) lcd_tick_100us = 0UL; +volatile uint32_t IN_SECTION(.ccm.bss) wait_tick_ms = 0UL; +volatile uint64_t IN_SECTION(.ccm.bss) global_tick_ms = 0ULL; +volatile uint32_t IN_SECTION(.ccm.bss) lcd_tick_100us = 0UL; void systick_setup(void) { diff --git a/stm-firmware/ui/lcd.c b/stm-firmware/ui/lcd.c index 9ecadae..8bd995d 100644 --- a/stm-firmware/ui/lcd.c +++ b/stm-firmware/ui/lcd.c @@ -149,7 +149,7 @@ static void lcd_command(uint8_t data) // Set DD RAM Address --------- 0b1xxxxxxx (Display Data RAM) #define LCD_SET_DDADR 0x80 -static char __attribute__((section(".ccmram"))) shadow_display[4][21]; +static char __attribute__((section(".ccm.bss"))) shadow_display[4][21]; void lcd_clear(void) {