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.
工具/软件:Code Composer Studio
我正在编写一个包含 I2C 的器件编程、 而另一个包含 ECAP、SCI 等模块的器件编程。
首先、我将他们分开、因为我是新学员。
两个都是独立的、工作正常。
但是、当我尝试组合这两个程序时、现在它被捕获在 进程 CINIT 初始化表中。
为什么会这样呢? 以及如何从这种情况中获得帮助?
cinit 段保存在运行时复制到 RAM 中的初始化程序变量。 如果您有大量的初始化数据、则该过程可能需要很长时间-看门狗计时器跳闸并重置器件所需的时间足够长-因此看起来您总是卡在该例程中。 尝试注释掉任何大型已初始化数组。
您还可以通过将文件"F2837xD_CodeStartBranch.asm"的此行中的 WD_DISABLE 设置为1来禁用看门狗。
WD_DISABLE .set 0 ;设置为1以禁用 WD、否则设置为0
如果两者都不起作用、请随意压缩并将代码附加到文章中、我将尝试找到它。
此致、
Richard
尊敬的 Richard:
感谢您的即时回复。
cinit 段保存在运行时复制到 RAM 中的初始化程序变量。 如果您有大量的初始化数据、则该过程可能需要很长时间-看门狗计时器跳闸并重置器件所需的时间足够长-因此看起来您总是卡在该例程中。 尝试注释掉任何大型已初始化数组。
您还可以通过将文件"F2837xD_CodeStartBranch.asm"的此行中的 WD_DISABLE 设置为1来禁用看门狗。
我尝试删除了不必要的初始化数据 ,并且还禁用了看门狗。
现在还有其他问题。
它会卡在下面的环路中:
#if (((defined (_inline)|| defined (_MEMHET)))&&\
!(defined (_TMS320C6x)&&!defined (__C6x_migration__)))&&\
!defined (__ARM_ARCH)&&!defined (__ARP32__)&&!defined (__Frozen __)
为什么会发生这种情况?
尊敬的 Richard
感谢您的支持。
真的很抱歉。 实际上、我处于这样的状态、我无法向您公开发送代码。
string.h 卡死问题现在消失了。
我将继续 添加更多代码。
我必须添加更多浮点数据类型数组。 每个数组包含11个元素。
我必须使用这些数组进行内插。
但问题是,一旦我在工作代码“正在调用中断非法操作处理程序()”中添加了一个数组。 我不知道为什么。
这是内存问题吗?
很抱歉打扰你。
如何检查 存储器中哪些阵列的映射文件?
如何检查阵列索引?
我真的很抱歉这个愚蠢的问题、但我的脑海中有很多疑问、
我已附加 RAM 链接器(在 pdf 中转换)文件、我的项目中的主 C 代码源文件以及代码的内存分配。
看起来.stack 和.text 段已满。
感谢您发送信息、没有任何问题。
您的链接器命令文件看起来正常。 如果成功完成、您可以选择性地告诉链接器生成".map"文件。 您可以将文件命名为'Project->Properties->CCS Build->C2000 Linker->Basic Options'。 这是一个文本文件、您可以在编辑器中打开、以查看符号链接在何处以及每个存储器块的使用量。 您的数组应最终位于.ebss 段中、我认为这是从内存分配中进行的。
顺便说一下、如果要将特定变量映射到特定的存储器块、可以使用 DATA_SECTION pragma 来执行此操作。 有关这方面的更多信息、请参阅 C 编译器指南(spru514)的第6.10节。
我无法从代码中看到如何使用数组、但我的意思是检查数组索引、确保您不会意外地尝试访问超出有效范围的元素。 例如,一个11元素数组可以是:
浮点 A[11];
如果使用...访问元素
x = A[i];
...那么我必须在0到10的范围内。 它必须不能高于11或更高、否则您可能会在无效的存储器中导致您看到的 Estop。 我建议您单步执行您的代码、以满足您从未发生过的情况。
我在代码中看不到任何可能导致这种情况的明显结果。 您是否也能发布映射文件?
此致、
Richard
Richard。 我没有尝试访问超出程序中数组有效范围的元素。
我发现堆栈内存有一个问题。
在我的代码中,我使用的是 sprintf(),它需要更多的堆栈内存。 我认为这是导致错误的原因之一。
当我注释 sprint()函数代码工作正常时。
现在的问题是如何为.stack 段添加更多内存。 我已经为 堆栈分配了 RAMGS13:origin = 0x019000,length = 0x001000内存,在 'Project->Properties->CCS Build->C2000 Linker->Basic Options -> Set C system stack sizes'中将 C 系统堆栈大小增加到0x1000。
在 RAM_lnk_CPU1.cmd 文件中有 RAMGS14 :origin = 0x01A000,length = 0x001000存在,但未使用。
我需要组合这两个存储器。 以便我将更多内存分配给.stack 段。
堆栈溢出是有道理的、但您无法在那里分配堆栈。 在 C28x 上、栈指针的宽度仅为16位、因此.stack 段必须位于0x10000以下的存储器中。 为了找到大于0x400的连续块、需要对其他段进行杂耍。
此致、
Richard
我已附加代码的存储器.map 文件。 在该模块摘要中,总计为10270。
您说过"在 C28x 上、栈指针的宽度仅为16位、因此.stack 段必须位于0x10000以下的存储器中"我没有收到这条语句。
我必须使用 sprintf()函数,我将其用于 SCI。 我正在使用 SCI 向计算机发送10个参数、以便我可以存储它们。
是否有办法克服这个问题?
在您之前发送的链接器命令文件中、您有以下行:
RAMGS13:origin = 0x019000,length = 0x001000
(笑声)
.stack:>RAMGS13,page = 1.
我说您不能将.stack 段放置在高于0xFFFF 的存储器范围内。 堆栈使用长度仅为16位的指针、因此无法访问。 这就是您的问题。
解决此问题的一种方法是将 SDFM 滤波器段移至更高的存储器地址、并将.stack 放入 RAMGS2中、例如:
.stack:>RAMGS2,page = 1.
filter1_RegsFile:> RAMGS5,PAGE = 1,fill=0x1111
Filter2_RegsFile:> RAMGS6,PAGE = 1,fill=0x2222
Filter3_RegsFile:> RAMGS7,PAGE = 1,fill=0x3333
Filter4_RegsFile:> RAMGS8,PAGE = 1,fill=0x4444
Differit_RegsFile:>RAMGS9,page = 1,fill=0x3333
此致、
Richard
尊敬的 Richard
1000谢谢。
将 SDFM 滤波器移至更高的存储器地址并将.stack 放入 RAMGS2、适用于我的程序。
再次感谢您耐心地回答问题。