在C

时间:2016-03-14 21:13:46

标签: c pointers embedded 68hc12

我在一家主要从事汽车网络设计的软件公司的部门工作。我们主要用C语言编写网络协议栈。最近,我被分配了一个项目,需要使用飞思卡尔的HC12控制器。最初编写的协议栈支持使用无银行账户的RAM以及存储区和非存储区闪存。在分配给我的项目中,客户需要使用存储区RAM而不是没有银行账户的RAM(原因我不知道)。当我参与这个项目的开发时,我意识到我可以使用远指针来访问(读/写)分组RAM。

我的问题是:当我使用远指针访问存储区RAM时,我的库代码大小增加了多达10千字节。这是正常的吗?在我使用的编译器的参考手册(codewarrior)中,远指针的大小被提到为3个字节,而普通指针的大小为2个字节。这1个额外的字节真的可以导致代码大小的这么大差异吗?有没有其他方法不包括使用远指针,我仍然可以访问存储区RAM?

我非常感谢您对我的疑问的任何有用的答案。

2 个答案:

答案 0 :(得分:2)

最初,HCS12上的存储空间仅用于闪存中的程序代码,在这种情况下,您不会注意到程序大小的巨大差异。唯一的区别是子程序调用需要使用存储区存储器指令(CALL,RTC而不是JMP,RTS),每个函数调用需要几个字节的程序存储器。

然后他们发布了同时存储闪存和存储区RAM(某些HCS12X等)的设备。 RAM显然是用于数据,而不是程序存储器。

问题是HCS12是一个16位CPU,所以它不能轻易处理24位数据指针。这意味着所有这样的代码处理存储器存储器中的数据将变得相当低效:对于每次访问(通过"远"指针等),它将必须设置页面寄存器,该寄存器代表了存储器的高8位。 24位地址。完成后,它可以使用正常指令将数据读/写到地址的16位部分,硬件会将其映射到正确的页面。一旦完成,程序还必须恢复页面寄存器。

编译器很可能无法很好地优化对分页数据的访问 - 理论上,您可以设置页面寄存器,然后在需要恢复之前访问该页面中的所有数据。但是在编译时,编译器可能无法知道将在何处准确分配变量。

您可以很容易地看到使用Codewarrior的反汇编程序实际生成的代码。还要注意Codewarrior在优化方面一直都是功能失调:从来都不清楚必须明确启用哪些优化以及哪些内置"内置"。确保您实际启用了所有相关的优化。

总的来说,尽可能避免存储空间。您可以使用高达64k内存的非库存内存模型。只有当你超出限制时才需要分页内存。也许这就是您的客户需要它的原因,它们可能已经用完RAM。

答案 1 :(得分:0)

是的,这不是指针大小必然增长,而是处理'远'指针的代码(无论hc12上的指针是什么)

核心本身只支持16位指针,而这种分页只是一个补充,需要程序手持才能使其工作。

好消息是你现在正在寻呼,所以10k并不可怕。