Проект переведён на стандартные 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 @@
/******************************************************************************
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 MEMORY
{ {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000 MFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x4000 BFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 3K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 16K
} }
/* Конец РАМы на НИИЭТЕ (с запасиком) - отсюда внутрь будет расти стек*/
_estack = ORIGIN(RAM) + LENGTH(RAM) - 4;
/* 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)
/* Define output sections */
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 : .text :
{ {
. = ALIGN(4); KEEP(*(.isr_vector))
*(.text) /* .text sections (code) */ *(.text*)
*(.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(*(.init))
KEEP(*(.fini)) 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); . = 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
/* define a global symbols at end of code - указатель на конец кода, .zero.table :
т.к. точка - это переменная с инкрементирующимся значением адреса (называют её курсор)*/
_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 :
{ {
. = 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 = .); PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*)) KEEP(*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .); PROVIDE_HIDDEN (__preinit_array_end = .);
} >FLASH
/* .init_array - секции с указателями на функции инициализации, . = ALIGN(4);
* выполняющиеся перед вызовом входной точки программы, т.е. /* init data */
* перед вызовом функции 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 = .); PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*))) KEEP(*(SORT(.init_array.*)))
KEEP (*(.init_array*)) KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .); PROVIDE_HIDDEN (__init_array_end = .);
} >FLASH
/* .fini_array - секции с указателями на функции терминации,
* выполняющиеся по завершению программы (после возврата из . = ALIGN(4);
* входной точки программы, т.е. из функции main). /* finit data */
*
* Специальная секция с именем '.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 = .); PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array*))
KEEP(*(SORT(.fini_array.*))) KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .); PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH
/* used by the startup to initialize data */ KEEP(*(.jcr*))
_sidata = .;
/* Выражение _sidata, которое следует за ключевым словом AT,
* определяет адрес загрузки секции. По умолчанию, если Вы
* не использовали ключевое слово AT, адрес загрузки равен адресу перемещения.
* Так как _sidata до этого было равно точке (указатель на текущий адрес),
* то .data пойдет сразу дальше после неё. Как бы динамическое смещение такое.
* */
/* Initialized data sections goes into RAM, load LMA copy after code */
.data : AT ( _sidata )
{
. = ALIGN(4); . = ALIGN(4);
_sdata = .; /* create a global symbol at data start */ /* All data end */
*(.data) /* .data sections */ __data_end__ = .;
*(.data*) /* .data* sections */
} > DATA_RAM AT > CODE_FLASH
. = ALIGN(4);
_edata = .; /* define a global symbol at data end */
} >RAM
_________________________ZHOPA__________________________ = .;
/* Uninitialized data section */
. = ALIGN(4);
.bss : .bss :
{ {
/* This is used by the startup in order to initialize the .bss secion */ . = ALIGN(4);
_sbss = .; /* define a global symbol at bss start */ __bss_start__ = .;
__bss_start__ = _sbss;
*(.bss)
*(.bss*) *(.bss*)
*(COMMON) *(COMMON)
. = ALIGN(4); . = ALIGN(4);
_ebss = .; /* define a global symbol at bss end */ __bss_end__ = .;
__bss_end__ = _ebss; } > BSS_RAM
} >RAM
.heap (COPY):
/* Функци проверяет, что после всего кода осталось место под стек.
* Стек сделан снизу оперативки!
* Не размещайте свои секции после этой функции, только перед!*/
._user_heap_stack :
{ {
. = ALIGN(4); __end__ = .;
PROVIDE(end = .); PROVIDE(end = .);
PROVIDE ( _end = . ); *(.heap*)
. = . + _Stack_Size + 4; __HeapLimit = .;
. = ALIGN(4); } > HEAP_RAM
} >RAM
/* Remove information from the standard libraries */
/DISCARD/ : /DISCARD/ :
{ {
libc.a ( * ) libc.a ( * )
libm.a ( * ) libm.a ( * )
libgcc.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
* 4.3.6 Build Attributes http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf */ * size of stack_dummy section */
.ARM.attributes 0 : { *(.ARM.attributes) } __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")
} }