mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
		
			
				
	
	
		
			168 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			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 */
 |