Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用远指针时更改代码大小_C_Pointers_Embedded_68hc12 - Fatal编程技术网

在C中使用远指针时更改代码大小

在C中使用远指针时更改代码大小,c,pointers,embedded,68hc12,C,Pointers,Embedded,68hc12,我在一家软件公司的部门工作,该公司主要从事汽车网络设计。我们主要用C语言编写网络协议栈。最近,我被分配了一个项目,需要使用飞思卡尔的HC12控制器。最初编写的协议栈支持使用非银行RAM以及银行和非银行闪存。在分配给我的项目中,客户要求使用银行RAM而不是非银行RAM(原因我不知道)。当我致力于这个项目的开发时,我意识到我可以使用远指针来访问(读/写)存储的RAM 我的问题是:当我使用远指针访问存储的RAM时,我的库代码大小增加了多达10k字节。这正常吗?在我使用的编译器(codewarrior)

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

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


如果您能回答我的问题,我们将不胜感激。

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

核心本身实际上只支持16位指针,这种分页是一种附加组件,需要程序手动才能工作


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

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

核心本身实际上只支持16位指针,这种分页是一种附加组件,需要程序手动才能工作


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

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

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

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

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

您可以很容易地看到使用Codewarrior的反汇编程序实际生成的代码。还要注意的是,Codewarrior在优化方面总是相当不正常:始终不清楚哪些优化必须显式启用,哪些优化是“内置的”。确保您实际启用了所有相关的优化


总的来说,尽可能避免存储大量内存。您最多可以使用64k内存的非银行内存型号。只有当你超过这个限制时,你才需要分页内存。也许这就是您的客户需要它的原因,他们的RAM可能用完了。

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

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

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

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

您可以很容易地看到使用Codewarrior的反汇编程序实际生成的代码。还要注意的是,Codewarrior在优化方面总是相当不正常:始终不清楚哪些优化必须显式启用,哪些优化是“内置的”。确保您实际启用了所有相关的优化

总的来说,尽可能避免存储大量内存。您最多可以使用64k内存的非银行内存型号。只有当你超过这个限制时,你才需要分页内存。也许这就是为什么你的客户需要它,他们喜欢