所谓存储映像(Memory Mapping),在这里可以直观地理解为Cortex -M4F寻址的4 GB地址空间(0x0000_0000~0xFFFF_FFFF) 是被如何使用的,都对应了哪些实际的物理介质,有的供Flash存储器使用,有的供RAM使用,有的供外设模块使用。下面我们利用GPIO模块来阐述有关概念。GPIO模块使用了0x400F_F000~0x400F_FFFF地址空间,这些空间内的GPIO寄存器与CPU(即M4F内核)的内部寄存器(如R0、R1等)不同,访问GPIO寄存器需要使用直接地址进行访问,也就是说,需要使用三总线(地址总线、数据总线、控制总线);而访问CPU内部寄存器,不需经过三总线(汇编语言直接使用R0、R1等名称即可),不涉及地址问题。由于访问CPU内部寄存器不经过三总线,所以其访问速度要比访问GPIO寄存器(对应直接地址)快。为了与CPU的内部寄存器区别,GPIO寄存器被称为映像寄存器(Mapping Register),相对应的地址被称为映像地址(Mapping Address),整个可直接寻址的空间被称为映像地址空间(Mapping Address Space)。
S32K144把 Cortex-M4F 内核之外的模块,用类似存储器编址的方式统一分配地址。在4 GB 的映像地址空间内,分布着片内 Flash、SRAM、系统配置寄存器以及其他外设,以便CPU通过直接地址进行访问。表3-1给出了S32K144存储器映像空间分配。
表3-1 S32K144存储器映像空间分配
对于表3-1,读者应记住片内Flash区及片内RAM区存储映像,因为中断向量、程序代码、常数存储在片内Flash中,源程序编译后在链接阶段使用的链接文件中需包含目标芯片 Flash 的地址范围及用途等信息,才能顺利生成机器码。链接文件中还需包含 RAM的地址范围及用途等信息,以便生成机器码,确切定位全局变量、静态变量的地址以及堆栈指针。
1.片内Flash区存储映像
S32K144芯片的片内Flash区的大小为512 KB,地址范围是0x0000_0000~0x0007_FFFF,一般用来存储中断向量、程序代码、常数等,其中,中断向量表从0x0000开始向上增长。
2.片内RAM区存储映像
S32K144片内 RAM 区为静态随机存储器(SRAM),其大小为64 KB,地址范围是0x1000_0000~0x1000_FFFF,一般用来存储全局变量、静态变量、临时变量(堆栈空间)等。S32K144的堆栈空间的使用方向是从最大地址到最小地址,因此,堆栈的栈顶(Stack Top)应该设置为 RAM 地址的最大值+1,这样,全局变量及静态变量从 RAM 的最小地址向最大地址方向开始使用,堆栈是按照从 RAM 的最大地址到最小地址的方向使用的,从而可以减少重叠错误。
3.其他存储映像
其他存储映像,如外围设备存储映像(GPIO、外设桥等)、专用外设总线存储映像、系统保留段存储映像等,读者只需了解即可,在实际使用时,由芯片的头文件给出宏定义。BME位操作引擎用于对外设进行位操作,位操作引擎技术由硬件支持,可使用Cortex-M4F指令集中最基本的加载、存储指令来完成对外设地址空间内存的读、改、写操作。
中断(Interrupt)是MCU发展中一个重要的技术,它的出现在很大程度上解放了MCU,提高了MCU的执行效率。所谓中断,是指MCU在正常运行程序时,由于MCU内核异常或者 MCU 各模块发出请求事件,使 MCU 停止正在运行的程序,而转去处理异常或执行处理外部事件的程序(也称为中断处理程序)。
这些引起MCU中断的事件称为中断源。S32K144的中断源可分为两类:一类是内核中断,另一类是非内核中断,如表3-2所示。内核中断通常被称为异常(Exception),也就是说,当出现错误时,这些中断源会复位芯片或留有编程接口让程序进行特定处理。MCU 的异常模型以固定或可配置的优先级顺序处理各种异常(内部事件和外部事件,包括CPU指令、存储器和总线故障条件)。非内核中断是指MCU各个模块引起的中断,MCU执行完中断处理程序后,再回到刚才正在执行的程序,从停止的位置继续执行后续的指令。非内核中断又称为可屏蔽中断,这类中断可以通过编程来开启或关闭。从应用的角度来看,设备级别的中断源分为两类:NMI和用户中断。
表3-2中给出了 S32K144各中断源的中断向量号,非内核中断的中断请求(Interrupt Request,IRQ)号,即IRQ中断号,还给出了默认的中断处理程序。中断向量号是每一个中断源的固定编号,是由芯片设计生产时决定的,编程时不能更改,它是中断处理程序入口地址在中断向量表的位置。IRQ中断号是非内核中断源的编号,每一个编号代表了一个非内核中断源,可供用户在中断编程时查找使用。
表3-2 S32K144的中断源
续表
续表
续表