0

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

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

任何对我的查询有帮助的答案将不胜感激。

4

2 回答 2

2

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

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

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

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

您可以很容易地看到使用 Codewarrior 的反汇编程序实际生成的代码。另请注意,Codewarrior 在优化方面一直表现不佳:哪些优化必须显式启用以及哪些优化是“内置”的,这一点从来都不是很清楚。确保您确实启用了所有相关的优化。

总的来说,尽可能避免存储内存。您可以使用高达 64k 内存的 non-banked 内存模型。只有当您超出该限制时,您才需要分页内存。也许这就是您的客户需要它的原因,他们可能用完了 RAM。

于 2016-03-15T09:57:24.640 回答
0

是的,不一定会增长的不是指针大小,而是处理“远”指针的代码(无论那些在 hc12 上到底是什么)

内核本身只真正支持 16 位指针,而这种分页有点附加,需要程序手动操作才能使其工作。

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

于 2016-03-14T22:03:21.993 回答