【发布时间】:2013-03-20 13:53:31
【问题描述】:
好的,我已经尝试自己解决这个问题很长时间了,我只是放弃了。我已经搜索了整个网络,直到我无法忍受,我需要帮助!
我阅读了整个“C18 编译器用户指南”,它说 C18 支持使用大小大于 256 字节的堆栈。但是我按照他们的要求做了,更改了链接器脚本并使用了多库堆栈模型编译器选项 (-ls),但在堆栈的第一个库被填满后,我仍然无法访问变量。
我调试了一个简单的代码,它简单地递归调用一个函数。该函数有 5 个浮点参数和 5 个浮点局部变量,每次调用在堆栈中使用大约 42 个字节(5*4 用于参数 + 5*4 用于局部变量 + 2 个字节用于保存旧的 SFR2 值)。第 6 次调用后,堆栈值被覆盖。
在搜索网络时,我发现很多人就如何创建和使用大数组(大于 256 字节)给出了具体说明。其中一个步骤建议使用指针来访问数组的元素。我觉得我的问题与“使用指针访问不同银行中的变量”有关,但我不知道如何将局部变量全部更改为函数调用中的指针。这毫无意义。
说实话,恐怕我只是在做一些非常愚蠢的事情(因为我找不到任何人讨论这个问题)。我发现所有与增加堆栈大小相关的主题都建议使用静态变量。我通过这种方式解决了我的问题,但我仍然想知道 C18 如何支持更大的堆栈大小。
下面是我用来理解这个问题的测试代码。调试时,我注意到 FSR1 寄存器已正确更新,以指向下一个存储区中的下一个地址,下一个函数参数和变量应该放置在该地址中。但是当局部变量被写入时,它们会进入栈顶(只有地址的低字节被认为将数据移动到栈中,即使当 MPLABX IDE 指示变量的地址时,在调试模式下,是正确的)。因此,我很确定问题在于编译器生成的代码没有使用 16 位地址来使用堆栈。还是不知道怎么解决。
任何关于这个主题的讨论将不胜感激:) 谢谢!
float testFunction1(float p1, float p2, float p3, float p4, float p5)
{
float v1, v2, v3, v4, v5;
v1 = p1 + p2;
v2 = p2 + p3;
v3 = p3 + p4;
v4 = p4 + p5;
v5 = p5 + p1;
v1 = testFunction1(v1, v2, v3, v4, v5);
}
void main()
{
float v1, v2, v3, v4, v5;
v1 = 0x11ABCDEF;
v2 = 0xAABBCCDD;
v3 = 0xABCABCAB;
v4 = 0xFFEEDDCC;
v5 = 0x11223344;
v1 = testFunction1(v1, v2, v3, v4, v5);
}
【问题讨论】:
-
你能显示链接描述文件吗?
-
哦!当我放弃尝试时,我忘记了这个问题!我现在没有,但我明天会尝试分享它!谢谢!
标签: microcontroller pic microchip stack-size c18