内容提要

注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下。

引言

1. S32K1xx系列MCU启动过程详解(startup_S32K144.S)

① 关闭CPU全局中断

②清零CPU内核寄存器R1~R12

③初始化SRAM的ECC

④初始化堆栈

⑤系统初始化

⑥RAM初始化

⑦打开CPU全局中断

⑧跳转到应用程序main()函数

2. 重映射代码/函数到RAM中运行的方法和步骤

①分析应用工程链接文件(S32K144_64_flash.ld)

②将想要重映射的代码/函数通过__attribute__ ((section(".code_ram")))指定到.code_ram段

③在应用工程编译结果map文件中查看重映射结果

Tips:需要注意是关键词-- __attribute__ ((section(".code_ram"))) 添加的位置,每个需要指定的函数都要添加这个关键词,因此,可以将其定义为一个宏比如CODE_RAM使用:

总结

引言

之前,在我的公众号文章中已经介绍了如何在CodeWarrior 5.x IDE(方法适用于S08、S12(X)以及MagniV S12Z系列MCU)以及S32DS for Power IDE(方法适用于Qorivva MPC57xx和S32R系列MCU)中如何实现用户代码重映射(remap)到RAM中运行,具体请参考如下文章(直接点击文章标题即可跳转阅读):

《浅谈嵌入式MCU软件开发之startup过程详解(在CodeWarrior 5.1 中实现RAM自定义初始化)》;

《浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)》;

《S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》;

《CodeWarrior IDE使用Tips之如何通过prm文件指定汇编代码函数、全局变量和常量的储存地址》

最近很多读者朋友问我在S32DS for ARM IDE中如何才能把S32K1xx系列MCU的应用工程的用户代码重映射到RAM中运行?

为此,本文将以S32DS for ARM v2018.R1中基于S32K14x SDK v1.9的S32K144应用工程为例,详细介绍S32K1xx系列MCU启动过程及重映射代码到RAM中运行的具体方法和详细步骤。

Tips:本文介绍使用的SDK版本为S32 SDK S32K14x BETA 1.9.0,请大家到NXP官网下载安装:

Tips:在S32DS for ARM v2018.R1 IDE中,新建工程时,需要选择Toolchain为ARM Bare-Metal 32-bit Target Binary Toolchain(其使用的编译器为GCC v.6.3),才能选择和使用S32 SDK S32K14x BETA 1.9.0:

默认的Toolchain为Standard S32DS toolchain for ARM,其使用的编译器为GCC v.4.9:

1. S32K1xx系列MCU启动过程详解(startup_S32K144.S)

由于S32K1xx系列MCU都是使用的ARM Cortex M系列内核,其SRAM和Flash使用同样的IP,它们的启动过程都是相同的,只是SRAM和Flash的memory大小不同。所以这里仅以S32K144为例进行介绍。

在S32DS for ARM v2018.R1 IDE中新建的S32K144应用工程如下,在其工程浏览器(Project Explorer)窗口中Project_Settings-->Startup_Code目录下的存放着整个工程的启动文件----startup_S32K144.S:

通过阅读这个启动文件,可以知道每次MCU复位后,从其复位向量--Reset_Handler开始运行到用户程序的main()函数之前,CPU启动过程还做了如下准备工作:

① 关闭CPU全局中断

通过汇编指令“cpsid   i”,关闭CPU全局中断的目的是避免启动过程中中断的影响;因为此时中断向量表还未建立好,无法响应外设中断;

②清零CPU内核寄存器R1~R12

每次复位后,CPU内核寄存器的值是随机不确定的,所以需要将其清零;

③初始化SRAM的ECC

由于S32K1xx系列MCU除4KB FlexRAM外的SRAM带有ECC功能,所以必须在使用之前对其进入任意写操作以产生正确的ECC结果,从而完成ECC初始化;

④初始化堆栈

ARM Cortex M系列CPU内核有MSP和PSP两个32-bit的堆栈,由于中断和异常处理时使用MSP所以必须在发生中断/异常之前将其初始化,其初始化值来自默认向量表的0地址偏移,即0x0000地址存放的4个字节;

⑤系统初始化

在完成了以上堆栈初始化之后,CPU就可以运行C代码了,所以此时通过调用定义在工程SDK-->platform-->device-->S32K144-->startup目录下的system_S32K144.c中的系统初始化函数--SystemInit():

根据工程配置完成:①CPU内核FPU配置和使能(如果创建应用工程时选择浮点数运算使用硬件FPU)、②关闭看门狗(默认配置)和③使能CPU内核指令缓冲(I-Cache)等MCU硬件平台配置:

Tips:system_S32K144.c是按照ARM Cortex M系列MCU的软件接口标准--CMSIS实现的,在任意基于ARM Cortex M系列内核的MCU软件SDK中都有相同的函数,除了以上介绍的MCU硬件平台初始化函数SystemInit()外,还包含MCU系统时钟更新API函数--SystemCoreClockUpdate()和MCU软件复位API函数--SystemSoftwareReset():

⑥RAM初始化

接下来,启动文件会调用定义在SDK-->platform-->devices目录下startup.c中的init_data_bss()函数完成应用工程运行所需的RAM初始化:

在startup.c中通过申明外部变量(extern)的方式,可以引用定义在工程链接文件中的__DATA_ROM、__DATA_RAM、__DATA_END、__CODE_RAM、__CODE_ROM、__CODE_END、__BSS_START和__BSS_END符号,获得工程链接结果中.data段(有初始化值)、.bss段(未初始化和初始化值为0)的全局变量以及重定向到RAM中运行的.code段代码/函数在Flash和RAM中的起始地址和长度(结束地址-开始地址):

然后再通过数据指针的方式实现全局变量初始化值和重映射代码从Flash到RAM中的拷贝以及.bss段的清零:

具体包括:①初始化.data段、②初始化.code段、③初始化.bss段,以及④将中断向量表从Flash拷贝到RAM中并⑤初始化CPU系统中断向量偏移地址,使其指向RAM中新的中断向量表(如果编译目标为debug,编译结果存储在Flash中):

⑦打开CPU全局中断

在完成RAM初始化和中断向量表初始化后,就可以打开CPU全局中断,响应外设中断了;

打开ARM Cortex M系列CPU内核的全局中断通过汇编语句--“cpsie   i”完成。

⑧跳转到应用程序main()函数

在完成以上准备工作之后,启动过程的最后一步是跳转到应用程序main()函数;

2. 重映射代码/函数到RAM中运行的方法和步骤

通过上面的分析可知,在S32K1xx系列MCU的启动过程,会自动将定义在.code段中的代码/函数从其Flash储存地址拷贝到RAM中的运行时地址。

①分析应用工程链接文件(S32K144_64_flash.ld)

具体来看在应用工程的连接文件中,对.code段的定义如下 :

Tips:只有将用户代码分配到Flash中的编译目标,即使用S32K1xx_xx_flash.ld链接文件的编译目标才存在代码重映射。若是将应用工程编译结果代码分配到RAM的编译目标(使用S32K1xx_xx_ram.ld链接文件),其编译的函数/代码本身就是储存在RAM中的,所以无需重映射。

②将想要重映射的代码/函数通过__attribute__ ((section(".code_ram")))指定到.code_ram段

由于在应用工程链接文件中已经将用户段.code_ram放置在了.code段中,所以,我们只需要在C代码中,将想要重映射的代码/函数通过__attribute__ ((section(".code_ram")))指定到.code_ram段即可。

比如下面就是将main()函数指定到.code_ram段的具体实现:

int __attribute__ ((section(".code_ram"))) main(void)

③在应用工程编译结果map文件中查看重映射结果

完成以上指定后,重新编译应用工程即可在应用工程的编译结果map文件中看到main()函数已经被成功重定向了,其长度为0x20字节,在Flash中的存储地址(也称作加载地址--load address)为0x000005bc,而在RAM中的重映射运行时地址为0x1fff8404:

Tips:在S32DS IDE应用工程中,一个函数若没有特别指定,其将分配到.text代码段,如果没特别指定(默认情况下)的main()函数编译结果如下:

Tips:需要注意是关键词-- __attribute__ ((section(".code_ram"))) 添加的位置,每个需要指定的函数都要添加这个关键词,因此,可以将其定义为一个宏比如CODE_RAM使用:

#define  CODE_RAM  __attribute__ ((section(".code_ram")))

然后,再将CODE_RAM放在定义的函数名前即可;

比如demo工程中,将CodeRemapToRAM.c中的delay_ms()、Toggle_Onboard_LED()和System_Clock_and_Pinmux_Config()三个函数通过指定到.code_ram段:

这样重新编译demo工程即可看到重映射的结果如下:

总结

本文详细介绍了S32K1xx系列MCU的启动过程和重映射代码/函数到RAM的方法和步骤,希望对大家有所帮助。

为了方便大家学习,现将S32K1xx系列MCU的启动过程流程图整理如下:

浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解相关推荐

  1. 浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)

    引言 一般工程师都怕研究MCU的startup过程,其原因可能有:1.觉得没有必要,startup的过程和启动代码在新建工程时,并且已经默认加入并配置好,能够保证MCU正常工作,只要关系main()函 ...

  2. JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

    Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...

  3. for根据ID去重_汽车ECU参数标定之配置Overlay RAM实现Qorivva MPC57xx系列MCU参数在线标定和代码重映射原理和方法详解...

    内容提要 引言 1. MPC5744P的Overlay RAM工作原理介绍 2 MPC5744P的Flash Overlay配置详解 2.1 平台Flash标定区域描述字寄存器配置字0--PFLASH ...

  4. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

    转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...

  5. 嵌入式开发-浅谈嵌入式MCU开发中的三个常见误区

    浅谈嵌入式MCU开发中的三个常见误区 原创 2017-09-30 胡恩伟 汽车电子expert成长之路 目录 (1)嵌入式MCU与MPU的区分 (2)误区一:MCU的程序都是存储在片上Flash上,然 ...

  6. 浅谈嵌入式与互联网(详细)

    纲要 一.什么叫嵌入式,以及与人工智能的关系? 二.嵌入式岗位 三.浅谈嵌入式开发优缺点 四.与互联网(CS相关的,如平台服务器,前端/APP/软件)对比 五.能力要求和薪资(参考知乎) 以下均采集于 ...

  7. 浅谈飞控的软件设计(across写的)

    关注across很久了,最近发现了它得CSDN,发现了这篇文章,感觉不错,转载保存. 摘自:https://blog.csdn.net/hz770495569/article/details/8657 ...

  8. 智能车浅谈——抗干扰技术软件篇

    文章目录 软件抗干扰技术 数字信号的抗干扰措施 数字输入信号软件抗干扰措施 数字输出信号软件抗干扰措施 数字滤波 算术平均值滤波 中值滤波 滑动平均滤波 归一化 差比和 CPU及程序的抗干扰措施 复位 ...

  9. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

最新文章

  1. Modelsim仿真流程
  2. linux seq_file 接口
  3. 对比图像分类五大方法:KNN、SVM、BPNN、CNN和迁移学习
  4. 如何访问局域网的Access数据库?
  5. oracle中t,Oracle中如何用T
  6. SLAM--深度滤波器
  7. Morris Traversal
  8. 使用mmdetection检测并存储结果
  9. turtle库进阶练习
  10. PCIE标准共享,以及其机械尺寸图
  11. 【JSOI2015】bzoj4487 染色问题
  12. 可见首发《模式识别与智能计算:MATLAB技术实现(第2版)》 百度网盘 下载 分享
  13. 吴恩达机器学习:week1
  14. flutter 修改iOS app图标 名称
  15. HTML+CSS制作知乎登录页面
  16. mysql查询员工最高最低工资三种方式
  17. pands 画图 调整大小_关于cad画图比例,图纸比例,打印比例问题详解
  18. 关于原型设计在高等教育行业中的运营分析报告
  19. win10出现错误代码0x80073712的解决办法
  20. 抖音现在做的竞价推广都是怎么操作的?

热门文章

  1. 网络规划设计师 视频笔记
  2. 微软project服务器搭建,Project Server 2013 安装和部署概述
  3. Unity 3D模型展示之控制标注
  4. 绿色商业包装材料在行业中的重要地位
  5. citus介绍和centos7安装部署和集群搭建
  6. 学python之前先掌握-成为黑客前,你首先应该掌握的Python技术
  7. 输入法自定义短语笔记/md常用配置/搜狗输入法自定义词库推荐
  8. 即将前往下一个饭局,你的牙还好吗?丨钛空舱爆款春节特献
  9. NLPCC tutorial
  10. Cannot checkout from svn: svn: E155000: ‘XXX‘ is alrea