工具/软件:TI C/C++编译器
为什么在 FRAM 中不配置标准段顺序?
需求
//seg1 = const、只读
//seg2 =代码=读取+执行访问
//seg3 =任何读取+写入持久性变量
在该 CMD 中、不会影响自动计算
部分 { .TI.noinit:{}>RAM /*用于#pragma noinit * .bss :{}> RAM /*全局和静态变量 * .data :{}> RAM /*全局和静态变量 * 堆栈 :{}> RAM (high)/*软件系统堆栈 * 组(IPENCAPSULATED_MEMORY) { ipestruct :{} /* IPE 数据结构 * IPE :{} /* IPE * .IPE:_ISR :{} /* IPE ISR */ } PALIGN (0x0400)、RUN_START (FRAM_IPE_START) RUN_END (FRAM_IPE_END)> FRAM 组(只读_存储器) { .cinit :{} /*初始化表 * .pinit :{} /* C++构造函数表 * init_array :{} /* C++构造函数表 * .mspabi.exidx:{} /* C++构造函数表 * .mspabi.extab:{} /* C++构造函数表 * .const :{} /*常量数据 */ } PALIGN (0x0400)、RUN_END (fram_Rx_start)> FRAM GROUP (可执行文件存储器) { .text:_ISR :{} /*代码 ISR * .text :{} /*代码 */ } PALIGN (0x0400)、RUN_END (fram_rw_start)> FRAM 组(READ_WRITE_MEMORY) { .TI.persistent:{} 对于#pragma PERSISTENT * .cio :{} /* C I/O 缓冲器 * sysmem :{} /*动态内存分配区域*/ } PALIGN (0x0400)、RUN_START (FRAM_Rx_END)> FRAM Logger_buff :{}>DATA2 type=NOINIT jtagsignature:{}> JTAGSIGNATURE /* JTAG 签名 * bslsignature:{}> BSLSIGNATURE /* BSL 签名 * 组(signature_SHAREDMEMORY) { ipesignature:{} /* IPE 签名 * .jtagpassword:{} /* JTAG 密码 */ } > IPESIGNATURE 信息 A :{}>INFOA /* MSP430信息 FRAM 内存段*/ 信息 B :{}>INFOB .infoC :{}>INFOC 信息 D :{}>INFOD /* MSP430中断矢量 */ 。 复位 :{} >复位/* MSP430复位矢量 */ }/ ********* //* MPU/IPE 特定内存段定义 */ ********* /..... //段定义 #ifdef _MPU_manual //用于在 GUI 中选择的自定义大小 MPU_SEARD_Border1 =_MPU_SEGB1 >> 4; MPU_SEARD_Border2 =_MPU_SEGB2 >> 4; MPU_SAM_VALUE =(_MPU_SAM0 << 12)|(_MPU_SAM3 << 8)|(_MPU_SAM2 << 4)|_MPU_SAM1; #else //链接器生成的自动大小 //seg1 = const、只读 //seg2 =代码=读取+执行访问 //seg3 =任何读取+写入持久性变量 MPU_SEGM_Border1 = fRAM_Rx_START >> 4; MPU_SEGM_Border2 = fram_rw_start >> 4; MPU_SAM_VALUE = 0x1531;// Info R、Seg3 RW、Seg2 RX、Seg1 R #endif #ifdef _MPU_LOCK #ifdef _MPU_ENABLE_NMI MPU_ctl0_value = MPUPW | MPUENA | MPULOCK | MPUSEGIE; 其他 MPU_ctl0_value = MPUPW | MPUENA | MPULOCK; ENDIF #else #ifdef _MPU_ENABLE_NMI MPU_ctl0_value = MPUPW | MPUENA | MPUSEGIE; 其他 MPU_ctl0_value = MPUPW | MPUENA; #endif #endif
结果映射: