Synergy CORTEX M 启动流程
1、启动文件“startup_S7G2.c”
中断向量表地址指针:“0xe000ed08”
/* Vector table. */
BSP_DONT_REMOVE const exc_ptr_t __Vectors[BSP_CORTEX_VECTOR_TABLE_ENTRIES] BSP_PLACE_IN_SECTION(BSP_SECTION_VECTOR) =
{
(exc_ptr_t)(&g_main_stack[] + BSP_CFG_STACK_MAIN_BYTES), /* Initial Stack Pointer */
Reset_Handler, /* Reset Handler */
NMI_Handler, /* NMI Handler */
HardFault_Handler, /* Hard Fault Handler */
MemManage_Handler, /* MPU Fault Handler */
BusFault_Handler, /* Bus Fault Handler */
UsageFault_Handler, /* Usage Fault Handler */
, /* Reserved */
, /* Reserved */
, /* Reserved */
, /* Reserved */
SVC_Handler, /* SVCall Handler */
DebugMon_Handler, /* Debug Monitor Handler */
, /* Reserved */
PendSV_Handler, /* PendSV Handler */
SysTick_Handler, /* SysTick Handler */
};
2、“入口函数”在“链接脚本”中配置,S7G2.ld
/* Linker script to configure memory regions. */
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x0040000 /* 256K */
RAM (rwx) : ORIGIN = 0x1FFE0000, LENGTH = 0x00A0000 /* 640K */
DATA_FLASH (rx) : ORIGIN = 0x40100000, LENGTH = 0x0010000 /* 64K */
QSPI_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x0800000 /* 8M, Change in QSPI section below also */
SDRAM (rwx) : ORIGIN = 0x90000000, LENGTH = 0x2000000 /* 32M */
} ENTRY(Reset_Handler)
入口函数如下:
/***********************************************************************************************************************
* Function Name: Reset_Handler
* Description : MCU starts executing here out of reset. Main stack pointer is setup already.
* Arguments : none
* Return Value : none
***********************************************************************************************************************/
void Reset_Handler (void)
{
/* Initialize system using BSP. */
SystemInit(); /* Call user application. */
main(); while ()
{
/* Infinite Loop. */
}
}
HOOK设置 R_BSP_WarmStart(),用户可以有机会在“main()”执行前加入自己的操作。如:BOOT下判断是否有OTA升级。
void SystemInit (void)
{
#if ( defined ( __GNUC__ ) && defined (__VFP_FP__) && !defined (__SOFTFP__) ) || \
( defined ( __ICCARM__ ) && defined ( __ARMVFP__ ) && (__FPU_PRESENT == ) ) /* Enable the Cortex-M4 FPU only when -mfloat-abi=hard.
Code taken from Section 7.1, Cortex-M4 TRM (DDI0439C) */ /* Set bits 20-23 to enable CP10 and CP11 coprocessor */ /*LDRA_NOANALYSIS LDRA_INSPECTED below not working. */
/*LDRA_INSPECTED 96 S *//*LDRA_INSPECTED 93 S SCB is a CMSIS defined element over which we have no control.*/
SCB->CPACR = (uint32_t)((uint32_t)SCB->CPACR | (uint32_t)CP_MASK);
/*LDRA_ANALYSIS */
#endif /* Call Pre C runtime initialization hook. */
R_BSP_WarmStart(BSP_WARM_START_PRE_C); /* Initialize grouped interrupts. */
bsp_group_interrupt_open(); /* Initialize FMI. */
g_fmi_on_fmi.init(); /* Initialize register protection. */
bsp_register_protect_open(); /* Configure system clocks using CGC module. */
bsp_clock_init(); /* Temporary fix to initialize ioport reference counter to 0, needed before C runtime init. This will be removed
* in the next release in favor of a more complete solution. */
HW_IOPORT_Init_Reference_Counter(); /* Initialize pins. */
g_ioport_on_ioport.init(&g_bsp_pin_cfg); /* Initialize C runtime environment. */
/* Zero out BSS */
#if defined(__GNUC__)
bsp_section_zero((uint8_t *)&__bss_start__, ((uint32_t)&__bss_end__ - (uint32_t)&__bss_start__));
#elif defined(__ICCARM__)
bsp_section_zero((uint8_t *)__section_begin(".bss"), (uint32_t)__section_size(".bss"));
#endif /* Copy initialized RAM data from ROM to RAM. */
#if defined(__GNUC__)
bsp_section_copy((uint8_t *)&__etext,
(uint8_t *)&__data_start__,
((uint32_t)&__data_end__ - (uint32_t)&__data_start__));
#elif defined(__ICCARM__)
bsp_section_copy((uint8_t *)__section_begin(".data_init"),
(uint8_t *)__section_begin(".data"),
(uint32_t)__section_size(".data"));
/* Copy functions to be executed from RAM. */
#pragma section=".code_in_ram"
#pragma section=".code_in_ram_init"
bsp_section_copy((uint8_t *)__section_begin(".code_in_ram_init"),
(uint8_t *)__section_begin(".code_in_ram"),
(uint32_t)__section_size(".code_in_ram"));
/* Copy main thread TLS to RAM. */
#pragma section="__DLIB_PERTHREAD_init"
#pragma section="__DLIB_PERTHREAD"
bsp_section_copy((uint8_t *)__section_begin("__DLIB_PERTHREAD_init"),
(uint8_t *)__section_begin("__DLIB_PERTHREAD"),
(uint32_t)__section_size("__DLIB_PERTHREAD_init"));
#endif /* Initialize SystemCoreClock variable. */
SystemCoreClockUpdate(); /* Call Post C runtime initialization hook. */
R_BSP_WarmStart(BSP_WARM_START_POST_C); /* Initialize Static Constructors */
#if defined(__GNUC__)
/*LDRA_INSPECTED 219 S In the GCC compiler, __init_array_start and __init_array_end starts with underscore. */
/*LDRA_INSPECTED 219 S */
int32_t count = __init_array_end - __init_array_start;
for (int32_t i = ; i < count; i++)
{
__init_array_start [i]();
}
#elif defined(__ICCARM__)
void const * pibase = __section_begin("SHT$$PREINIT_ARRAY");
void const * ilimit = __section_end("SHT$$INIT_ARRAY");
__call_ctors(pibase, ilimit);
#endif /* Initialize the Hardware locks to 'Unlocked' */
bsp_init_hardware_locks(); /* Initialize ELC events that will be used to trigger NVIC interrupts. */
bsp_irq_cfg(); /* Initialize ELC. */
g_elc_on_elc.init(&g_elc_cfg); /* Call any BSP specific code. No arguments are needed so NULL is sent. */
bsp_init(NULL);
}
R_BSP_WarmStart()下实现的“BCH”升级
void R_BSP_WarmStart (bsp_warm_start_event_t event)
{
if (BSP_WARM_START_PRE_C == event)
{
/* C runtime environment has not been setup so you cannot use globals. System clocks and pins are not setup. */
} else if (BSP_WARM_START_POST_C == event)
{
/* if S5 is pressed */
if ( == ((R_IOPORT0->PCNTR2 >> ) & 0x1))
{
boot_status = ;
} /* if S4 is pressed */
else if ( == ((R_IOPORT0->PCNTR2 >> ) & 0x1))
{
boot_status = ;
} /* if S4 and S5 are not pressed */
else
{
/* Initialize the Hardware locks to 'Unlocked' */
bsp_init_hardware_locks(); ssp_err_t status; status = g_sf_bootloader_mcu.p_api->open(g_sf_bootloader_mcu.p_ctrl, g_sf_bootloader_mcu.p_cfg);
if (!status)
{
status = g_sf_bootloader_mcu.p_api->appStart(g_sf_bootloader_mcu.p_ctrl);
if (status)
{
/* Notify the bootloader that appStart failed */
boot_status = ; g_sf_bootloader_mcu.p_api->close(g_sf_bootloader_mcu.p_ctrl);
}
} else
{
/* Notify the bootloader that open failed */
boot_status = ;
}
}
} else
{
/* Do nothing */
}
}
当然也可以判断DATA FLASH数据作为是否升级的依据:
Synergy CORTEX M 启动流程的更多相关文章
- 转载-Qualcomm MSM8953启动流程:PBL-SBL1-(bootloader)LK-Android
文章转载链接: https://blog.csdn.net/RadianceBlau/article/details/73229005 对于嵌入式工程师了解芯片启动过程是十分有必要的,在分析.调试各种 ...
- MyCat源码分析系列之——配置信息和启动流程
更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...
- Android进阶系列之源码分析Activity的启动流程
美女镇楼,辟邪! 源码,是一个程序猿前进路上一个大的而又不得不去翻越障碍,我讨厌源码,看着一大堆.5000多行,要看完得啥时候去了啊.不过做安卓的总有这一天,自从踏上这条不归路,我就认命了.好吧,我慢 ...
- Spring Boot启动流程详解(一)
环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...
- linux启动流程及自定义gurb
linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 -------& ...
- linux启动流程
看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...
- webapp启动流程
webapp启动流程 看了这个教程,其实所有的webapp大致都是这个流程了.
- Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...
- 嵌入式Linux驱动学习之路(五)u-boot启动流程分析
这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...
随机推荐
- Isolation Forest原理总结
Isolation Forest(以下简称iForest)算法是由南京大学的周志华和澳大利亚莫纳什大学的Fei Tony Liu, Kai Ming Ting等人共同提出,用于挖掘异常数据[Isola ...
- golang版并发爬虫
准备爬取内涵段子的几则笑话,先查看网址:http://www.budejie.com/text/ 简单分析后发现每页的url呈加1趋势 第一页: http://www.budejie.com/text ...
- iOS使用Instruments的工具
使用Instruments的工具 iOSXcodeInstrumentsInstruments是一个官方提供的强大的性能调试工具集. 1.Blank(空模板):创建一个空的模板,可以从Library库 ...
- 剑指offer--38.左旋转字符串
时间限制:1秒 空间限制:32768K 热度指数:173814 本题知识点: 字符串 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果. ...
- Linux之VIM常用功能
介绍:vim包含三种模式分别为 命令模式:浏览文件,临时更改vim的工作方式,对字符批量处理(也可进行配置) 插入模式:对文件内容进行编辑 退出模式:退出VIM操作 一.命令模式 1.调整vi ...
- d3.js入门学习
个人感觉前端数据可视化是个趋势,并且现在所在公司也是有做这块的项目,虽然我目前还没有接触到公司数据可视化的项目,但是,今后总是要接触的嘛. 今天看了一下公司目前所用的两种数据可视化工具---D3和EC ...
- No module named 'cv2'出错
当在python 3.6里运行课程里的强化学习程序时,出现如下出错,怎么办呢? >>> = RESTART: D:\work\csdn\tensorflow\DeepLearning ...
- 怎么样在python 3.6里安装tensorflow?
首先要下载python3.6: https://www.python.org/downloads/release/python-361/ 接着下载: numpy-1.13.0-cp36-none-wi ...
- 类加载器:ClassLoader与Class的区别
1.类加载器 java字节码(类)的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验.解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类 ...
- windows cmd 命令行 —— 进程与服务
1. 进程查看与操作 tasklist tskill pid 2. 服务查看与操作 net start net stop