如何在Microchip的C18上使用更大的堆栈大小?

时间:2013-03-29 19:48:20

标签: microcontroller pic microchip stack-size c18

好吧,我一直在努力解决这个问题很长一段时间,我只是放弃了。我已经搜遍了所有的网页,直到我再也无法接受它,我需要帮助!

我阅读了整个“C18编译器用户指南”,它说C18支持使用大小超过256字节的堆栈。但我做了他们所要求的一切,更改了链接器脚本并使用了多库堆栈模型编译器选项(-ls),并且在堆栈的第一个库被填满后仍然无法访问变量。

我调试了一个简单的代码,简单地递归调用一个函数。此函数有5个浮点参数和5个浮点局部变量,每次调用时堆栈中使用大约42个字节(参数为5 * 4,局部变量为5 * 4,保存旧SFR2值为2个字节)。第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);
}

1 个答案:

答案 0 :(得分:0)

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