adding segger studio support
This commit is contained in:
parent
9f6f48c586
commit
c01137fed6
168
src/nrf52_common.ld
Normal file
168
src/nrf52_common.ld
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
/* Linker script for Nordic Semiconductor nRF52 devices
|
||||||
|
*
|
||||||
|
* Version: Sourcery G++ 4.5-1
|
||||||
|
* Support: https://support.codesourcery.com/GNUToolchain/
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007, 2008, 2009, 2010 CodeSourcery, Inc.
|
||||||
|
*
|
||||||
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||||
|
* and license this software and its documentation for any purpose, provided
|
||||||
|
* that existing copyright notices are retained in all copies and that this
|
||||||
|
* notice is included verbatim in any distributions. No written agreement,
|
||||||
|
* license, or royalty fee is required for any of the authorized uses.
|
||||||
|
* Modifications to this software may be copyrighted by their authors
|
||||||
|
* and need not follow the licensing terms described here, provided that
|
||||||
|
* the new terms are clearly indicated on the first page of each file where
|
||||||
|
* they apply.
|
||||||
|
*/
|
||||||
|
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||||
|
|
||||||
|
/* Linker script to place sections and symbol values. Should be used together
|
||||||
|
* with other linker script that defines memory regions FLASH and RAM.
|
||||||
|
* It references following symbols, which must be defined in code:
|
||||||
|
* Reset_Handler : Entry of reset handler
|
||||||
|
*
|
||||||
|
* It defines following symbols, which code can use without definition:
|
||||||
|
* __exidx_start
|
||||||
|
* __exidx_end
|
||||||
|
* __etext
|
||||||
|
* __data_start__
|
||||||
|
* __preinit_array_start
|
||||||
|
* __preinit_array_end
|
||||||
|
* __init_array_start
|
||||||
|
* __init_array_end
|
||||||
|
* __fini_array_start
|
||||||
|
* __fini_array_end
|
||||||
|
* __data_end__
|
||||||
|
* __bss_start__
|
||||||
|
* __bss_end__
|
||||||
|
* __end__
|
||||||
|
* end
|
||||||
|
* __HeapBase
|
||||||
|
* __HeapLimit
|
||||||
|
* __StackLimit
|
||||||
|
* __StackTop
|
||||||
|
* __stack
|
||||||
|
*/
|
||||||
|
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*))
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
.ARM.extab :
|
||||||
|
{
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
__exidx_start = .;
|
||||||
|
.ARM.exidx :
|
||||||
|
{
|
||||||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
|
} > FLASH
|
||||||
|
__exidx_end = .;
|
||||||
|
|
||||||
|
__etext = .;
|
||||||
|
|
||||||
|
.data : AT (__etext)
|
||||||
|
{
|
||||||
|
__data_start__ = .;
|
||||||
|
*(vtable)
|
||||||
|
*(.data*)
|
||||||
|
|
||||||
|
. = 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__ = .;
|
||||||
|
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__bss_start__ = .;
|
||||||
|
*(.bss*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(4);
|
||||||
|
__bss_end__ = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
.heap (COPY):
|
||||||
|
{
|
||||||
|
__HeapBase = .;
|
||||||
|
__end__ = .;
|
||||||
|
PROVIDE(end = .);
|
||||||
|
KEEP(*(.heap*))
|
||||||
|
__HeapLimit = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
/* .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):
|
||||||
|
{
|
||||||
|
KEEP(*(.stack*))
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
/* Set stack top to end of RAM, and stack limit move down by
|
||||||
|
* size of stack_dummy section */
|
||||||
|
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
||||||
|
PROVIDE(__stack = __StackTop);
|
||||||
|
|
||||||
|
/* Check if data + heap + stack exceeds RAM limit */
|
||||||
|
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
|
||||||
|
|
||||||
|
/* Check if text sections + data exceeds FLASH limit */
|
||||||
|
DataInitFlashUsed = __bss_start__ - __data_start__;
|
||||||
|
CodeFlashUsed = __etext - ORIGIN(FLASH);
|
||||||
|
TotalFlashUsed = CodeFlashUsed + DataInitFlashUsed;
|
||||||
|
ASSERT(TotalFlashUsed <= LENGTH(FLASH), "region FLASH overflowed with .data and user data")
|
||||||
|
|
||||||
|
}
|
1329
src/segger/SEGGER_RTT.c
Normal file
1329
src/segger/SEGGER_RTT.c
Normal file
File diff suppressed because it is too large
Load Diff
234
src/segger/SEGGER_RTT.h
Normal file
234
src/segger/SEGGER_RTT.h
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
/*********************************************************************
|
||||||
|
* SEGGER MICROCONTROLLER GmbH & Co. KG *
|
||||||
|
* Solutions for real time microcontroller applications *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* (c) 2014 - 2016 SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* *
|
||||||
|
* www.segger.com Support: support@segger.com *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* SEGGER RTT * Real Time Transfer for embedded targets *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* All rights reserved. *
|
||||||
|
* *
|
||||||
|
* * This software may in its unmodified form be freely redistributed *
|
||||||
|
* in source form. *
|
||||||
|
* * The source code may be modified, provided the source code *
|
||||||
|
* retains the above copyright notice, this list of conditions and *
|
||||||
|
* the following disclaimer. *
|
||||||
|
* * Modified versions of this software in source or linkable form *
|
||||||
|
* may not be distributed without prior consent of SEGGER. *
|
||||||
|
* * This software may only be used for communication with SEGGER *
|
||||||
|
* J-Link debug probes. *
|
||||||
|
* *
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
||||||
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
||||||
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
||||||
|
* DAMAGE. *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* RTT version: 5.12e *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
---------------------------END-OF-HEADER------------------------------
|
||||||
|
File : SEGGER_RTT.h
|
||||||
|
Purpose : Implementation of SEGGER real-time transfer which allows
|
||||||
|
real-time communication on targets which support debugger
|
||||||
|
memory accesses while the CPU is running.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SEGGER_RTT_H
|
||||||
|
#define SEGGER_RTT_H
|
||||||
|
|
||||||
|
#include "SEGGER_RTT_Conf.h"
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Defines, fixed
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Types
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Description for a circular buffer (also called "ring buffer")
|
||||||
|
// which is used as up-buffer (T->H)
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4"
|
||||||
|
char* pBuffer; // Pointer to start of buffer
|
||||||
|
unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty.
|
||||||
|
unsigned WrOff; // Position of next item to be written by either target.
|
||||||
|
volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host.
|
||||||
|
unsigned Flags; // Contains configuration flags
|
||||||
|
} SEGGER_RTT_BUFFER_UP;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Description for a circular buffer (also called "ring buffer")
|
||||||
|
// which is used as down-buffer (H->T)
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4"
|
||||||
|
char* pBuffer; // Pointer to start of buffer
|
||||||
|
unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty.
|
||||||
|
volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host.
|
||||||
|
unsigned RdOff; // Position of next item to be read by target (down-buffer).
|
||||||
|
unsigned Flags; // Contains configuration flags
|
||||||
|
} SEGGER_RTT_BUFFER_DOWN;
|
||||||
|
|
||||||
|
//
|
||||||
|
// RTT control block which describes the number of buffers available
|
||||||
|
// as well as the configuration for each buffer
|
||||||
|
//
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
char acID[16]; // Initialized to "SEGGER RTT"
|
||||||
|
int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2)
|
||||||
|
int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2)
|
||||||
|
SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host
|
||||||
|
SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target
|
||||||
|
} SEGGER_RTT_CB;
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Global data
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
extern SEGGER_RTT_CB _SEGGER_RTT;
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT API functions
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);
|
||||||
|
int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);
|
||||||
|
int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);
|
||||||
|
int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);
|
||||||
|
int SEGGER_RTT_GetKey (void);
|
||||||
|
unsigned SEGGER_RTT_HasData (unsigned BufferIndex);
|
||||||
|
int SEGGER_RTT_HasKey (void);
|
||||||
|
void SEGGER_RTT_Init (void);
|
||||||
|
unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize);
|
||||||
|
unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize);
|
||||||
|
int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName);
|
||||||
|
int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName);
|
||||||
|
int SEGGER_RTT_WaitKey (void);
|
||||||
|
unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);
|
||||||
|
unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);
|
||||||
|
unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);
|
||||||
|
unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s);
|
||||||
|
void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);
|
||||||
|
//
|
||||||
|
// Function macro for performance optimization
|
||||||
|
//
|
||||||
|
#define SEGGER_RTT_HASDATA(n) (_SEGGER_RTT.aDown[n].WrOff - _SEGGER_RTT.aDown[n].RdOff)
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT "Terminal" API functions
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
int SEGGER_RTT_SetTerminal (char TerminalId);
|
||||||
|
int SEGGER_RTT_TerminalOut (char TerminalId, const char* s);
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT printf functions (require SEGGER_RTT_printf.c)
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Defines
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// Operating modes. Define behavior if buffer is full (not enough space for entire message)
|
||||||
|
//
|
||||||
|
#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0U) // Skip. Do not block, output nothing. (Default)
|
||||||
|
#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1U) // Trim: Do not block, output as much as fits.
|
||||||
|
#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2U) // Block: Wait until there is space in the buffer.
|
||||||
|
#define SEGGER_RTT_MODE_MASK (3U)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Control sequences, based on ANSI.
|
||||||
|
// Can be used to control color, and clear the screen
|
||||||
|
//
|
||||||
|
#define RTT_CTRL_RESET "[0m" // Reset to default colors
|
||||||
|
#define RTT_CTRL_CLEAR "[2J" // Clear screen, reposition cursor to top left
|
||||||
|
|
||||||
|
#define RTT_CTRL_TEXT_BLACK "[2;30m"
|
||||||
|
#define RTT_CTRL_TEXT_RED "[2;31m"
|
||||||
|
#define RTT_CTRL_TEXT_GREEN "[2;32m"
|
||||||
|
#define RTT_CTRL_TEXT_YELLOW "[2;33m"
|
||||||
|
#define RTT_CTRL_TEXT_BLUE "[2;34m"
|
||||||
|
#define RTT_CTRL_TEXT_MAGENTA "[2;35m"
|
||||||
|
#define RTT_CTRL_TEXT_CYAN "[2;36m"
|
||||||
|
#define RTT_CTRL_TEXT_WHITE "[2;37m"
|
||||||
|
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_BLACK "[1;30m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_RED "[1;31m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_GREEN "[1;32m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_YELLOW "[1;33m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_BLUE "[1;34m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "[1;35m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_CYAN "[1;36m"
|
||||||
|
#define RTT_CTRL_TEXT_BRIGHT_WHITE "[1;37m"
|
||||||
|
|
||||||
|
#define RTT_CTRL_BG_BLACK "[24;40m"
|
||||||
|
#define RTT_CTRL_BG_RED "[24;41m"
|
||||||
|
#define RTT_CTRL_BG_GREEN "[24;42m"
|
||||||
|
#define RTT_CTRL_BG_YELLOW "[24;43m"
|
||||||
|
#define RTT_CTRL_BG_BLUE "[24;44m"
|
||||||
|
#define RTT_CTRL_BG_MAGENTA "[24;45m"
|
||||||
|
#define RTT_CTRL_BG_CYAN "[24;46m"
|
||||||
|
#define RTT_CTRL_BG_WHITE "[24;47m"
|
||||||
|
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_BLACK "[4;40m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_RED "[4;41m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_GREEN "[4;42m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_YELLOW "[4;43m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_BLUE "[4;44m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_MAGENTA "[4;45m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_CYAN "[4;46m"
|
||||||
|
#define RTT_CTRL_BG_BRIGHT_WHITE "[4;47m"
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*************************** End of file ****************************/
|
242
src/segger/SEGGER_RTT_Conf.h
Normal file
242
src/segger/SEGGER_RTT_Conf.h
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
/*********************************************************************
|
||||||
|
* SEGGER MICROCONTROLLER GmbH & Co. KG *
|
||||||
|
* Solutions for real time microcontroller applications *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* (c) 2014 - 2016 SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* *
|
||||||
|
* www.segger.com Support: support@segger.com *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* SEGGER RTT * Real Time Transfer for embedded targets *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* All rights reserved. *
|
||||||
|
* *
|
||||||
|
* * This software may in its unmodified form be freely redistributed *
|
||||||
|
* in source form. *
|
||||||
|
* * The source code may be modified, provided the source code *
|
||||||
|
* retains the above copyright notice, this list of conditions and *
|
||||||
|
* the following disclaimer. *
|
||||||
|
* * Modified versions of this software in source or linkable form *
|
||||||
|
* may not be distributed without prior consent of SEGGER. *
|
||||||
|
* * This software may only be used for communication with SEGGER *
|
||||||
|
* J-Link debug probes. *
|
||||||
|
* *
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
||||||
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
||||||
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
||||||
|
* DAMAGE. *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* RTT version: 5.12e *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
File : SEGGER_RTT_Conf.h
|
||||||
|
Purpose : Implementation of SEGGER real-time transfer (RTT) which
|
||||||
|
allows real-time communication on targets which support
|
||||||
|
debugger memory accesses while the CPU is running.
|
||||||
|
---------------------------END-OF-HEADER------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SEGGER_RTT_CONF_H
|
||||||
|
#define SEGGER_RTT_CONF_H
|
||||||
|
|
||||||
|
#ifdef __ICCARM__
|
||||||
|
#include <intrinsics.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* Defines, configurable
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (2) // Max. number of up-buffers (T->H) available on this target (Default: 2)
|
||||||
|
#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (2) // Max. number of down-buffers (H->T) available on this target (Default: 2)
|
||||||
|
|
||||||
|
#define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k)
|
||||||
|
#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)
|
||||||
|
|
||||||
|
#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
|
||||||
|
|
||||||
|
#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Target is not allowed to perform other RTT operations while string still has not been stored completely.
|
||||||
|
// Otherwise we would probably end up with a mixed string in the buffer.
|
||||||
|
// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here.
|
||||||
|
//
|
||||||
|
// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4.
|
||||||
|
// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches.
|
||||||
|
// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly.
|
||||||
|
// (Higher priority = lower priority number)
|
||||||
|
// Default value for embOS: 128u
|
||||||
|
// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
|
||||||
|
// In case of doubt mask all interrupts: 0u
|
||||||
|
//
|
||||||
|
|
||||||
|
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20)
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT lock configuration for SEGGER Embedded Studio,
|
||||||
|
* Rowley CrossStudio and GCC
|
||||||
|
*/
|
||||||
|
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)
|
||||||
|
#ifdef __ARM_ARCH_6M__
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
__asm volatile ("mrs %0, primask \n\t" \
|
||||||
|
"mov r1, $1 \n\t" \
|
||||||
|
"msr primask, r1 \n\t" \
|
||||||
|
: "=r" (LockState) \
|
||||||
|
: \
|
||||||
|
: "r1" \
|
||||||
|
);
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \
|
||||||
|
: \
|
||||||
|
: "r" (LockState) \
|
||||||
|
: \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__))
|
||||||
|
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
|
||||||
|
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
|
||||||
|
#endif
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
__asm volatile ("mrs %0, basepri \n\t" \
|
||||||
|
"mov r1, %1 \n\t" \
|
||||||
|
"msr basepri, r1 \n\t" \
|
||||||
|
: "=r" (LockState) \
|
||||||
|
: "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \
|
||||||
|
: "r1" \
|
||||||
|
);
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \
|
||||||
|
: \
|
||||||
|
: "r" (LockState) \
|
||||||
|
: \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__ARM_ARCH_7A__)
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
__asm volatile ("mrs r1, CPSR \n\t" \
|
||||||
|
"mov %0, r1 \n\t" \
|
||||||
|
"orr r1, r1, #0xC0 \n\t" \
|
||||||
|
"msr CPSR_c, r1 \n\t" \
|
||||||
|
: "=r" (LockState) \
|
||||||
|
: \
|
||||||
|
: "r1" \
|
||||||
|
);
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \
|
||||||
|
"mrs r1, CPSR \n\t" \
|
||||||
|
"bic r1, r1, #0xC0 \n\t" \
|
||||||
|
"and r0, r0, #0xC0 \n\t" \
|
||||||
|
"orr r1, r1, r0 \n\t" \
|
||||||
|
"msr CPSR_c, r1 \n\t" \
|
||||||
|
: \
|
||||||
|
: "r" (LockState) \
|
||||||
|
: "r0", "r1" \
|
||||||
|
); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define SEGGER_RTT_LOCK()
|
||||||
|
#define SEGGER_RTT_UNLOCK()
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT lock configuration for IAR EWARM
|
||||||
|
*/
|
||||||
|
#ifdef __ICCARM__
|
||||||
|
#if (defined (__ARM6M__) && (__CORE__ == __ARM6M__))
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
LockState = __get_PRIMASK(); \
|
||||||
|
__set_PRIMASK(1);
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \
|
||||||
|
}
|
||||||
|
#elif ((defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)))
|
||||||
|
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
|
||||||
|
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
|
||||||
|
#endif
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
LockState = __get_BASEPRI(); \
|
||||||
|
__set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() __set_BASEPRI(LockState); \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT lock configuration for KEIL ARM
|
||||||
|
*/
|
||||||
|
#ifdef __CC_ARM
|
||||||
|
#if (defined __TARGET_ARCH_6S_M)
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
register unsigned char PRIMASK __asm( "primask"); \
|
||||||
|
LockState = PRIMASK; \
|
||||||
|
PRIMASK = 1u; \
|
||||||
|
__schedule_barrier();
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() PRIMASK = LockState; \
|
||||||
|
__schedule_barrier(); \
|
||||||
|
}
|
||||||
|
#elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
|
||||||
|
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
|
||||||
|
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
|
||||||
|
#endif
|
||||||
|
#define SEGGER_RTT_LOCK() { \
|
||||||
|
unsigned int LockState; \
|
||||||
|
register unsigned char BASEPRI __asm( "basepri"); \
|
||||||
|
LockState = BASEPRI; \
|
||||||
|
BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \
|
||||||
|
__schedule_barrier();
|
||||||
|
|
||||||
|
#define SEGGER_RTT_UNLOCK() BASEPRI = LockState; \
|
||||||
|
__schedule_barrier(); \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* RTT lock configuration fallback
|
||||||
|
*/
|
||||||
|
#ifndef SEGGER_RTT_LOCK
|
||||||
|
#define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SEGGER_RTT_UNLOCK
|
||||||
|
#define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/*************************** End of file ****************************/
|
76
src/segger/SEGGER_RTT_SES.c
Normal file
76
src/segger/SEGGER_RTT_SES.c
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*********************************************************************
|
||||||
|
* SEGGER MICROCONTROLLER GmbH & Co. KG *
|
||||||
|
* Solutions for real time microcontroller applications *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* (c) 2014 - 2015 SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* *
|
||||||
|
* www.segger.com Support: support@segger.com *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
* *
|
||||||
|
* All rights reserved. *
|
||||||
|
* *
|
||||||
|
* * This software may in its unmodified form be freely redistributed *
|
||||||
|
* in source form. *
|
||||||
|
* * The source code may be modified, provided the source code *
|
||||||
|
* retains the above copyright notice, this list of conditions and *
|
||||||
|
* the following disclaimer. *
|
||||||
|
* * Modified versions of this software in source or linkable form *
|
||||||
|
* may not be distributed without prior consent of SEGGER. *
|
||||||
|
* * This software may only be used for communication with SEGGER *
|
||||||
|
* J-Link debug probes. *
|
||||||
|
* *
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
||||||
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
||||||
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
||||||
|
* DAMAGE. *
|
||||||
|
* *
|
||||||
|
**********************************************************************
|
||||||
|
-------- END-OF-HEADER ---------------------------------------------
|
||||||
|
File : SEGGER_RTT_Syscalls_SES.c
|
||||||
|
Purpose : Reimplementation of printf, puts and
|
||||||
|
implementation of __putchar and __getchar using RTT in SES.
|
||||||
|
To use RTT for printf output, include this file in your
|
||||||
|
application.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
#include "SEGGER_RTT.h"
|
||||||
|
#include "__libc.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int printf(const char *fmt,...) {
|
||||||
|
char buffer[128];
|
||||||
|
va_list args;
|
||||||
|
va_start (args, fmt);
|
||||||
|
int n = vsnprintf(buffer, sizeof(buffer), fmt, args);
|
||||||
|
SEGGER_RTT_Write(0, buffer, n);
|
||||||
|
va_end(args);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int puts(const char *s) {
|
||||||
|
return SEGGER_RTT_WriteString(0, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __putchar(int x, __printf_tag_ptr ctx) {
|
||||||
|
(void)ctx;
|
||||||
|
SEGGER_RTT_Write(0, (char *)&x, 1);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __getchar() {
|
||||||
|
return SEGGER_RTT_WaitKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
/****** End Of File *************************************************/
|
43
src/segger/flash_placement.xml
Normal file
43
src/segger/flash_placement.xml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<!DOCTYPE Linker_Placement_File>
|
||||||
|
<Root name="Flash Section Placement">
|
||||||
|
<MemorySegment name="$(FLASH_NAME:FLASH)">
|
||||||
|
<ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START:)" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".init" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".init_rodata" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".text" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".dtors" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".ctors" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".rodata" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".ARM.exidx" address_symbol="__exidx_start" end_symbol="__exidx_end" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" runin=".fast_run" name=".fast" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" runin=".data_run" name=".data" />
|
||||||
|
<ProgramSection alignment="4" load="Yes" runin=".tdata_run" name=".tdata" />
|
||||||
|
</MemorySegment>
|
||||||
|
<MemorySegment name="$(RAM_NAME:RAM);SRAM">
|
||||||
|
<ProgramSection alignment="0x100" load="No" name=".vectors_ram" start="$(RAM_START:$(SRAM_START:))" />
|
||||||
|
<ProgramSection alignment="4" load="No" name=".fast_run" />
|
||||||
|
<ProgramSection alignment="4" load="No" name=".data_run" />
|
||||||
|
<ProgramSection alignment="4" load="No" name=".tdata_run" />
|
||||||
|
<ProgramSection alignment="4" load="No" name=".bss" />
|
||||||
|
<ProgramSection alignment="4" load="No" name=".tbss" />
|
||||||
|
<ProgramSection alignment="4" load="No" name=".non_init" />
|
||||||
|
<ProgramSection alignment="4" size="__HEAPSIZE__" load="No" name=".heap" />
|
||||||
|
<ProgramSection alignment="8" size="__STACKSIZE__" load="No" place_from_segment_end="Yes" name=".stack" />
|
||||||
|
<ProgramSection alignment="8" size="__STACKSIZE_PROCESS__" load="No" name=".stack_process" />
|
||||||
|
</MemorySegment>
|
||||||
|
<MemorySegment name="$(FLASH2_NAME:BOOTLOADER_SETTINGS)">
|
||||||
|
<ProgramSection alignment="4" load="No" name=".bootloaderSettings" />
|
||||||
|
</MemorySegment>
|
||||||
|
<MemorySegment name="$(FLASH3_NAME:MBR_PARAMS_PAGE)">
|
||||||
|
<ProgramSection alignment="4" load="No" name=".mbrParamsPage" keep="Yes" />
|
||||||
|
</MemorySegment>
|
||||||
|
<MemorySegment name="$(FLASH4_NAME:UICR_BOOTLOADER)">
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".uicrBootStartAddress" keep="Yes" />
|
||||||
|
</MemorySegment>
|
||||||
|
<MemorySegment name="$(FLASH5_NAME:UICR_MBR_PARAM_PAGE)">
|
||||||
|
<ProgramSection alignment="4" load="Yes" name=".uicrMbrParamsPageAddress" keep="Yes" />
|
||||||
|
</MemorySegment>
|
||||||
|
<MemorySegment name="$(RAM2_NAME:NOINIT)">
|
||||||
|
<ProgramSection alignment="4" load="No" name=".noinit" />
|
||||||
|
</MemorySegment>
|
||||||
|
</Root>
|
10
src/segger/nRF52840_xxAA_MemoryMap.xml
Normal file
10
src/segger/nRF52840_xxAA_MemoryMap.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE Board_Memory_Definition_File>
|
||||||
|
<root name="nRF52840_xxAA">
|
||||||
|
<MemorySegment name="FLASH" start="0x000F4000" size="0xA000" access="ReadOnly" />
|
||||||
|
<MemorySegment name="BOOTLOADER_SETTINGS" start="0x000FF000" size="0x1000" access="ReadOnly" />
|
||||||
|
<MemorySegment name="MBR_PARAMS_PAGE" start="0x000FE000" size="0x1000" access="ReadOnly" />
|
||||||
|
<MemorySegment name="UICR_BOOTLOADER" start="0x10001014" size="0x04" access="ReadOnly" />
|
||||||
|
<MemorySegment name="UICR_MBR_PARAM_PAGE" start="0x10001018" size="0x04" access="ReadOnly" />
|
||||||
|
<MemorySegment name="RAM" start="0x20004000" size="0x3C000" access="Read/Write" />
|
||||||
|
<MemorySegment name="NOINIT" start="0x20007F80" size="0x80" access="Read/Write" />
|
||||||
|
</root>
|
19
src/segger/nRF_Target.js
Normal file
19
src/segger/nRF_Target.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* Solutions for real time microcontroller applications *
|
||||||
|
*****************************************************************************
|
||||||
|
* *
|
||||||
|
* (c) 2017 SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* *
|
||||||
|
* Internet: www.segger.com Support: support@segger.com *
|
||||||
|
* *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
function Reset() {
|
||||||
|
TargetInterface.resetAndStop();
|
||||||
|
}
|
||||||
|
|
||||||
|
function EnableTrace(traceInterfaceType) {
|
||||||
|
// TODO: Enable trace
|
||||||
|
}
|
||||||
|
|
22310
src/segger/nrf52840_Registers.xml
Normal file
22310
src/segger/nrf52840_Registers.xml
Normal file
File diff suppressed because it is too large
Load Diff
97
src/segger/nrf52840_bootloader.emProject
Normal file
97
src/segger/nrf52840_bootloader.emProject
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<!DOCTYPE CrossStudio_Project_File>
|
||||||
|
<solution Name="nrf52840_bootloader" target="8" version="2">
|
||||||
|
<project Name="nrf52840_bootloader">
|
||||||
|
<configuration
|
||||||
|
Name="Common"
|
||||||
|
Placement="Flash"
|
||||||
|
Target="nRF52840_xxAA"
|
||||||
|
arm_architecture="v7EM"
|
||||||
|
arm_core_type="Cortex-M4"
|
||||||
|
arm_endian="Little"
|
||||||
|
arm_fp_abi="Hard"
|
||||||
|
arm_fpu_type="FPv4-SP-D16"
|
||||||
|
arm_interwork="No"
|
||||||
|
arm_linker_heap_size="1024"
|
||||||
|
arm_linker_process_stack_size="0"
|
||||||
|
arm_linker_stack_size="1024"
|
||||||
|
arm_simulator_memory_simulation_parameter="ROM;0x00000000;0x00100000;RAM;0x20000000;0x00040000"
|
||||||
|
arm_target_debug_interface_type="ADIv5"
|
||||||
|
arm_target_device_name="nRF52840_xxAA"
|
||||||
|
arm_target_interface_type="SWD"
|
||||||
|
c_preprocessor_definitions="NRF52840_XXAA;__nRF_FAMILY;ARM_MATH_CM4;FLASH_PLACEMENT=1;BOARD_FEATHER52840;BOOTLOADER_VERSION=0x06000001;S140;CONFIG_GPIO_AS_PINRESET;BLE_STACK_SUPPORT_REQD;SWI_DISABLE0;SOFTDEVICE_PRESENT;FLOAT_ABI_HARD;DFU_APP_DATA_RESERVED=7*4096"
|
||||||
|
c_user_include_directories="$(TusbDir)/hw/cmsis/Include;$(TusbDir)/hw;$(TusbDir)/tinyusb;$(SdkDir);$(SdkDir)/device;$(SdkDir)/toolchain;$(SdkDir)/drivers_nrf/hal;$(SdkDir)/drivers_nrf/systick;$(SdkDir)/drivers_nrf/uart;$(SdkDir)/drivers_nrf/usbd;$(SdkDir)/drivers_nrf/common;$(SdkDir)/drivers_nrf/delay;$(SdkDir)/drivers_nrf/power;$(SdkDir)/drivers_nrf/clock;$(SdkDir)/drivers_nrf/pstorage;$(SdkDir)/external/fprintf;$(SdkDir)/libraries/util;$(SdkDir)/libraries/strerror;$(SdkDir)/libraries/atomic;$(SdkDir)/libraries/balloc;$(SdkDir)/libraries/experimental_log/src;$(SdkDir)/libraries/experimental_log;$(SdkDir)/libraries/experimental_section_vars;$(SdkDir)/libraries/experimental_memobj;$(SdkDir)/libraries/timer;$(SdkDir)/libraries/scheduler;$(SdkDir)/libraries/crc16;$(SdkDir)/libraries/util;$(SdkDir)/libraries/hci/config;$(SdkDir)/libraries/uart;$(SdkDir)/libraries/hci;$(SdkDir)/libraries/bootloader_dfu;$(SdkDir)/libraries/bootloader_dfu/hci_transport;$(SdkDir)/ble/common/;$(SdkDir)/ble/ble_services/ble_dfu;$(SdkDir)/ble/ble_services/ble_dis;$(SdDir)/s140/headers;$(SdDir)/s140/headers/nrf52;$(SdDir)/common/softdevice_handler;../"
|
||||||
|
debug_register_definition_file="$(ProjectDir)/nrf52840_Registers.xml"
|
||||||
|
debug_target_connection="J-Link"
|
||||||
|
gcc_entry_point="Reset_Handler"
|
||||||
|
linker_memory_map_file="$(ProjectDir)/nRF52840_xxAA_MemoryMap.xml"
|
||||||
|
linker_section_placement_file="$(ProjectDir)/flash_placement.xml"
|
||||||
|
macros="DeviceHeaderFile=$(PackagesDir)/nRF/CMSIS/Device/Include/nrf.h;DeviceLibraryIdentifier=M4lf;DeviceSystemFile=$(PackagesDir)/nRF/CMSIS/Device/Source/system_nrf52840.c;DeviceVectorsFile=$(PackagesDir)/nRF/Source/ses_nrf52840_Vectors.s;DeviceFamily=nRF;Target=nRF52840_xxAA;Placement=Flash;TusbDir=../../tinyusb;SdkDir=../../nRF5_SDK_11.0.0_89a8197/components;SdDir=../../softdevice/6.0.0"
|
||||||
|
project_directory=""
|
||||||
|
project_type="Executable"
|
||||||
|
target_reset_script="Reset();"
|
||||||
|
target_script_file="$(ProjectDir)/nRF_Target.js"
|
||||||
|
target_trace_initialize_script="EnableTrace("$(TraceInterfaceType)")" />
|
||||||
|
<folder Name="RTT Files">
|
||||||
|
<file file_name="SEGGER_RTT.c" />
|
||||||
|
<file file_name="SEGGER_RTT.h" />
|
||||||
|
<file file_name="SEGGER_RTT_Conf.h" />
|
||||||
|
<file file_name="SEGGER_RTT_SES.c" />
|
||||||
|
</folder>
|
||||||
|
<folder Name="Script Files">
|
||||||
|
<file file_name="nRF_Target.js">
|
||||||
|
<configuration Name="Common" file_type="Reset Script" />
|
||||||
|
</file>
|
||||||
|
</folder>
|
||||||
|
<folder Name="System Files">
|
||||||
|
<file file_name="thumb_crt0.s" />
|
||||||
|
<file file_name="flash_placement.xml" />
|
||||||
|
<file file_name="nRF52840_xxAA_MemoryMap.xml" />
|
||||||
|
<file file_name="ses_nRF_Startup.s" />
|
||||||
|
<file file_name="ses_nrf52840_Vectors.s" />
|
||||||
|
</folder>
|
||||||
|
<folder
|
||||||
|
Name="tinyusb"
|
||||||
|
exclude=""
|
||||||
|
filter="*.h"
|
||||||
|
path="../../tinyusb/tinyusb"
|
||||||
|
recurse="Yes" />
|
||||||
|
<folder Name="sdk">
|
||||||
|
<folder
|
||||||
|
Name="components"
|
||||||
|
exclude=""
|
||||||
|
filter="*.c;*.h;*.s;*.S"
|
||||||
|
path="../../nRF5_SDK_11.0.0_89a8197/components"
|
||||||
|
recurse="Yes" />
|
||||||
|
</folder>
|
||||||
|
<folder Name="src">
|
||||||
|
<file file_name="../boards.h" />
|
||||||
|
<file file_name="../dfu_ble_svc.c" />
|
||||||
|
<file file_name="../feather52840.h" />
|
||||||
|
<file file_name="../main.c" />
|
||||||
|
<file file_name="../metro52.h" />
|
||||||
|
<file file_name="../pstorage_platform.h" />
|
||||||
|
<file file_name="../sdk_config.h" />
|
||||||
|
</folder>
|
||||||
|
<configuration
|
||||||
|
Name="Debug"
|
||||||
|
link_use_linker_script_file="No"
|
||||||
|
linker_section_placement_file="flash_placement.xml" />
|
||||||
|
<folder
|
||||||
|
Name="softdevice"
|
||||||
|
exclude=""
|
||||||
|
filter="*.c;*.h"
|
||||||
|
path="../../softdevice"
|
||||||
|
recurse="Yes" />
|
||||||
|
</project>
|
||||||
|
<configuration
|
||||||
|
Name="Debug"
|
||||||
|
c_preprocessor_definitions="DEBUG"
|
||||||
|
gcc_debugging_level="Level 3"
|
||||||
|
gcc_optimization_level="None" />
|
||||||
|
<configuration
|
||||||
|
Name="Release"
|
||||||
|
c_preprocessor_definitions="NDEBUG"
|
||||||
|
gcc_debugging_level="None"
|
||||||
|
gcc_omit_frame_pointer="Yes"
|
||||||
|
gcc_optimization_level="Level 1" />
|
||||||
|
</solution>
|
148
src/segger/ses_nRF_Startup.s
Normal file
148
src/segger/ses_nRF_Startup.s
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* Solutions for real time microcontroller applications *
|
||||||
|
*****************************************************************************
|
||||||
|
* *
|
||||||
|
* (c) 2017 SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* *
|
||||||
|
* Internet: www.segger.com Support: support@segger.com *
|
||||||
|
* *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Preprocessor Definitions *
|
||||||
|
* ------------------------ *
|
||||||
|
* NO_FPU_ENABLE *
|
||||||
|
* *
|
||||||
|
* If defined, FPU will not be enabled. *
|
||||||
|
* *
|
||||||
|
* NO_STACK_INIT *
|
||||||
|
* *
|
||||||
|
* If defined, the stack pointer will not be initialised. *
|
||||||
|
* *
|
||||||
|
* NO_SYSTEM_INIT *
|
||||||
|
* *
|
||||||
|
* If defined, the SystemInit() function will not be called. By default *
|
||||||
|
* SystemInit() is called after reset to enable the clocks and memories to *
|
||||||
|
* be initialised prior to any C startup initialisation. *
|
||||||
|
* *
|
||||||
|
* NO_VTOR_CONFIG *
|
||||||
|
* *
|
||||||
|
* If defined, the vector table offset register will not be configured. *
|
||||||
|
* *
|
||||||
|
* MEMORY_INIT *
|
||||||
|
* *
|
||||||
|
* If defined, the MemoryInit() function will be called. By default *
|
||||||
|
* MemoryInit() is called after SystemInit() to enable an external memory *
|
||||||
|
* controller. *
|
||||||
|
* *
|
||||||
|
* STACK_INIT_VAL *
|
||||||
|
* *
|
||||||
|
* If defined, specifies the initial stack pointer value. If undefined, *
|
||||||
|
* the stack pointer will be initialised to point to the end of the *
|
||||||
|
* RAM segment. *
|
||||||
|
* *
|
||||||
|
* VECTORS_IN_RAM *
|
||||||
|
* *
|
||||||
|
* If defined, the exception vectors will be copied from Flash to RAM. *
|
||||||
|
* *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
|
.global Reset_Handler
|
||||||
|
#ifdef INITIALIZE_USER_SECTIONS
|
||||||
|
.global InitializeUserMemorySections
|
||||||
|
#endif
|
||||||
|
.extern _vectors
|
||||||
|
|
||||||
|
.section .init, "ax"
|
||||||
|
.thumb_func
|
||||||
|
|
||||||
|
.equ VTOR_REG, 0xE000ED08
|
||||||
|
.equ FPU_CPACR_REG, 0xE000ED88
|
||||||
|
|
||||||
|
#ifndef STACK_INIT_VAL
|
||||||
|
#define STACK_INIT_VAL __RAM_segment_end__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Reset_Handler:
|
||||||
|
#ifndef NO_STACK_INIT
|
||||||
|
/* Initialise main stack */
|
||||||
|
ldr r0, =STACK_INIT_VAL
|
||||||
|
ldr r1, =0x7
|
||||||
|
bics r0, r1
|
||||||
|
mov sp, r0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NO_SYSTEM_INIT
|
||||||
|
/* Initialise system */
|
||||||
|
ldr r0, =SystemInit
|
||||||
|
blx r0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MEMORY_INIT
|
||||||
|
ldr r0, =MemoryInit
|
||||||
|
blx r0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VECTORS_IN_RAM
|
||||||
|
/* Copy exception vectors into RAM */
|
||||||
|
ldr r0, =__vectors_start__
|
||||||
|
ldr r1, =__vectors_end__
|
||||||
|
ldr r2, =__vectors_ram_start__
|
||||||
|
1:
|
||||||
|
cmp r0, r1
|
||||||
|
beq 2f
|
||||||
|
ldr r3, [r0]
|
||||||
|
str r3, [r2]
|
||||||
|
adds r0, r0, #4
|
||||||
|
adds r2, r2, #4
|
||||||
|
b 1b
|
||||||
|
2:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NO_VTOR_CONFIG
|
||||||
|
/* Configure vector table offset register */
|
||||||
|
ldr r0, =VTOR_REG
|
||||||
|
#ifdef VECTORS_IN_RAM
|
||||||
|
ldr r1, =_vectors_ram
|
||||||
|
#else
|
||||||
|
ldr r1, =_vectors
|
||||||
|
#endif
|
||||||
|
str r1, [r0]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__ARM_ARCH_FPV4_SP_D16__) || defined(__ARM_ARCH_FPV5_D16__)) && !defined(NO_FPU_ENABLE)
|
||||||
|
/* Enable FPU */
|
||||||
|
ldr r0, =FPU_CPACR_REG
|
||||||
|
ldr r1, [r0]
|
||||||
|
orr r1, r1, #(0xF << 20)
|
||||||
|
str r1, [r0]
|
||||||
|
dsb
|
||||||
|
isb
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Jump to program start */
|
||||||
|
b _start
|
||||||
|
|
||||||
|
#ifdef INITIALIZE_USER_SECTIONS
|
||||||
|
.thumb_func
|
||||||
|
InitializeUserMemorySections:
|
||||||
|
ldr r0, =__start_nrf_sections
|
||||||
|
ldr r1, =__start_nrf_sections_run
|
||||||
|
ldr r2, =__end_nrf_sections_run
|
||||||
|
cmp r0, r1
|
||||||
|
beq 2f
|
||||||
|
subs r2, r2, r1
|
||||||
|
beq 2f
|
||||||
|
1:
|
||||||
|
ldrb r3, [r0]
|
||||||
|
adds r0, r0, #1
|
||||||
|
strb r3, [r1]
|
||||||
|
adds r1, r1, #1
|
||||||
|
subs r2, r2, #1
|
||||||
|
bne 1b
|
||||||
|
2:
|
||||||
|
bx lr
|
||||||
|
#endif
|
513
src/segger/ses_nrf52840_Vectors.s
Normal file
513
src/segger/ses_nrf52840_Vectors.s
Normal file
@ -0,0 +1,513 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* Solutions for real time microcontroller applications *
|
||||||
|
*****************************************************************************
|
||||||
|
* *
|
||||||
|
* (c) 2017 SEGGER Microcontroller GmbH & Co. KG *
|
||||||
|
* *
|
||||||
|
* Internet: www.segger.com Support: support@segger.com *
|
||||||
|
* *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Preprocessor Definitions *
|
||||||
|
* ------------------------ *
|
||||||
|
* VECTORS_IN_RAM *
|
||||||
|
* *
|
||||||
|
* If defined, an area of RAM will large enough to store the vector table *
|
||||||
|
* will be reserved. *
|
||||||
|
* *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
.code 16
|
||||||
|
|
||||||
|
.section .init, "ax"
|
||||||
|
.align 0
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Default Exception Handlers *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak NMI_Handler
|
||||||
|
NMI_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak HardFault_Handler
|
||||||
|
HardFault_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak MemoryManagement_Handler
|
||||||
|
MemoryManagement_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak BusFault_Handler
|
||||||
|
BusFault_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak UsageFault_Handler
|
||||||
|
UsageFault_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SVC_Handler
|
||||||
|
SVC_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak DebugMon_Handler
|
||||||
|
DebugMon_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak PendSV_Handler
|
||||||
|
PendSV_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SysTick_Handler
|
||||||
|
SysTick_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
Dummy_Handler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
#if defined(__OPTIMIZATION_SMALL)
|
||||||
|
|
||||||
|
.weak POWER_CLOCK_IRQHandler
|
||||||
|
.thumb_set POWER_CLOCK_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak RADIO_IRQHandler
|
||||||
|
.thumb_set RADIO_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak UARTE0_UART0_IRQHandler
|
||||||
|
.thumb_set UARTE0_UART0_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler
|
||||||
|
.thumb_set SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler
|
||||||
|
.thumb_set SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak NFCT_IRQHandler
|
||||||
|
.thumb_set NFCT_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak GPIOTE_IRQHandler
|
||||||
|
.thumb_set GPIOTE_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SAADC_IRQHandler
|
||||||
|
.thumb_set SAADC_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak TIMER0_IRQHandler
|
||||||
|
.thumb_set TIMER0_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak TIMER1_IRQHandler
|
||||||
|
.thumb_set TIMER1_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak TIMER2_IRQHandler
|
||||||
|
.thumb_set TIMER2_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak RTC0_IRQHandler
|
||||||
|
.thumb_set RTC0_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak TEMP_IRQHandler
|
||||||
|
.thumb_set TEMP_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak RNG_IRQHandler
|
||||||
|
.thumb_set RNG_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak ECB_IRQHandler
|
||||||
|
.thumb_set ECB_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak CCM_AAR_IRQHandler
|
||||||
|
.thumb_set CCM_AAR_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak WDT_IRQHandler
|
||||||
|
.thumb_set WDT_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak RTC1_IRQHandler
|
||||||
|
.thumb_set RTC1_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak QDEC_IRQHandler
|
||||||
|
.thumb_set QDEC_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak COMP_LPCOMP_IRQHandler
|
||||||
|
.thumb_set COMP_LPCOMP_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SWI0_EGU0_IRQHandler
|
||||||
|
.thumb_set SWI0_EGU0_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SWI1_EGU1_IRQHandler
|
||||||
|
.thumb_set SWI1_EGU1_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SWI2_EGU2_IRQHandler
|
||||||
|
.thumb_set SWI2_EGU2_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SWI3_EGU3_IRQHandler
|
||||||
|
.thumb_set SWI3_EGU3_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SWI4_EGU4_IRQHandler
|
||||||
|
.thumb_set SWI4_EGU4_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SWI5_EGU5_IRQHandler
|
||||||
|
.thumb_set SWI5_EGU5_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak TIMER3_IRQHandler
|
||||||
|
.thumb_set TIMER3_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak TIMER4_IRQHandler
|
||||||
|
.thumb_set TIMER4_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak PWM0_IRQHandler
|
||||||
|
.thumb_set PWM0_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak PDM_IRQHandler
|
||||||
|
.thumb_set PDM_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak MWU_IRQHandler
|
||||||
|
.thumb_set MWU_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak PWM1_IRQHandler
|
||||||
|
.thumb_set PWM1_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak PWM2_IRQHandler
|
||||||
|
.thumb_set PWM2_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SPIM2_SPIS2_SPI2_IRQHandler
|
||||||
|
.thumb_set SPIM2_SPIS2_SPI2_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak RTC2_IRQHandler
|
||||||
|
.thumb_set RTC2_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak I2S_IRQHandler
|
||||||
|
.thumb_set I2S_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak FPU_IRQHandler
|
||||||
|
.thumb_set FPU_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak USBD_IRQHandler
|
||||||
|
.thumb_set USBD_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak UARTE1_IRQHandler
|
||||||
|
.thumb_set UARTE1_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak QSPI_IRQHandler
|
||||||
|
.thumb_set QSPI_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak CRYPTOCELL_IRQHandler
|
||||||
|
.thumb_set CRYPTOCELL_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak SPIM3_IRQHandler
|
||||||
|
.thumb_set SPIM3_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
.weak PWM3_IRQHandler
|
||||||
|
.thumb_set PWM3_IRQHandler,Dummy_Handler
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak POWER_CLOCK_IRQHandler
|
||||||
|
POWER_CLOCK_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak RADIO_IRQHandler
|
||||||
|
RADIO_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak UARTE0_UART0_IRQHandler
|
||||||
|
UARTE0_UART0_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler
|
||||||
|
SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler
|
||||||
|
SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak NFCT_IRQHandler
|
||||||
|
NFCT_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak GPIOTE_IRQHandler
|
||||||
|
GPIOTE_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SAADC_IRQHandler
|
||||||
|
SAADC_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak TIMER0_IRQHandler
|
||||||
|
TIMER0_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak TIMER1_IRQHandler
|
||||||
|
TIMER1_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak TIMER2_IRQHandler
|
||||||
|
TIMER2_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak RTC0_IRQHandler
|
||||||
|
RTC0_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak TEMP_IRQHandler
|
||||||
|
TEMP_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak RNG_IRQHandler
|
||||||
|
RNG_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak ECB_IRQHandler
|
||||||
|
ECB_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak CCM_AAR_IRQHandler
|
||||||
|
CCM_AAR_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak WDT_IRQHandler
|
||||||
|
WDT_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak RTC1_IRQHandler
|
||||||
|
RTC1_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak QDEC_IRQHandler
|
||||||
|
QDEC_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak COMP_LPCOMP_IRQHandler
|
||||||
|
COMP_LPCOMP_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SWI0_EGU0_IRQHandler
|
||||||
|
SWI0_EGU0_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SWI1_EGU1_IRQHandler
|
||||||
|
SWI1_EGU1_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SWI2_EGU2_IRQHandler
|
||||||
|
SWI2_EGU2_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SWI3_EGU3_IRQHandler
|
||||||
|
SWI3_EGU3_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SWI4_EGU4_IRQHandler
|
||||||
|
SWI4_EGU4_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SWI5_EGU5_IRQHandler
|
||||||
|
SWI5_EGU5_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak TIMER3_IRQHandler
|
||||||
|
TIMER3_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak TIMER4_IRQHandler
|
||||||
|
TIMER4_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak PWM0_IRQHandler
|
||||||
|
PWM0_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak PDM_IRQHandler
|
||||||
|
PDM_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak MWU_IRQHandler
|
||||||
|
MWU_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak PWM1_IRQHandler
|
||||||
|
PWM1_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak PWM2_IRQHandler
|
||||||
|
PWM2_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SPIM2_SPIS2_SPI2_IRQHandler
|
||||||
|
SPIM2_SPIS2_SPI2_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak RTC2_IRQHandler
|
||||||
|
RTC2_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak I2S_IRQHandler
|
||||||
|
I2S_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak FPU_IRQHandler
|
||||||
|
FPU_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak USBD_IRQHandler
|
||||||
|
USBD_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak UARTE1_IRQHandler
|
||||||
|
UARTE1_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak QSPI_IRQHandler
|
||||||
|
QSPI_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak CRYPTOCELL_IRQHandler
|
||||||
|
CRYPTOCELL_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak SPIM3_IRQHandler
|
||||||
|
SPIM3_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
.weak PWM3_IRQHandler
|
||||||
|
PWM3_IRQHandler:
|
||||||
|
b .
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Vector Table *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
.section .vectors, "ax"
|
||||||
|
.align 0
|
||||||
|
.global _vectors
|
||||||
|
.extern __stack_end__
|
||||||
|
.extern Reset_Handler
|
||||||
|
|
||||||
|
_vectors:
|
||||||
|
.word __stack_end__
|
||||||
|
.word Reset_Handler
|
||||||
|
.word NMI_Handler
|
||||||
|
.word HardFault_Handler
|
||||||
|
.word MemoryManagement_Handler
|
||||||
|
.word BusFault_Handler
|
||||||
|
.word UsageFault_Handler
|
||||||
|
.word 0 /* Reserved */
|
||||||
|
.word 0 /* Reserved */
|
||||||
|
.word 0 /* Reserved */
|
||||||
|
.word 0 /* Reserved */
|
||||||
|
.word SVC_Handler
|
||||||
|
.word DebugMon_Handler
|
||||||
|
.word 0 /* Reserved */
|
||||||
|
.word PendSV_Handler
|
||||||
|
.word SysTick_Handler
|
||||||
|
.word POWER_CLOCK_IRQHandler
|
||||||
|
.word RADIO_IRQHandler
|
||||||
|
.word UARTE0_UART0_IRQHandler
|
||||||
|
.word SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler
|
||||||
|
.word SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler
|
||||||
|
.word NFCT_IRQHandler
|
||||||
|
.word GPIOTE_IRQHandler
|
||||||
|
.word SAADC_IRQHandler
|
||||||
|
.word TIMER0_IRQHandler
|
||||||
|
.word TIMER1_IRQHandler
|
||||||
|
.word TIMER2_IRQHandler
|
||||||
|
.word RTC0_IRQHandler
|
||||||
|
.word TEMP_IRQHandler
|
||||||
|
.word RNG_IRQHandler
|
||||||
|
.word ECB_IRQHandler
|
||||||
|
.word CCM_AAR_IRQHandler
|
||||||
|
.word WDT_IRQHandler
|
||||||
|
.word RTC1_IRQHandler
|
||||||
|
.word QDEC_IRQHandler
|
||||||
|
.word COMP_LPCOMP_IRQHandler
|
||||||
|
.word SWI0_EGU0_IRQHandler
|
||||||
|
.word SWI1_EGU1_IRQHandler
|
||||||
|
.word SWI2_EGU2_IRQHandler
|
||||||
|
.word SWI3_EGU3_IRQHandler
|
||||||
|
.word SWI4_EGU4_IRQHandler
|
||||||
|
.word SWI5_EGU5_IRQHandler
|
||||||
|
.word TIMER3_IRQHandler
|
||||||
|
.word TIMER4_IRQHandler
|
||||||
|
.word PWM0_IRQHandler
|
||||||
|
.word PDM_IRQHandler
|
||||||
|
.word Dummy_Handler /* Reserved */
|
||||||
|
.word Dummy_Handler /* Reserved */
|
||||||
|
.word MWU_IRQHandler
|
||||||
|
.word PWM1_IRQHandler
|
||||||
|
.word PWM2_IRQHandler
|
||||||
|
.word SPIM2_SPIS2_SPI2_IRQHandler
|
||||||
|
.word RTC2_IRQHandler
|
||||||
|
.word I2S_IRQHandler
|
||||||
|
.word FPU_IRQHandler
|
||||||
|
.word USBD_IRQHandler
|
||||||
|
.word UARTE1_IRQHandler
|
||||||
|
.word QSPI_IRQHandler
|
||||||
|
.word CRYPTOCELL_IRQHandler
|
||||||
|
.word SPIM3_IRQHandler
|
||||||
|
.word Dummy_Handler /* Reserved */
|
||||||
|
.word PWM3_IRQHandler
|
||||||
|
_vectors_end:
|
||||||
|
|
||||||
|
#ifdef VECTORS_IN_RAM
|
||||||
|
.section .vectors_ram, "ax"
|
||||||
|
.align 0
|
||||||
|
.global _vectors_ram
|
||||||
|
|
||||||
|
_vectors_ram:
|
||||||
|
.space _vectors_end - _vectors, 0
|
||||||
|
#endif
|
420
src/segger/thumb_crt0.s
Normal file
420
src/segger/thumb_crt0.s
Normal file
@ -0,0 +1,420 @@
|
|||||||
|
// SEGGER Embedded Studio, runtime support.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2014-2017 SEGGER Microcontroller GmbH & Co KG
|
||||||
|
// Copyright (c) 2001-2017 Rowley Associates Limited.
|
||||||
|
//
|
||||||
|
// This file may be distributed under the terms of the License Agreement
|
||||||
|
// provided with this software.
|
||||||
|
//
|
||||||
|
// THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Preprocessor Definitions
|
||||||
|
// ------------------------
|
||||||
|
// APP_ENTRY_POINT
|
||||||
|
//
|
||||||
|
// Defines the application entry point function, if undefined this setting
|
||||||
|
// defaults to "main".
|
||||||
|
//
|
||||||
|
// INITIALIZE_STACK
|
||||||
|
//
|
||||||
|
// If defined, the contents of the stack will be initialized to a the
|
||||||
|
// value 0xCC.
|
||||||
|
//
|
||||||
|
// INITIALIZE_SECONDARY_SECTIONS
|
||||||
|
//
|
||||||
|
// If defined, the .data2, .text2, .rodata2 and .bss2 sections will be initialized.
|
||||||
|
//
|
||||||
|
// INITIALIZE_TCM_SECTIONS
|
||||||
|
//
|
||||||
|
// If defined, the .data_tcm, .text_tcm, .rodata_tcm and .bss_tcm sections
|
||||||
|
// will be initialized.
|
||||||
|
//
|
||||||
|
// INITIALIZE_USER_SECTIONS
|
||||||
|
//
|
||||||
|
// If defined, the function InitializeUserMemorySections will be called prior
|
||||||
|
// to entering main in order to allow the user to initialize any user defined
|
||||||
|
// memory sections.
|
||||||
|
//
|
||||||
|
// FULL_LIBRARY
|
||||||
|
//
|
||||||
|
// If defined then
|
||||||
|
// - argc, argv are setup by the debug_getargs.
|
||||||
|
// - the exit symbol is defined and executes on return from main.
|
||||||
|
// - the exit symbol calls destructors, atexit functions and then debug_exit.
|
||||||
|
//
|
||||||
|
// If not defined then
|
||||||
|
// - argc and argv are zero.
|
||||||
|
// - the exit symbol is defined, executes on return from main and loops
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef APP_ENTRY_POINT
|
||||||
|
#define APP_ENTRY_POINT main
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARGSSPACE
|
||||||
|
#define ARGSSPACE 128
|
||||||
|
#endif
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
|
.global _start
|
||||||
|
.extern APP_ENTRY_POINT
|
||||||
|
.global exit
|
||||||
|
.weak exit
|
||||||
|
|
||||||
|
#ifdef INITIALIZE_USER_SECTIONS
|
||||||
|
.extern InitializeUserMemorySections
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.section .init, "ax"
|
||||||
|
.code 16
|
||||||
|
.align 2
|
||||||
|
.thumb_func
|
||||||
|
|
||||||
|
_start:
|
||||||
|
/* Set up main stack if size > 0 */
|
||||||
|
ldr r1, =__stack_end__
|
||||||
|
ldr r0, =__stack_start__
|
||||||
|
subs r2, r1, r0
|
||||||
|
beq 1f
|
||||||
|
#ifdef __ARM_EABI__
|
||||||
|
movs r2, #0x7
|
||||||
|
bics r1, r2
|
||||||
|
#endif
|
||||||
|
mov sp, r1
|
||||||
|
#ifdef INITIALIZE_STACK
|
||||||
|
movs r2, #0xCC
|
||||||
|
ldr r0, =__stack_start__
|
||||||
|
bl memory_set
|
||||||
|
#endif
|
||||||
|
1:
|
||||||
|
|
||||||
|
/* Set up process stack if size > 0 */
|
||||||
|
ldr r1, =__stack_process_end__
|
||||||
|
ldr r0, =__stack_process_start__
|
||||||
|
subs r2, r1, r0
|
||||||
|
beq 1f
|
||||||
|
#ifdef __ARM_EABI__
|
||||||
|
movs r2, #0x7
|
||||||
|
bics r1, r2
|
||||||
|
#endif
|
||||||
|
msr psp, r1
|
||||||
|
movs r2, #2
|
||||||
|
msr control, r2
|
||||||
|
#ifdef INITIALIZE_STACK
|
||||||
|
movs r2, #0xCC
|
||||||
|
bl memory_set
|
||||||
|
#endif
|
||||||
|
1:
|
||||||
|
|
||||||
|
/* Copy initialized memory sections into RAM (if necessary). */
|
||||||
|
ldr r0, =__data_load_start__
|
||||||
|
ldr r1, =__data_start__
|
||||||
|
ldr r2, =__data_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__text_load_start__
|
||||||
|
ldr r1, =__text_start__
|
||||||
|
ldr r2, =__text_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__fast_load_start__
|
||||||
|
ldr r1, =__fast_start__
|
||||||
|
ldr r2, =__fast_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__ctors_load_start__
|
||||||
|
ldr r1, =__ctors_start__
|
||||||
|
ldr r2, =__ctors_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__dtors_load_start__
|
||||||
|
ldr r1, =__dtors_start__
|
||||||
|
ldr r2, =__dtors_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__rodata_load_start__
|
||||||
|
ldr r1, =__rodata_start__
|
||||||
|
ldr r2, =__rodata_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__tdata_load_start__
|
||||||
|
ldr r1, =__tdata_start__
|
||||||
|
ldr r2, =__tdata_end__
|
||||||
|
bl memory_copy
|
||||||
|
#ifdef INITIALIZE_SECONDARY_SECTIONS
|
||||||
|
ldr r0, =__data2_load_start__
|
||||||
|
ldr r1, =__data2_start__
|
||||||
|
ldr r2, =__data2_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__text2_load_start__
|
||||||
|
ldr r1, =__text2_start__
|
||||||
|
ldr r2, =__text2_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__rodata2_load_start__
|
||||||
|
ldr r1, =__rodata2_start__
|
||||||
|
ldr r2, =__rodata2_end__
|
||||||
|
bl memory_copy
|
||||||
|
#endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
|
||||||
|
#ifdef INITIALIZE_TCM_SECTIONS
|
||||||
|
ldr r0, =__data_tcm_load_start__
|
||||||
|
ldr r1, =__data_tcm_start__
|
||||||
|
ldr r2, =__data_tcm_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__text_tcm_load_start__
|
||||||
|
ldr r1, =__text_tcm_start__
|
||||||
|
ldr r2, =__text_tcm_end__
|
||||||
|
bl memory_copy
|
||||||
|
ldr r0, =__rodata_tcm_load_start__
|
||||||
|
ldr r1, =__rodata_tcm_start__
|
||||||
|
ldr r2, =__rodata_tcm_end__
|
||||||
|
bl memory_copy
|
||||||
|
#endif /* #ifdef INITIALIZE_TCM_SECTIONS */
|
||||||
|
|
||||||
|
/* Zero the bss. */
|
||||||
|
ldr r0, =__bss_start__
|
||||||
|
ldr r1, =__bss_end__
|
||||||
|
movs r2, #0
|
||||||
|
bl memory_set
|
||||||
|
ldr r0, =__tbss_start__
|
||||||
|
ldr r1, =__tbss_end__
|
||||||
|
movs r2, #0
|
||||||
|
bl memory_set
|
||||||
|
#ifdef INITIALIZE_SECONDARY_SECTIONS
|
||||||
|
ldr r0, =__bss2_start__
|
||||||
|
ldr r1, =__bss2_end__
|
||||||
|
mov r2, #0
|
||||||
|
bl memory_set
|
||||||
|
#endif /* #ifdef INITIALIZE_SECONDARY_SECTIONS */
|
||||||
|
#ifdef INITIALIZE_TCM_SECTIONS
|
||||||
|
ldr r0, =__bss_tcm_start__
|
||||||
|
ldr r1, =__bss_tcm_end__
|
||||||
|
mov r2, #0
|
||||||
|
bl memory_set
|
||||||
|
#endif /* #ifdef INITIALIZE_TCM_SECTIONS */
|
||||||
|
|
||||||
|
/* Initialize the heap */
|
||||||
|
ldr r0, = __heap_start__
|
||||||
|
ldr r1, = __heap_end__
|
||||||
|
subs r1, r1, r0
|
||||||
|
cmp r1, #8
|
||||||
|
blt 1f
|
||||||
|
movs r2, #0
|
||||||
|
str r2, [r0]
|
||||||
|
adds r0, r0, #4
|
||||||
|
str r1, [r0]
|
||||||
|
1:
|
||||||
|
|
||||||
|
#ifdef INITIALIZE_USER_SECTIONS
|
||||||
|
ldr r2, =InitializeUserMemorySections
|
||||||
|
blx r2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Call constructors */
|
||||||
|
ldr r0, =__ctors_start__
|
||||||
|
ldr r1, =__ctors_end__
|
||||||
|
ctor_loop:
|
||||||
|
cmp r0, r1
|
||||||
|
beq ctor_end
|
||||||
|
ldr r2, [r0]
|
||||||
|
adds r0, #4
|
||||||
|
push {r0-r1}
|
||||||
|
blx r2
|
||||||
|
pop {r0-r1}
|
||||||
|
b ctor_loop
|
||||||
|
ctor_end:
|
||||||
|
|
||||||
|
/* Setup initial call frame */
|
||||||
|
movs r0, #0
|
||||||
|
mov lr, r0
|
||||||
|
mov r12, sp
|
||||||
|
|
||||||
|
.type start, function
|
||||||
|
start:
|
||||||
|
/* Jump to application entry point */
|
||||||
|
#ifdef FULL_LIBRARY
|
||||||
|
movs r0, #ARGSSPACE
|
||||||
|
ldr r1, =args
|
||||||
|
ldr r2, =debug_getargs
|
||||||
|
blx r2
|
||||||
|
ldr r1, =args
|
||||||
|
#else
|
||||||
|
movs r0, #0
|
||||||
|
movs r1, #0
|
||||||
|
#endif
|
||||||
|
ldr r2, =APP_ENTRY_POINT
|
||||||
|
blx r2
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
exit:
|
||||||
|
#ifdef FULL_LIBRARY
|
||||||
|
mov r5, r0 // save the exit parameter/return result
|
||||||
|
|
||||||
|
/* Call destructors */
|
||||||
|
ldr r0, =__dtors_start__
|
||||||
|
ldr r1, =__dtors_end__
|
||||||
|
dtor_loop:
|
||||||
|
cmp r0, r1
|
||||||
|
beq dtor_end
|
||||||
|
ldr r2, [r0]
|
||||||
|
add r0, #4
|
||||||
|
push {r0-r1}
|
||||||
|
blx r2
|
||||||
|
pop {r0-r1}
|
||||||
|
b dtor_loop
|
||||||
|
dtor_end:
|
||||||
|
|
||||||
|
/* Call atexit functions */
|
||||||
|
ldr r2, =_execute_at_exit_fns
|
||||||
|
blx r2
|
||||||
|
|
||||||
|
/* Call debug_exit with return result/exit parameter */
|
||||||
|
mov r0, r5
|
||||||
|
ldr r2, =debug_exit
|
||||||
|
blx r2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Returned from application entry point, loop forever. */
|
||||||
|
exit_loop:
|
||||||
|
b exit_loop
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
memory_copy:
|
||||||
|
cmp r0, r1
|
||||||
|
beq 2f
|
||||||
|
subs r2, r2, r1
|
||||||
|
beq 2f
|
||||||
|
1:
|
||||||
|
ldrb r3, [r0]
|
||||||
|
adds r0, r0, #1
|
||||||
|
strb r3, [r1]
|
||||||
|
adds r1, r1, #1
|
||||||
|
subs r2, r2, #1
|
||||||
|
bne 1b
|
||||||
|
2:
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
.thumb_func
|
||||||
|
memory_set:
|
||||||
|
cmp r0, r1
|
||||||
|
beq 1f
|
||||||
|
strb r2, [r0]
|
||||||
|
adds r0, r0, #1
|
||||||
|
b memory_set
|
||||||
|
1:
|
||||||
|
bx lr
|
||||||
|
|
||||||
|
// default C/C++ library helpers
|
||||||
|
|
||||||
|
.macro HELPER helper_name
|
||||||
|
.section .text.\helper_name, "ax", %progbits
|
||||||
|
.global \helper_name
|
||||||
|
.weak \helper_name
|
||||||
|
\helper_name:
|
||||||
|
.thumb_func
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro JUMPTO name
|
||||||
|
#if defined(__thumb__) && !defined(__thumb2__)
|
||||||
|
mov r12, r0
|
||||||
|
ldr r0, =\name
|
||||||
|
push {r0}
|
||||||
|
mov r0, r12
|
||||||
|
pop {pc}
|
||||||
|
#else
|
||||||
|
b \name
|
||||||
|
#endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
HELPER __aeabi_read_tp
|
||||||
|
ldr r0, =__tbss_start__-8
|
||||||
|
bx lr
|
||||||
|
HELPER __heap_lock
|
||||||
|
bx lr
|
||||||
|
HELPER __heap_unlock
|
||||||
|
bx lr
|
||||||
|
HELPER __printf_lock
|
||||||
|
bx lr
|
||||||
|
HELPER __printf_unlock
|
||||||
|
bx lr
|
||||||
|
HELPER __scanf_lock
|
||||||
|
bx lr
|
||||||
|
HELPER __scanf_unlock
|
||||||
|
bx lr
|
||||||
|
HELPER __debug_io_lock
|
||||||
|
bx lr
|
||||||
|
HELPER __debug_io_unlock
|
||||||
|
bx lr
|
||||||
|
HELPER abort
|
||||||
|
b .
|
||||||
|
HELPER __assert
|
||||||
|
b .
|
||||||
|
HELPER __aeabi_assert
|
||||||
|
b .
|
||||||
|
HELPER __cxa_pure_virtual
|
||||||
|
b .
|
||||||
|
HELPER __cxa_guard_acquire
|
||||||
|
ldr r3, [r0]
|
||||||
|
#if defined(__thumb__) && !defined(__thumb2__)
|
||||||
|
movs r0, #1
|
||||||
|
tst r3, r0
|
||||||
|
#else
|
||||||
|
tst r3, #1
|
||||||
|
#endif
|
||||||
|
beq 1f
|
||||||
|
movs r0, #0
|
||||||
|
bx lr
|
||||||
|
1:
|
||||||
|
movs r0, #1
|
||||||
|
bx lr
|
||||||
|
HELPER __cxa_guard_release
|
||||||
|
movs r3, #1
|
||||||
|
str r3, [r0]
|
||||||
|
bx lr
|
||||||
|
HELPER __cxa_guard_abort
|
||||||
|
bx lr
|
||||||
|
HELPER __sync_synchronize
|
||||||
|
bx lr
|
||||||
|
HELPER __getchar
|
||||||
|
JUMPTO debug_getchar
|
||||||
|
HELPER __putchar
|
||||||
|
JUMPTO debug_putchar
|
||||||
|
HELPER __open
|
||||||
|
JUMPTO debug_fopen
|
||||||
|
HELPER __close
|
||||||
|
JUMPTO debug_fclose
|
||||||
|
HELPER __write
|
||||||
|
mov r3, r0
|
||||||
|
mov r0, r1
|
||||||
|
movs r1, #1
|
||||||
|
JUMPTO debug_fwrite
|
||||||
|
HELPER __read
|
||||||
|
mov r3, r0
|
||||||
|
mov r0, r1
|
||||||
|
movs r1, #1
|
||||||
|
JUMPTO debug_fread
|
||||||
|
HELPER __seek
|
||||||
|
push {r4, lr}
|
||||||
|
mov r4, r0
|
||||||
|
bl debug_fseek
|
||||||
|
cmp r0, #0
|
||||||
|
bne 1f
|
||||||
|
mov r0, r4
|
||||||
|
bl debug_ftell
|
||||||
|
pop {r4, pc}
|
||||||
|
1:
|
||||||
|
ldr r0, =-1
|
||||||
|
pop {r4, pc}
|
||||||
|
// char __user_locale_name_buffer[];
|
||||||
|
.section .bss.__user_locale_name_buffer, "aw", %nobits
|
||||||
|
.global __user_locale_name_buffer
|
||||||
|
.weak __user_locale_name_buffer
|
||||||
|
__user_locale_name_buffer:
|
||||||
|
.word 0x0
|
||||||
|
|
||||||
|
#ifdef FULL_LIBRARY
|
||||||
|
.bss
|
||||||
|
args:
|
||||||
|
.space ARGSSPACE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Setup attibutes of stack and heap sections so they don't take up room in the elf file */
|
||||||
|
.section .stack, "wa", %nobits
|
||||||
|
.section .stack_process, "wa", %nobits
|
||||||
|
.section .heap, "wa", %nobits
|
||||||
|
|
Loading…
Reference in New Issue
Block a user