Проект переведён на стандартные LD и startup файлы от НИИЭТА (из sdk)

This commit is contained in:
Dmitry Shpak 2019-08-15 18:29:48 +03:00
parent 8bf7f0ed3c
commit 3fa1b4abff
5 changed files with 489 additions and 568 deletions

View File

@ -118,16 +118,6 @@ void SM_Sys_Init(TSM_Sys *p) {
TMR2->LOAD_bit.VAL = 0xFFFFFFFF; TMR2->LOAD_bit.VAL = 0xFFFFFFFF;
TMR2->CTRL = (1 << 0); // Запуск 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] для настройки приоритетов прерываний и У микроконтроллера К1921ВК035 производителем заложено 3 бита из 8-ми битного поля PRI_n [7:0] для настройки приоритетов прерываний и

View File

@ -107,15 +107,6 @@ int main(void) {
/* Настройка тактирования, включение периферии */ /* Настройка тактирования, включение периферии */
SystemInit(); // Настройка клоков SystemInit(); // Настройка клоков
SystemCoreClockUpdate(); // Апдейти системных переменных настроенными клоками (хз зачем, необязательно) 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); //выключить ШИМ (на всякий случай) pwm.Off(&pwm); //выключить ШИМ (на всякий случай)
DINT; DINT;

334
asm/startup_K1921VK035.S Normal file
View File

@ -0,0 +1,334 @@
/*****************************************************************************
* @file: startup_K1921VK035.S
* @author NIIET
* @version: V1.7
* @date: 02.05.2018
* @brief: K1921VK035 startup file for GCC
*****************************************************************************
* <br><br>
*
* 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.
*
* <h2><center>&copy; COPYRIGHT 2018 NIIET </center></h2>
*****************************************************************************
* 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

View File

@ -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

View File

@ -1,242 +1,155 @@
/****************************************************************************** MEMORY
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" {
MFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
Licensed under the Apache License, Version 2.0 (the "License"); BFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 3K
you may not use this file except in compliance with the License. RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 16K
You may obtain a copy of the License at }
http://www.apache.org/licenses/LICENSE-2.0 /* Aliases */
REGION_ALIAS("CODE_FLASH", MFLASH); /* Replace this with BFLASH for bootloader */
Unless required by applicable law or agreed to in writing, software REGION_ALIAS("DATA_RAM", RAM);
distributed under the License is distributed on an "AS IS" BASIS, REGION_ALIAS("HEAP_RAM", RAM);
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. REGION_ALIAS("STACK_RAM", RAM);
See the License for the specific language governing permissions and REGION_ALIAS("BSS_RAM", RAM);
limitations under the License.
ENTRY(Reset_Handler)
* @file build.ld
* @brief Файл распределения памяти для выполнения из FLASH SECTIONS
* @version v1.0 {
* @date 11 декабря 2015 .text :
* {
* @author ООО "НПФ Вектор", http://motorcontrol.ru KEEP(*(.isr_vector))
* *(.text*)
******************************************************************************/
KEEP(*(.init))
/* Entry Point */ KEEP(*(.fini))
ENTRY(Reset_Handler)
/* .ctors */
*crtbegin.o(.ctors)
/* Generate a link error if heap and stack don't fit into RAM */ *crtbegin?.o(.ctors)
_Stack_Size = 0x1000; /* required amount of stack */ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
/* Specify the memory areas */ *(.ctors)
/* Буквы в скобках определяют атрибуты: доступ на чтение,
* запись, исполнение, выделение памяти. */ /* .dtors */
MEMORY *crtbegin.o(.dtors)
{ *crtbegin?.o(.dtors)
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000 *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x4000 *(SORT(.dtors.*))
} *(.dtors)
/* Конец РАМы на НИИЭТЕ (с запасиком) - отсюда внутрь будет расти стек*/
_estack = ORIGIN(RAM) + LENGTH(RAM) - 4; *(.rodata*)
KEEP(*(.eh_frame*))
/* Define output sections */ } > CODE_FLASH
SECTIONS
{ .ARM.extab :
. = ORIGIN(RAM); {
/* таблица векторов прерываний, обязана быть выровнена по 0х80 */ *(.ARM.extab* .gnu.linkonce.armextab.*)
.isr_vector ALIGN(0x80): } > CODE_FLASH
{
__isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */ __exidx_start = .;
__isr_vector_ram_start = .; .ARM.exidx :
KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */ {
. = ALIGN(4); *(.ARM.exidx* .gnu.linkonce.armexidx.*)
__isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */ } > CODE_FLASH
} >RAM AT>FLASH __exidx_end = .;
/* Секция для кода, который исполняется в оперативке, а лежит на флеше. .copy.table :
* В начале мейна он копируется из ROM в RAM.*/ {
.fastcode ALIGN(4): { . = ALIGN(4);
__fastcode_flash_start = LOADADDR (.fastcode); /* Берем адрес, где на флеше лежит код. */ __textdata_start__ = LOADADDR(.data);
/* Точка - это курсор текущего размещения в памяти. Т.е. в __copy_table_start__ = .;
* __fastcode_ram_start будет лежать адрес оперативки, где будет исполняться скопированный код.*/ LONG (__textdata_start__)
__fastcode_ram_start = .; LONG (__data_start__)
*(.glue_7t) *(.glue_7) LONG (__data_end__ - __data_start__)
*(.fastcode) __copy_table_end__ = .;
*(.fastcode*) } > CODE_FLASH
. = ALIGN (4);
__fastcode_ram_end = .; /* конец оперативки, куда будет скопирован код */ .zero.table :
} >RAM AT>FLASH {
. = ALIGN(4);
/* The program code and other data goes into RAM */ __zero_table_start__ = .;
.text : LONG (__bss_start__)
{ LONG (__bss_end__ - __bss_start__)
. = ALIGN(4); __zero_table_end__ = .;
*(.text) /* .text sections (code) */ } > CODE_FLASH
*(.text*) /* .text* sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */ . = ALIGN(4);
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */ .data :
*(.glue_7) /* glue arm to thumb code */ {
*(.glue_7t) /* glue thumb to arm code */ __data_start__ = .;
*(.eh_frame) *(vtable)
*(.data*)
KEEP (*(.init)) *(.ramfunc*)
KEEP (*(.fini))
. = ALIGN(4);
. = ALIGN(4); /* preinit data */
PROVIDE_HIDDEN (__preinit_array_start = .);
/* define a global symbols at end of code - указатель на конец кода, KEEP(*(.preinit_array))
т.к. точка - это переменная с инкрементирующимся значением адреса (называют её курсор)*/ PROVIDE_HIDDEN (__preinit_array_end = .);
_etext = .;
} >FLASH . = ALIGN(4);
/* init data */
PROVIDE_HIDDEN (__init_array_start = .);
/* .preinit_array - секция для указателей на функции пре-инициализации, KEEP(*(SORT(.init_array.*)))
* вызываемых перед любыми другими функциями KEEP(*(.init_array))
* инициализации (перед выполнением кода из секции PROVIDE_HIDDEN (__init_array_end = .);
* '.init' и вызовами функций из секции '.init_array').
*
* Специальная секция с именем '.preinit_array' и вышеназванным . = ALIGN(4);
* назначением описана в System V gABI. Вызов функций, указатели на /* finit data */
* которые содержатся в секции '.preinit_array', возлагается на библиотеку PROVIDE_HIDDEN (__fini_array_start = .);
* времени выполнения (runtime library) -- например, на C runtime. Если в KEEP(*(SORT(.fini_array.*)))
* библиотеке не предусмотрен такой вызов, то функции из секции KEEP(*(.fini_array))
* '.preinit_array' не будут вызваны. PROVIDE_HIDDEN (__fini_array_end = .);
*
* Секция '.preinit_array' предназначена для пре-инициализации KEEP(*(.jcr*))
* исполняемого файла (executable), выполняемой перед инициализацией . = ALIGN(4);
* динамически скомпонованных с ним разделяемых объектов (shared objects). /* All data end */
* __data_end__ = .;
* Символы __preinit_array_start и __preinit_array_end используются
* библиотекой C времени выполнения (newlib, glibc). } > DATA_RAM AT > CODE_FLASH
*/
.preinit_array : .bss :
{ {
PROVIDE_HIDDEN (__preinit_array_start = .); . = ALIGN(4);
KEEP (*(.preinit_array*)) __bss_start__ = .;
PROVIDE_HIDDEN (__preinit_array_end = .); *(.bss*)
} >FLASH *(COMMON)
. = ALIGN(4);
/* .init_array - секции с указателями на функции инициализации, __bss_end__ = .;
* выполняющиеся перед вызовом входной точки программы, т.е. } > BSS_RAM
* перед вызовом функции main.
* .heap (COPY):
* Специальная секция с именем '.init_array' и вышеназванным назначением {
* описана в System V gABI. Вызов функций, указатели на которые содержатся в __end__ = .;
* секции '.init_array', возлагается на библиотеку времени выполнения PROVIDE(end = .);
* (runtime library) -- например, на C runtime. Если в библиотеке не *(.heap*)
* предусмотрен такой вызов, то функции из секции '.init_array' не будут __HeapLimit = .;
* вызваны. } > HEAP_RAM
*
* GCC использует секцию '.init_array' для обеспечения вызова статических /DISCARD/ :
* конструкторов: функций, объявленных с __attribute__((constructor)). {
* libc.a ( * )
* Для статических конструкторов с объявленным приоритетом PRIORITY, libm.a ( * )
* используются секции с именем '.init_array.PRIORITY' libgcc.a ( * )
* }
* Также GCC использует секцию '.init_array' для вызова конструкторов /* .stack_dummy section doesn't contains any symbols. It is only
* статических объектов C++. * used for linker to calculate size of stack sections, and assign
* * values to stack symbols later */
* Символы __init_array_start и __init_array_end используются библиотекой .stack_dummy (COPY):
* C времени выполнения (newlib, glibc). {
*/ *(.stack*)
.init_array : } > STACK_RAM
{
PROVIDE_HIDDEN (__init_array_start = .); /* Set stack top to end of STACK_RAM, and stack limit move down by
KEEP (*(SORT(.init_array.*))) * size of stack_dummy section */
KEEP (*(.init_array*)) __StackTop = ORIGIN(STACK_RAM) + LENGTH(STACK_RAM);
PROVIDE_HIDDEN (__init_array_end = .); __StackLimit = __StackTop - SIZEOF(.stack_dummy);
} >FLASH PROVIDE(__stack = __StackTop);
/* .fini_array - секции с указателями на функции терминации,
* выполняющиеся по завершению программы (после возврата из /* Check if data + heap + stack exceeds STACK_RAM limit */
* входной точки программы, т.е. из функции main). ASSERT(__StackLimit >= __HeapLimit, "region STACK_RAM overflowed with stack")
* }
* Специальная секция с именем '.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) }
}