RT1170 双核启动机制 在大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道中,介绍了i.MX RT1170中的Cortex-M7作为主核如何激活从核Cortex-M4的步骤(如下图所示),具体可分解为以下3个步骤。 1) Cortex-M7(主核)加载从核App到CM4 ITCM里; 2) Cortex-M7(主核)激活Cortex-M4(从核); 3) Cortex-M4(从核)开始运行App代码;
图 1 其中加载从核App方式分为两种: 在SDK library中,对于不同的IDE/工具链,SDK通过宏CORE1_IMAGE_COPY_TO_RAM控制,采用不同的加载方式。MCUXpresso IDE使用的是隐式方式,而IAR、KEIL和GCC则采用显式方式, 即大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道中所介绍的方法,那么隐式加载是如何实现的呢? 隐式加载方式在MCUXpresso IDE初始化中,小编介绍了MCUXpresso IDE的ResetISR()中断函数根据__data_section_table、__data_section_table_end、__bss_section_table、__bss_section_table_end以彼此相邻的三个变量(4个byte)为一组来分别提取数据拷贝源地址、数据拷贝目的地址及拷贝数据的字节量,从而实现Data_section,BSS_Section初始化,当然,使用同样的方式,Cortex-M7(主核)工程中的ResetISR()中断函数也可将从核App拷贝到指定目的地址,只要从核App的拷贝信息如图2所示排列。
图 2 查看Map 文件以SDK library中的evkmimxrt1170_freertos_message_buffers_cm7工程为例,打开其对应的Map文件,可发现从核App的拷贝信息其实是嵌在Data_section中,所以在ResetISR()中断函数内(具体代码如下所示)会像拷贝Data_section到指定RAM区域一样,将从核App拷贝到指定目的地址。
图 3 - ~~~~~
- // Copy the data sections from flash to SRAM.
- while (SectionTableAddr < &__data_section_table_end) {
- LoadAddr = *SectionTableAddr++;
- ExeAddr = *SectionTableAddr++;
- SectionLen = *SectionTableAddr++;
- data_init(LoadAddr, ExeAddr, SectionLen);
- }
- ~~~~~
复制代码
欢迎留言和我分享你的疑惑和见解 ,也欢迎收藏或转发
|