This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:区域6上的 heapMem 不能与 TMS320F28335进行通信

Guru**** 2595780 points
Other Parts Discussed in Thread: TMS320F28335, SYSBIOS, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1016207/tms320f28335-heapmem-on-zone-6-doesn-t-work-over-tms320f28335

Thread 中讨论的其他器件:TMS320F28335SYSBIOSC2000WARE

你(们)好。
我有一些与使用 TMS320F28335的 XINTF 在外部存储器上分配存储器相关的问题。

我使用了 TI 提供的宏函数"data_section"来使用外部存储器。
目前、我应该使用 SYS/BIOS 在外部存储器上进行动态分配。

第一个问题是当".esysmem"放置在区域6 (与我的外部 SRAM 连接)上时、它不起作用。
我一直在尝试在 XINTF 地址"0x100000 "上设置".esysmem"段。 但是、它不起作用。

AFAIK、C2000编译器用户指南注意到、COFF 格式应该将其数据区域用作".ebss"和".esysmem"。

本指南还注意到、这两个存储器都可以放置在低64K 地址以外的任何存储器区域。
当我将".ebss"和".esysmem "放置在低64k 区域并将 BIOS.heapSection 设置为".ebss"或".esysme"时、它会起作用。
但是、当我将其中一个内存段放置到 Zone6区域时、它不起作用。
在 InitSysCtrl()之后,我已经在代码顶部调用了 InitXINTF(),因此我认为它不是故障。

第二个问题是、区域6上的新 HeapMem 模块也不起作用。
在我未能解决第一个问题后、我认为在区域6上创建一个用于动态分配的新 heapMem 模块是一个很好的替代方案。

然后、我尝试创建一个新的堆模块"externalHeap "并将其添加到 Program.global.externalHeap 中。
之后、我尝试使用 Memory_alloc (externalHeap、size、align、error_block)在运行时的代码上分配内存。
但是,它不起作用。。 我可以获取的内存只是0x0。。。。

当我用 ROV 检查它时、它显示它放置了正确的地址"0x100000 "和总大小"0x4000"、但它的 totalFreeSize 0和 largestFreeSize 0。
如果是默认的系统堆,则其 totalFreeSize 和 largestFreeSize 不是0。
我无法理解它为什么如此工作、我不知道如何获取更多信息。

我按如下方式配置了什么错误吗?

您能就此提供一些建议吗?

谢谢、此致、
Larry Kim

//////////////////////// cmd 文件////////////////////////////


存储器

第0页:/*程序内存*/
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/

RAMM0:origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *

RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
RAML0:origin = 0x008000,length = 0x001000 //片上 RAM 块 L0 0x004E00 */

FLASHH:origin = 0x300000、length = 0x008000 //片上闪存*/

FLASHA:origin = 0x318000,length = 0x027F80 //片上闪存*/
csm_RSVD:origin = 0x33FF80,length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
begin:origin = 0x33FFF6,length = 0x000002/* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL:origin = 0x33FFF8,length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
OTP:origin = 0x380400,length = 0x000400 //片上 OTP */
ADC_CAL:origin = 0x380080,length = 0x000009 //保留存储器中的 ADC_cal 函数*/

FPUTABLES:origin = 0x3FEBDC,length = 0x0006A0 //引导 ROM 中的 FPU 表*/

ROM:origin = 0x3FF27C,length = 0x000D44 //引导 ROM */

复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

第1页:/*数据存储器*/

/*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
/*寄存器保留在第1页中*/

M01SARAM:origin = 0x000040、length = 0x0007C0 //片上 RAM 块 M0、M1 *

PIEVECT:origin = 0xD00,length = 0x100
L17SARAM:origin = 0x009000,length = 0x007000

FLASHG:origin = 0x308000、length = 0x010000 //片上闪存*/

ZONE6:origin = 0x0100000,length = 0x40000 // XINTF 区域6 */

ZONE7:origin = 0x0200000,length = 0x100000


部分


/*分配计划领域:*/

.cinit:> FLASHA,page = 0

.pinit:> FLASHA,page = 0
.text:> FLASHA PAGE = 0
.cio:>RAML0 page = 0
codestart:> begin page = 0
ramfuncs:load = FLASHH,
运行= RAMM1|RAML0、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
page = 0 csmpasswds:>csm_PWL page = 0
csm_rsvd:>csm_RSVD page = 0

/*分配未初始化的数据段:*/

.stack:> L17SARAM page = 1.
.ebss:> L17SARAM PAGE = 1 //我尝试将其更改为 ZONE6,但失败了
.data:> L17SARAM page = 1.
.esysmem:>L17SARAM page = 1 //我尝试将其更改为 ZONE6,但失败了

/*初始化段进入闪存*/

/*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
.econst:> FLASHG PAGE = 1.
切换:>FLASHG PAGE = 1.

/*分配 IQ 数学区域:*/

FPUmathTables:> FPUTABLES,PAGE = 0,TYPE = NOLOAD

/*分配 XINTF 区域6、7的0x400来存储数据*/

ZONE6DATA:> ZONE6,PAGE = 1
Dataload:>ZONE6,page = 1.
ZONE7DATA:> ZONE7,PAGE = 1

/*.reset 是编译器使用的标准段。 它包含*/

/* C 代码_c_int00起始地址。 /*
/*当使用引导 ROM 时,此部分和 CPU 矢量*/
/*不需要表。 因此、默认类型设置为*/
/* DSECT */
.reset:> reset,page = 0,type = DSECT
VECTORS:> VECTORS PAGE = 0,TYPE = DSECT

/*分配 ADC_cal 函数(出厂时已预先编程到 TI 保留存储器中)*/

ADC_cal:load = ADC_CAL、page = 0、type = NoLoad


//////////////////////// app.cfg //////////////////////////

(笑声)
BIOS.heapSize = 0x4000;
BIOS.heapSection =".esysmem";var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams1 =新 HeapMem.Params;
heapMemParams1.size = 0x1000;
heapMemParams1.sectionName ="ZONE6DATA";
heapMemParams1.align = 16;
heapMemParam1.minBlockAlign = 4;
program.global.externalHeap = HeapMem.create (heapMemParam1);
(笑声)