打印
[PIC®/AVR®/dsPIC®产品]

PIC32 & MPLAB IDE学习笔记之存储器

[复制链接]
966|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、芯片数据手册



PIC32 单片机实现了两个地址空间:虚拟地址空间和物理地址空间。所有硬件资源(例如程序存储器、数据存储器和外设)都位于各自相关的物理地址范围内。虚拟地址专供 CPU 取指和执行指令使用。物理地址供外设 (例如不通过 CPU,独立访问存储器的 DMA 和闪存控制器)使用。
        内核空间分为 4 个各为 512 MB 的地址段:KSEG0、 KSEG1、 KSEG2 和 KSEG3。仅内核模式应用程序可以访问内核存储空间。内核空间包括所有外设寄存器。因此,仅内核模式应用程序可以监视和操作外设。只有 KSEG0 和KSEG1 段指向真正的存储器资源。如 MIPS 文档所介绍,地址段 KSEG2 可供 EJTAG 探针调试器使用(请参见 EJTAG 规范)。
        PIC32 仅使用 KSEG0 和 KSEG1 段。可通过 KSEG0 或 KSEG1


访问引导闪存存储器 (BFM)、程序闪存存储器 (PFM)、数据 RAM 存储器 (DRM)和外设SFR,其中外设 SFR 只能通过 KSEG1 访问。
KSEG1存储器地址段是不可高速缓存的,而KSEG0和 USEG/KUSEG 是可高速缓存的。

KSEG0 和 KSEG1 段总是转换为物理地址 0x0。通过这种转换安排, CPU 可以通过两个独立的虚拟地址访问相同的物理地址:一个是通过 KSEG0,另一个是通过 KSEG1。因此,应用程序可以选择以高速缓存或非高速缓存的方式执行同一段代码。更多详细信息,请参见第 4 章“预取高速缓存模块”(DS60001119)。只有通过 KSEG1 段才可访问片上外设 (非高速缓存访问)。


使用特权

评论回复
沙发
八层楼|  楼主 | 2021-9-6 16:27 | 只看该作者
二、存储区分配
存储器分配文件BOOT_9D000000.ld

堆栈大小

/*
* Provide for a minimum stack and heap size
* - _min_stack_size - represents the minimum space that must be made
*                     available for the stack.  Can be overridden from
*                     the command line using the linker's --defsym option.
* - _min_heap_size  - represents the minimum space that must be made
*                     available for the heap.  Can be overridden from
*                     the command line using the linker's --defsym option.
*/
EXTERN (_min_stack_size _min_heap_size)
PROVIDE(_min_stack_size = 0x400) ;  //栈
PROVIDE(_min_heap_size = 0) ;                //堆



中断向量

/*************************************************************************
* For interrupt vector handling
*************************************************************************/
PROVIDE(_vector_spacing = 0x00000001);
_ebase_address = 0x9FC01000;        //中断地址



闪存地址

/*************************************************************************
* Memory Address Equates
* _RESET_ADDR      -- Reset Vector
* _BEV_EXCPT_ADDR  -- Boot exception Vector
* _DBG_EXCPT_ADDR  -- In-circuit Debugging Exception Vector
* _DBG_CODE_ADDR   -- In-circuit Debug Executive address
* _DBG_CODE_SIZE   -- In-circuit Debug Executive size
* _GEN_EXCPT_ADDR  -- General Exception Vector
*************************************************************************/
_RESET_ADDR              = 0xBFC00000;        //复位向量
_BEV_EXCPT_ADDR          = 0xBFC00380;        //BOOT中断向量
_DBG_EXCPT_ADDR          = 0xBFC00480;        //Debug中断向量
_DBG_CODE_ADDR           = 0xBFC02000;        //Debug代码地址
_DBG_CODE_SIZE           = 0xFF0     ;        //Debug代码大小
_GEN_EXCPT_ADDR          = _ebase_address + 0x180;



内存区域

/*************************************************************************
* Memory Regions
*
* Memory regions without attributes cannot be used for orphaned sections.
* Only sections specifically assigned to these regions can be allocated
* into these regions.
*************************************************************************/
MEMORY
{
  kseg0_program_mem    (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x9000  //应用程序                  
  kseg0_boot_mem             : ORIGIN = 0x9FC00490, LENGTH = 0                //引导程序0
  exception_mem              : ORIGIN = 0x9FC01000, LENGTH = 0x1000        //中断异常区
  kseg1_boot_mem             : ORIGIN = 0xBFC00000, LENGTH = 0x490        //引导程序1
  debug_exec_mem             : ORIGIN = 0xBFC02000, LENGTH = 0xFF0        //调试存储区
  config3                    : ORIGIN = 0xBFC02FF0, LENGTH = 0x4        //配置寄存器
  config2                    : ORIGIN = 0xBFC02FF4, LENGTH = 0x4        //配置寄存器
  config1                    : ORIGIN = 0xBFC02FF8, LENGTH = 0x4        //配置寄存器
  config0                    : ORIGIN = 0xBFC02FFC, LENGTH = 0x4        //配置寄存器
  kseg1_data_mem       (w!x) : ORIGIN = 0xA0000000, LENGTH = 0x10000//数据存储区RAM
  sfrs                       : ORIGIN = 0xBF800000, LENGTH = 0x100000//特殊寄存
  configsfrs                 : ORIGIN = 0xBFC02FF0, LENGTH = 0x10        //配置寄存器
}


使用特权

评论回复
板凳
八层楼|  楼主 | 2021-9-6 16:28 | 只看该作者
三、存储区分析
通过结合工程编译后生成的.map文件对配置程序进行分析

配置存储区:配置寄存器区域
调试存储区:
引导程序区1:程序上电复位后首先运行的区域,包含复位向量和boot/debug中断向量
SFR:特殊寄存器
数据存储区:RAM区域,包含堆栈
中断异常区:中断向量
引导程序区0:未用
应用程序区:用户程序,包含全局常亮和封装库函数


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

4106

帖子

2

粉丝