2

好的,我一直在尝试自己解决这个问题很长时间,我只是放弃了。我已经搜索了整个网络,直到我无法忍受,我需要帮助!

我阅读了整个“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);
}
4

1 回答 1

0

要启用多库堆栈代码模型,Lmodel请在 C18 编译器的命令行中使用 - 开关。

于 2013-03-30T15:00:44.057 回答