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.
尊敬的所有人:
我最近遇到了一个问题、我将向您解释一下您是否可以帮助我找到原因以及可能的解决方案。
我有许多不同长度的整数数数数组(int16)。 我想制作一个指向前面提到的每个数组的指针数组、但是这个列表相对较大。 我有532个数组、因此我需要532个指针数组。 没关系。 当我在 DSP 上编译和执行程序时、问题就会出现、因为它会变得´疯狂´。 我的意思是说我有一个可以正常工作的固件、但当我包含此代码(仅限指针数组的定义)时、该固件就无法正常工作。
其他可能有用的信息: 我将初始化值存储在闪存的 FLASHB 部分中、根据.map 文件、闪存扇区中仍有足够的空间用于该指针数组。
以下是我的代码示例:
int16 array1[3]={0、0、10000};
int16 array2[10]={9、-1、0、1、2、 3、4、5、2000、4000};
int16 array3[3]={0、10、30000};
int16 array4[5]={0、10、10000、2、5};
int16 array5[1]={-1};
(笑声)
int16 * list_for_array[532]={
array1、
array2、
array3、
array4、
array5、
(笑声)
第532列
};
此外、还有其他信息。 如果我对100个矢量执行此操作、一切都正常。 如果我用200执行、一切都可以正常工作、但如果用400或500执行、例如、它已经开始失败。 似乎存在一些内存分配错误或其他问题、我找不到该位。
如果有人告诉我问题的原因、如何调试和/或如何解决、我会非常感激。
谢谢、致以诚挚的问候。
豪尔赫、
一种可能是看门狗计时器在变量已初始化之前超时。 看起来您有很多初始化数据、所有这些数据都必须在程序启动之前从闪存复制到 RAM 中。 这是在您加电器件时通过运行时支持库函数完成的,就在调用 main()之前。 如果看门狗在这段时间内处于活动状态,则可能会超时并重置设备,因此您实际上永远不会到达 main()。
如果您使用的是头文件、您的项目中应该有一个名为"DSP2833x_CodeStartBranch.asm"的文件。 如果是这样、请在分支到_c_int00之前检查一下看门狗是否被禁用。 您应该具有:
WD_DISABLE .set 1;设置为1可禁用 WD、否则设置为0
我不确定这是否是问题、但它是否适合取决于初始化数据的大小。
此致、
Richard
海尔·理查德、
首先、感谢您投入宝贵的时间和精力。
我听从了您的建议并检查了、但是、我已经用您上面提到的线路禁用了看门狗、因此似乎不是问题所在。
此外、DSP 并未完全冻结。 实际上、我可以通过主循环中的 Modbus 与 DSP 通信。 另一个提示:IM 使用 TI 提供的闪存 API、但是、当使用此大初始化程序并尝试写入闪存时、API 会返回错误。
再次感谢、致以诚挚的问候、
豪尔赫。
豪尔赫、
请尝试以下操作:
1) 1)确保优化已关闭、并且在项目选项中启用了调试(完全符号调试)、以便您可以确保调试微控制器内的实际代码。
2) 2)尝试禁用所有中断。 可能是错误初始化的中断导致了疯狂。
3) 3)尝试运行相同的代码、但减小阵列大小。 例如、将512个整数的数组减少到10个整数。 如果这正常工作(如果微控制器在调试窗口中继续正确执行代码)、则问题出在存储器管理中。 如果在函数中声明这些数组、则在工程选项中增大栈大小。 您可能还需要增加.cmd 文件中的栈大小。 如果这些数组是全局数组,请检查 cmd 文件中的 ebss 大小。 您可以查看下面的链接。 它将为您提供有关存储器部分的更多信息。
processors.wiki.ti.com/.../C28x_Compiler_-_Understanding_Linking
我希望这些将有所帮助。
哈坎
您好 Kadir、
非常感谢您的回答。 它非常有用、尤其是您给我的链接。
在阅读了 tat wiki 页面并检查了代码中的某个位后、我认为我理解它为什么不起作用。 我将解释:
我将指针数组定义为全局数组、因此它存储在.ebss 中、但是存储该段的存储器块空间不足、我认为这就是为什么在更大的数组中一切都开始失败的原因。 在.cmd 文件中进行一些更改并重新分发代码段后、我设法适应了数组。
但是、仍有一些与我相关的东西:我有一些整数数数组(int16)定义为常量(例如: const Int16 array1[10];)、保存在.econst 段中、但是、我的指针数组也被定义为 const (const Int16 * array_for_for_thinters)、如果我查看.map 文件、它仍然保存在.ebss 段中。 为什么会发生这种情况?
再次感谢您的帮助和致以最诚挚的问候。
豪尔赫。