虽然我没有使用现有的每一个 PIC 编译器,但有两种风格。我使用的样式通过分析程序的调用图来静态分配所有局部变量。如果实际上执行了每个可能的调用,则本地人消耗的堆栈内存量将与静态分配所需的内存量相匹配,但有一些警告(描述 HiTech 的 PICC-18“标准”编译器的行为——其他可能会有所不同)
- 通过在调用者的范围内定义局部变量存储,并将指向该存储的两字节指针传递给被调用的函数来处理可变参数函数。
- 对于间接函数指针的每个不同签名,编译器在调用图中生成一个“伪函数”;调用该签名的函数的所有内容都调用该伪函数,并且该伪函数调用具有该签名的每个函数,该签名已获取其地址。
在这种编译器风格中,对局部变量的连续访问将与对全局变量的连续访问一样快。但是,除了显式声明为“near”的全局变量和静态变量,总长度不得超过 64-128 个字节(随 PIC 的不同型号而异),每个模块的全局变量和静态变量与局部变量分开放置,并且需要银行切换指令来访问不同银行中的东西。
我没有使用的一些编译器使用“增强指令集”选项。这个选项会吞噬 96 个字节的“near”bank(或全部,在少于 96 个字节的 PIC 上),并使用它来访问相对于 FSR2 寄存器的 96 个字节。如果它使用前 16 个或 32 个字节作为堆栈帧,这将是一个很棒的概念。使用 96 字节意味着放弃所有“近”存储,这是一个非常严重的限制。尽管如此,使用该指令集的编译器可以像访问全局变量一样快(如果不快的话)访问堆栈上的局部变量(不需要银行切换)。我真的希望 Microchip 可以选择只为堆栈帧留出 16 个字节左右,留下有用数量的“公共银行”RAM,但尽管如此,有些人对这种模式还是有好运的。