diff --git a/Vsrc/SM_Sys.c b/Vsrc/SM_Sys.c index aac8def..4e69f2d 100644 --- a/Vsrc/SM_Sys.c +++ b/Vsrc/SM_Sys.c @@ -118,16 +118,6 @@ void SM_Sys_Init(TSM_Sys *p) { TMR2->LOAD_bit.VAL = 0xFFFFFFFF; TMR2->CTRL = (1 << 0); // Запуск - extern int *g_pfnVectors; //там, где-то в стартап файле есть такой символ - //Надо показать в этом регистре, где лежит таблица прерываний. - //А лежит она там, куда записал её линкер, в зависимости от файла компоновки. - //Поэтому берем адрес от массива g_pfnVectors и кладем туда -#if defined (__CMCPPARM__) - SCB->VTOR = (uint32_t) (&__Vectors); -#elif defined (__GNUC__) - extern int *g_pfnVectors; - SCB->VTOR = (uint32_t) (&g_pfnVectors); -#endif /* У микроконтроллера К1921ВК035 производителем заложено 3 бита из 8-ми битного поля PRI_n [7:0] для настройки приоритетов прерываний и diff --git a/Vsrc/main.c b/Vsrc/main.c index 85ec58a..175d0f4 100644 --- a/Vsrc/main.c +++ b/Vsrc/main.c @@ -107,15 +107,6 @@ int main(void) { /* Настройка тактирования, включение периферии */ SystemInit(); // Настройка клоков SystemCoreClockUpdate(); // Апдейти системных переменных настроенными клоками (хз зачем, необязательно) - // Копирование некоторых функций и всех прерываний в RAM -#if defined (__GNUC__) - memcpy(&__isr_vector_ram_start, &__isr_vector_flash_start, - ((Uint32) (&__isr_vector_ram_end) - - (Uint32) (&__isr_vector_ram_start))); -#elif defined (__CMCPPARM__) - // Для CodeMaster непонятно, как разместить таблицу прерываний во флеше, а обращатся к ней в раме, - // так что пока так. -#endif pwm.Off(&pwm); //выключить ШИМ (на всякий случай) DINT; diff --git a/asm/startup_K1921VK035.S b/asm/startup_K1921VK035.S new file mode 100644 index 0000000..d7db2db --- /dev/null +++ b/asm/startup_K1921VK035.S @@ -0,0 +1,334 @@ +/***************************************************************************** + * @file: startup_K1921VK035.S + * @author NIIET + * @version: V1.7 + * @date: 02.05.2018 + * @brief: K1921VK035 startup file for GCC + ***************************************************************************** + *

+ * + * 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, NIIET 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 2018 NIIET

+ ***************************************************************************** + * FILE startup_K1921VK035.S + */ + + .syntax unified + .arch armv7e-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0xc00 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .isr_vector + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts */ + .long WDT_IRQHandler + .long RCU_IRQHandler + .long MFLASH_IRQHandler + .long GPIOA_IRQHandler + .long GPIOB_IRQHandler + .long DMA_CH0_IRQHandler + .long DMA_CH1_IRQHandler + .long DMA_CH2_IRQHandler + .long DMA_CH3_IRQHandler + .long DMA_CH4_IRQHandler + .long DMA_CH5_IRQHandler + .long DMA_CH6_IRQHandler + .long DMA_CH7_IRQHandler + .long DMA_CH8_IRQHandler + .long DMA_CH9_IRQHandler + .long DMA_CH10_IRQHandler + .long DMA_CH11_IRQHandler + .long DMA_CH12_IRQHandler + .long DMA_CH13_IRQHandler + .long DMA_CH14_IRQHandler + .long DMA_CH15_IRQHandler + .long TMR0_IRQHandler + .long TMR1_IRQHandler + .long TMR2_IRQHandler + .long TMR3_IRQHandler + .long UART0_TD_IRQHandler + .long UART0_RX_IRQHandler + .long UART0_TX_IRQHandler + .long UART0_E_RT_IRQHandler + .long UART1_TD_IRQHandler + .long UART1_RX_IRQHandler + .long UART1_TX_IRQHandler + .long UART1_E_RT_IRQHandler + .long SPI_RO_RT_IRQHandler + .long SPI_RX_IRQHandler + .long SPI_TX_IRQHandler + .long I2C_IRQHandler + .long ECAP0_IRQHandler + .long ECAP1_IRQHandler + .long ECAP2_IRQHandler + .long PWM0_IRQHandler + .long PWM0_HD_IRQHandler + .long PWM0_TZ_IRQHandler + .long PWM1_IRQHandler + .long PWM1_HD_IRQHandler + .long PWM1_TZ_IRQHandler + .long PWM2_IRQHandler + .long PWM2_HD_IRQHandler + .long PWM2_TZ_IRQHandler + .long QEP_IRQHandler + .long ADC_SEQ0_IRQHandler + .long ADC_SEQ1_IRQHandler + .long ADC_DC_IRQHandler + .long CAN0_IRQHandler + .long CAN1_IRQHandler + .long CAN2_IRQHandler + .long CAN3_IRQHandler + .long CAN4_IRQHandler + .long CAN5_IRQHandler + .long CAN6_IRQHandler + .long CAN7_IRQHandler + .long CAN8_IRQHandler + .long CAN9_IRQHandler + .long CAN10_IRQHandler + .long CAN11_IRQHandler + .long CAN12_IRQHandler + .long CAN13_IRQHandler + .long CAN14_IRQHandler + .long CAN15_IRQHandler + .long FPU_IRQHandler + + + .size __isr_vector, . - __isr_vector + + .text + .thumb + .thumb_func + .align 2 + .globl Reset_Handler + .type Reset_Handler, %function +Reset_Handler: +/* Firstly it copies data from read only memory to RAM. + * Multiple sections scheme: + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#define __NO_SYSTEM_INIT +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + +#ifndef __START +#define __START main +#endif + bl __START + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + /* External Interrupt Handlers */ + def_irq_handler WDT_IRQHandler + def_irq_handler RCU_IRQHandler + def_irq_handler MFLASH_IRQHandler + def_irq_handler GPIOA_IRQHandler + def_irq_handler GPIOB_IRQHandler + def_irq_handler DMA_CH0_IRQHandler + def_irq_handler DMA_CH1_IRQHandler + def_irq_handler DMA_CH2_IRQHandler + def_irq_handler DMA_CH3_IRQHandler + def_irq_handler DMA_CH4_IRQHandler + def_irq_handler DMA_CH5_IRQHandler + def_irq_handler DMA_CH6_IRQHandler + def_irq_handler DMA_CH7_IRQHandler + def_irq_handler DMA_CH8_IRQHandler + def_irq_handler DMA_CH9_IRQHandler + def_irq_handler DMA_CH10_IRQHandler + def_irq_handler DMA_CH11_IRQHandler + def_irq_handler DMA_CH12_IRQHandler + def_irq_handler DMA_CH13_IRQHandler + def_irq_handler DMA_CH14_IRQHandler + def_irq_handler DMA_CH15_IRQHandler + def_irq_handler TMR0_IRQHandler + def_irq_handler TMR1_IRQHandler + def_irq_handler TMR2_IRQHandler + def_irq_handler TMR3_IRQHandler + def_irq_handler UART0_TD_IRQHandler + def_irq_handler UART0_RX_IRQHandler + def_irq_handler UART0_TX_IRQHandler + def_irq_handler UART0_E_RT_IRQHandler + def_irq_handler UART1_TD_IRQHandler + def_irq_handler UART1_RX_IRQHandler + def_irq_handler UART1_TX_IRQHandler + def_irq_handler UART1_E_RT_IRQHandler + def_irq_handler SPI_RO_RT_IRQHandler + def_irq_handler SPI_RX_IRQHandler + def_irq_handler SPI_TX_IRQHandler + def_irq_handler I2C_IRQHandler + def_irq_handler ECAP0_IRQHandler + def_irq_handler ECAP1_IRQHandler + def_irq_handler ECAP2_IRQHandler + def_irq_handler PWM0_IRQHandler + def_irq_handler PWM0_HD_IRQHandler + def_irq_handler PWM0_TZ_IRQHandler + def_irq_handler PWM1_IRQHandler + def_irq_handler PWM1_HD_IRQHandler + def_irq_handler PWM1_TZ_IRQHandler + def_irq_handler PWM2_IRQHandler + def_irq_handler PWM2_HD_IRQHandler + def_irq_handler PWM2_TZ_IRQHandler + def_irq_handler QEP_IRQHandler + def_irq_handler ADC_SEQ0_IRQHandler + def_irq_handler ADC_SEQ1_IRQHandler + def_irq_handler ADC_DC_IRQHandler + def_irq_handler CAN0_IRQHandler + def_irq_handler CAN1_IRQHandler + def_irq_handler CAN2_IRQHandler + def_irq_handler CAN3_IRQHandler + def_irq_handler CAN4_IRQHandler + def_irq_handler CAN5_IRQHandler + def_irq_handler CAN6_IRQHandler + def_irq_handler CAN7_IRQHandler + def_irq_handler CAN8_IRQHandler + def_irq_handler CAN9_IRQHandler + def_irq_handler CAN10_IRQHandler + def_irq_handler CAN11_IRQHandler + def_irq_handler CAN12_IRQHandler + def_irq_handler CAN13_IRQHandler + def_irq_handler CAN14_IRQHandler + def_irq_handler CAN15_IRQHandler + def_irq_handler FPU_IRQHandler + + + .end diff --git a/asm/startup_K1921VK035_vector.S b/asm/startup_K1921VK035_vector.S deleted file mode 100644 index 40cd656..0000000 --- a/asm/startup_K1921VK035_vector.S +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file startup_MCP.s - * @author Vector / NIIET - * @version V1.0.0 - * @date 28 - September - 2014 - * @brief NIIET MC01 vector table for Sourcery Codebench. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Branches to main in the C library (which eventually - * calls main()). - * - enables FPU (COMING SOON!) - * After Reset the Cortex-M4 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - */ - - .syntax unified - .cpu cortex-m3 - .fpu vfpv4 - .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 - - -/* Включение плавоточки*/ - - ldr.w R0, =0xE000ED88 - ldr R1, [R0] - orr R1, R1, #(0xF << 20) - str R1, [R0] - dsb - isb /*reset pipeline now the FPU is enabled*/ - - ldr r0, = _estack /* Эти две строки - загрузка SP адресом 2000а000 в случае, если флешка потёрта. Если проект шьётся во флеш - удалить.*/ - msr msp, 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 - - - .word WDT_IRQHandler - .word RCU_IRQHandler - .word MFLASH_IRQHandler - .word GPIOA_IRQHandler - .word GPIOB_IRQHandler - .word DMA_CH0_IRQHandler - .word DMA_CH1_IRQHandler - .word DMA_CH2_IRQHandler - .word DMA_CH3_IRQHandler - .word DMA_CH4_IRQHandler - .word DMA_CH5_IRQHandler - .word DMA_CH6_IRQHandler - .word DMA_CH7_IRQHandler - .word DMA_CH8_IRQHandler - .word DMA_CH9_IRQHandler - .word DMA_CH10_IRQHandler - .word DMA_CH11_IRQHandler - .word DMA_CH12_IRQHandler - .word DMA_CH13_IRQHandler - .word DMA_CH14_IRQHandler - .word DMA_CH15_IRQHandler - .word TMR0_IRQHandler - .word TMR1_IRQHandler - .word TMR2_IRQHandler - .word TMR3_IRQHandler - .word UART0_TD_IRQHandler - .word UART0_RX_IRQHandler - .word UART0_TX_IRQHandler - .word UART0_E_RT_IRQHandler - .word UART1_TD_IRQHandler - .word UART1_RX_IRQHandler - .word UART1_TX_IRQHandler - .word UART1_E_RT_IRQHandler - .word SPI_RO_RT_IRQHandler - .word SPI_RX_IRQHandler - .word SPI_TX_IRQHandler - .word I2C_IRQHandler - .word ECAP0_IRQHandler - .word ECAP1_IRQHandler - .word ECAP2_IRQHandler - .word PWM0_IRQHandler - .word PWM0_HD_IRQHandler - .word PWM0_TZ_IRQHandler - .word PWM1_IRQHandler - .word PWM1_HD_IRQHandler - .word PWM1_TZ_IRQHandler - .word PWM2_IRQHandler - .word PWM2_HD_IRQHandler - .word PWM2_TZ_IRQHandler - .word QEP_IRQHandler - .word ADC_SEQ0_IRQHandler - .word ADC_SEQ1_IRQHandler - .word ADC_DC_IRQHandler - .word CAN0_IRQHandler - .word CAN1_IRQHandler - .word CAN2_IRQHandler - .word CAN3_IRQHandler - .word CAN4_IRQHandler - .word CAN5_IRQHandler - .word CAN6_IRQHandler - .word CAN7_IRQHandler - .word CAN8_IRQHandler - .word CAN9_IRQHandler - .word CAN10_IRQHandler - .word CAN11_IRQHandler - .word CAN12_IRQHandler - .word CAN13_IRQHandler - .word CAN14_IRQHandler - .word CAN15_IRQHandler - .word FPU_IRQHandler - -/******************************************************************************* -* -* 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. -* -*******************************************************************************/ -/* Macro to define default handlers. Default handler - * will be weak symbol and just dead loops. They can be - * overwritten by other handlers */ - .macro def_irq_handler handler_name - .weak \handler_name - .thumb_set \handler_name, Default_Handler - .endm - - def_irq_handler NMI_Handler - def_irq_handler HardFault_Handler - def_irq_handler MemManage_Handler - def_irq_handler BusFault_Handler - def_irq_handler UsageFault_Handler - def_irq_handler SVC_Handler - def_irq_handler DebugMon_Handler - def_irq_handler PendSV_Handler - def_irq_handler SysTick_Handler - - /* External Interrupt Handlers */ - def_irq_handler WDT_IRQHandler - def_irq_handler RCU_IRQHandler - def_irq_handler MFLASH_IRQHandler - def_irq_handler GPIOA_IRQHandler - def_irq_handler GPIOB_IRQHandler - def_irq_handler DMA_CH0_IRQHandler - def_irq_handler DMA_CH1_IRQHandler - def_irq_handler DMA_CH2_IRQHandler - def_irq_handler DMA_CH3_IRQHandler - def_irq_handler DMA_CH4_IRQHandler - def_irq_handler DMA_CH5_IRQHandler - def_irq_handler DMA_CH6_IRQHandler - def_irq_handler DMA_CH7_IRQHandler - def_irq_handler DMA_CH8_IRQHandler - def_irq_handler DMA_CH9_IRQHandler - def_irq_handler DMA_CH10_IRQHandler - def_irq_handler DMA_CH11_IRQHandler - def_irq_handler DMA_CH12_IRQHandler - def_irq_handler DMA_CH13_IRQHandler - def_irq_handler DMA_CH14_IRQHandler - def_irq_handler DMA_CH15_IRQHandler - def_irq_handler TMR0_IRQHandler - def_irq_handler TMR1_IRQHandler - def_irq_handler TMR2_IRQHandler - def_irq_handler TMR3_IRQHandler - def_irq_handler UART0_TD_IRQHandler - def_irq_handler UART0_RX_IRQHandler - def_irq_handler UART0_TX_IRQHandler - def_irq_handler UART0_E_RT_IRQHandler - def_irq_handler UART1_TD_IRQHandler - def_irq_handler UART1_RX_IRQHandler - def_irq_handler UART1_TX_IRQHandler - def_irq_handler UART1_E_RT_IRQHandler - def_irq_handler SPI_RO_RT_IRQHandler - def_irq_handler SPI_RX_IRQHandler - def_irq_handler SPI_TX_IRQHandler - def_irq_handler I2C_IRQHandler - def_irq_handler ECAP0_IRQHandler - def_irq_handler ECAP1_IRQHandler - def_irq_handler ECAP2_IRQHandler - def_irq_handler PWM0_IRQHandler - def_irq_handler PWM0_HD_IRQHandler - def_irq_handler PWM0_TZ_IRQHandler - def_irq_handler PWM1_IRQHandler - def_irq_handler PWM1_HD_IRQHandler - def_irq_handler PWM1_TZ_IRQHandler - def_irq_handler PWM2_IRQHandler - def_irq_handler PWM2_HD_IRQHandler - def_irq_handler PWM2_TZ_IRQHandler - def_irq_handler QEP_IRQHandler - def_irq_handler ADC_SEQ0_IRQHandler - def_irq_handler ADC_SEQ1_IRQHandler - def_irq_handler ADC_DC_IRQHandler - def_irq_handler CAN0_IRQHandler - def_irq_handler CAN1_IRQHandler - def_irq_handler CAN2_IRQHandler - def_irq_handler CAN3_IRQHandler - def_irq_handler CAN4_IRQHandler - def_irq_handler CAN5_IRQHandler - def_irq_handler CAN6_IRQHandler - def_irq_handler CAN7_IRQHandler - def_irq_handler CAN8_IRQHandler - def_irq_handler CAN9_IRQHandler - def_irq_handler CAN10_IRQHandler - def_irq_handler CAN11_IRQHandler - def_irq_handler CAN12_IRQHandler - def_irq_handler CAN13_IRQHandler - def_irq_handler CAN14_IRQHandler - def_irq_handler CAN15_IRQHandler - def_irq_handler FPU_IRQHandler diff --git a/cmd/build.ld b/cmd/build.ld index 72c31a7..44f1a16 100644 --- a/cmd/build.ld +++ b/cmd/build.ld @@ -1,242 +1,155 @@ -/****************************************************************************** - Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - * @file build.ld - * @brief Файл распределения памяти для выполнения из FLASH - * @version v1.0 - * @date 11 декабря 2015 - * - * @author ООО "НПФ Вектор", http://motorcontrol.ru - * - ******************************************************************************/ - -/* Entry Point */ -ENTRY(Reset_Handler) - - -/* Generate a link error if heap and stack don't fit into RAM */ -_Stack_Size = 0x1000; /* required amount of stack */ - -/* Specify the memory areas */ -/* Буквы в скобках определяют атрибуты: доступ на чтение, - * запись, исполнение, выделение памяти. */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000 - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x4000 -} -/* Конец РАМы на НИИЭТЕ (с запасиком) - отсюда внутрь будет расти стек*/ -_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; - - -/* Define output sections */ -SECTIONS -{ - . = ORIGIN(RAM); - /* таблица векторов прерываний, обязана быть выровнена по 0х80 */ - .isr_vector ALIGN(0x80): - { - __isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */ - __isr_vector_ram_start = .; - KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */ - . = ALIGN(4); - __isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */ - } >RAM AT>FLASH - - /* Секция для кода, который исполняется в оперативке, а лежит на флеше. - * В начале мейна он копируется из ROM в RAM.*/ - .fastcode ALIGN(4): { - __fastcode_flash_start = LOADADDR (.fastcode); /* Берем адрес, где на флеше лежит код. */ - /* Точка - это курсор текущего размещения в памяти. Т.е. в - * __fastcode_ram_start будет лежать адрес оперативки, где будет исполняться скопированный код.*/ - __fastcode_ram_start = .; - *(.glue_7t) *(.glue_7) - *(.fastcode) - *(.fastcode*) - . = ALIGN (4); - __fastcode_ram_end = .; /* конец оперативки, куда будет скопирован код */ - } >RAM AT>FLASH - - /* The program code and other data goes into RAM */ - .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)) - KEEP (*(.fini)) - - . = ALIGN(4); - - /* define a global symbols at end of code - указатель на конец кода, - т.к. точка - это переменная с инкрементирующимся значением адреса (называют её курсор)*/ - _etext = .; - } >FLASH - - - /* .preinit_array - секция для указателей на функции пре-инициализации, - * вызываемых перед любыми другими функциями - * инициализации (перед выполнением кода из секции - * '.init' и вызовами функций из секции '.init_array'). - * - * Специальная секция с именем '.preinit_array' и вышеназванным - * назначением описана в System V gABI. Вызов функций, указатели на - * которые содержатся в секции '.preinit_array', возлагается на библиотеку - * времени выполнения (runtime library) -- например, на C runtime. Если в - * библиотеке не предусмотрен такой вызов, то функции из секции - * '.preinit_array' не будут вызваны. - * - * Секция '.preinit_array' предназначена для пре-инициализации - * исполняемого файла (executable), выполняемой перед инициализацией - * динамически скомпонованных с ним разделяемых объектов (shared objects). - * - * Символы __preinit_array_start и __preinit_array_end используются - * библиотекой C времени выполнения (newlib, glibc). - */ - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - - /* .init_array - секции с указателями на функции инициализации, - * выполняющиеся перед вызовом входной точки программы, т.е. - * перед вызовом функции main. - * - * Специальная секция с именем '.init_array' и вышеназванным назначением - * описана в System V gABI. Вызов функций, указатели на которые содержатся в - * секции '.init_array', возлагается на библиотеку времени выполнения - * (runtime library) -- например, на C runtime. Если в библиотеке не - * предусмотрен такой вызов, то функции из секции '.init_array' не будут - * вызваны. - * - * GCC использует секцию '.init_array' для обеспечения вызова статических - * конструкторов: функций, объявленных с __attribute__((constructor)). - * - * Для статических конструкторов с объявленным приоритетом PRIORITY, - * используются секции с именем '.init_array.PRIORITY' - * - * Также GCC использует секцию '.init_array' для вызова конструкторов - * статических объектов C++. - * - * Символы __init_array_start и __init_array_end используются библиотекой - * C времени выполнения (newlib, glibc). - */ - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - /* .fini_array - секции с указателями на функции терминации, - * выполняющиеся по завершению программы (после возврата из - * входной точки программы, т.е. из функции main). - * - * Специальная секция с именем '.fini_array' и вышеназванным назначением - * описана в System V gABI. Вызов функций, указатели на которые содержатся в - * секции '.fini_array', возлагается на библиотеку времени выполнения - * (runtime library) -- например, на C runtime. Если в библиотеке не - * предусмотрен такой вызов, то функции из секции '.fini_array' не будут - * вызваны. - * - * GCC использует секцию '.fini_array' для обеспечения вызова статических - * деструкторов: функций, объявленных с __attribute__((destructor)). - * - * Для статических деструкторов с объявленным приоритетом PRIORITY, - * используются секции с именем '.fini_array.PRIORITY' - * - * Символы __fini_array_start и __fini_array_end используются библиотекой - * C времени выполнения (newlib, glibc). - */ - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - - /* Выражение _sidata, которое следует за ключевым словом AT, - * определяет адрес загрузки секции. По умолчанию, если Вы - * не использовали ключевое слово AT, адрес загрузки равен адресу перемещения. - * Так как _sidata до этого было равно точке (указатель на текущий адрес), - * то .data пойдет сразу дальше после неё. Как бы динамическое смещение такое. - * */ - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = 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 - _________________________ZHOPA__________________________ = .; - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* 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 : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Stack_Size + 4; - . = ALIGN(4); - } >RAM - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - /* Тут какие-то атрибуты об особенностях компиляции, специфичная инфа производителя и хз еще что, читайте - * 4.3.6 Build Attributes http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf */ - .ARM.attributes 0 : { *(.ARM.attributes) } -} +MEMORY +{ + MFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K + BFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 3K + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 16K +} + +/* Aliases */ +REGION_ALIAS("CODE_FLASH", MFLASH); /* Replace this with BFLASH for bootloader */ +REGION_ALIAS("DATA_RAM", RAM); +REGION_ALIAS("HEAP_RAM", RAM); +REGION_ALIAS("STACK_RAM", RAM); +REGION_ALIAS("BSS_RAM", RAM); + +ENTRY(Reset_Handler) + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > CODE_FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > CODE_FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > CODE_FLASH + __exidx_end = .; + + .copy.table : + { + . = ALIGN(4); + __textdata_start__ = LOADADDR(.data); + __copy_table_start__ = .; + LONG (__textdata_start__) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + __copy_table_end__ = .; + } > CODE_FLASH + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > CODE_FLASH + + . = ALIGN(4); + .data : + { + __data_start__ = .; + *(vtable) + *(.data*) + *(.ramfunc*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > DATA_RAM AT > CODE_FLASH + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > BSS_RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > HEAP_RAM + + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > STACK_RAM + + /* Set stack top to end of STACK_RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(STACK_RAM) + LENGTH(STACK_RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds STACK_RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region STACK_RAM overflowed with stack") +} +