mbed-os/rtos/TARGET_CORTEX/mbed_boot.h

168 lines
4.1 KiB
C

/* mbed Microcontroller Library
* Copyright (c) 2018-2018 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*
* 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.
*/
#ifndef MBED_BOOT_H
#define MBED_BOOT_H
#include "mbed_toolchain.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "mbed_rtx.h"
/**
* \defgroup boot Boot sequence
* Boot sequence overview
*
* 1. Setup target
* - Configure clocks
* - Configure watchdog (if applicable)
* - Turn on RAM (if applicable)
* - Jump to setup toolchain
* 2. Setup toolchain
* - Initialize RAM
* - Initialize standard library
* - Call mbed_init
* - jump to start rtos
* 3. Start RTOS
* - Create main thread
* - Start scheduler
* - main thread calls start mbed
* 4. Start mbed
* - Call mbed_main
* - Call main
*
* @{
*/
/* Heap limits - only used if set */
extern unsigned char *mbed_heap_start;
extern uint32_t mbed_heap_size;
/* Stack limits */
extern unsigned char *mbed_stack_isr_start;
extern uint32_t mbed_stack_isr_size;
/**
* Perform low level init of mbed
*
* The toolchain calls this function as part of the boot
* sequence. This function does the following:
* - Sets up NVIC so interrupts can be used
* - Calls into the vendor SDK so it can be used
* - Initializes the RTOS so it can be used
*
* Preconditions:
* - Target is initialized
* - Ram is initialized
* - value set for mbed_heap_start
* - value set for mbed_heap_size
* - value set for mbed_stack_isr_start
* - value set for mbed_stack_isr_size
*
* The following events must not have happened yet:
* - global constructors must not be called yet
*
*/
void mbed_init(void);
/**
* Start the main mbed application
*
* This is the last stage of the boot sequence. This function must be
* called only after the RTOS has been fully initialized.
* This function does the following:
* - Initialize the toolchain
* - Run mbed_main
* - Run main
*
* Preconditions:
* - The RTOS has been started by a call to mbed_rtos_start
*
*/
void mbed_start(void);
/**
* Perform low level initialization of the RTOS
*
* Set the RTOS to a known state but don't start the scheduler. After
* the RTOS has been initialized it is safe to create RTOS primitives
* for file locks or other purposes.
*
* Preconditions:
* - Ram is initialized
* - NVIC is setup
* - Vendor SDK must be initialized by a call to mbed_sdk_init
*/
void mbed_rtos_init(void);
/**
* Start the RTOS
*
* Start the RTOS scheduler and call mbed_start on the
* main thread. This function does not return.
*
* Preconditions:
* - RTOS has been initialized by a call to mbed_rtos_init
*/
MBED_NORETURN void mbed_rtos_start(void);
/**
* Perform toolchain specific initialization
*
* Initialize locks if this has not been done already
* and call global C++ constructors.
*
* Preconditions:
* - The RTOS has been started by a call to mbed_rtos_start
*/
void mbed_toolchain_init(void);
/**
* SDK hook for running code before ctors or OS
*
* This is a weak function which can be overridden by a target's
* SDK to allow code to run after ram is initialized but before
* the OS has been started or constructors have run.
*
* Preconditions:
* - Ram is initialized
* - NVIC is setup
*/
void mbed_sdk_init(void);
/**
* Application hook for running code before main
*
* This is a weak function which can be overridden by an application
* to allow code to run before main is called.
*
* Preconditions:
* - The RTOS has been started by a call to mbed_rtos_start
* - The toolchain has been initialized by a call to mbed_toolchain_init
*/
void mbed_main(void);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* MBED_BOOT_H */