EDN China > 产品新闻 > 嵌入式系统 > 正文
?

最新8051编译器,利用减少30-50%的代码

EDN China?? 2008年10月14日 ?? 收藏0

  2008年11月10日,澳大利亚昆士兰州Acacia Ridge. . . HI-TECH Software今天推出一款“全知”ANSI C编译器,增加了DMIPS/MHz并降低了Silicon Labs基于8051混合信号MCU系列(包括超低功率、单节电池供电的C8051F9XX)的耗用功率。

  通过大幅优化上下文大小和寄存器在C语言程序所有模块中的覆盖情况,面向Silicon Labs 8051 MCU系列的HI-TECH C? PRO减少了中断延迟、代码大小以及对SRAM的使用。这样做使代码密度提高,程序执行所需的指令周期减少。更少的指令周期意味着CPU可以更多时间处于睡眠模式,从而进一步降低低功耗Silicon Labs器件的功耗。

“全知”ANSI C编译器

  使用Silicon Labs的Dhrystone V1.1基准和22.11 MHz时钟,HI-TECH的OCG编译器与非OCG编译器相比,DMIPS/MHz提高了55%以上,代码大小则降低了49%。(表1)

Dhrystone V 1.1 Benchmark
?代码大小SRAMDMIPS
HI-TECH PRO293955272.91
non-OCG Compiler576355401.87
区别-49.0%-0.2%+55.4%

  利用HI-TECH的C PRO编译Silicon Labs的以太网boot loader程序,可以减少30%的代码和20%的SRAM使用。(表2)

SiLabsEthernet Boot Loader (8051F340)
?代码大小SRAM
HI-TECH PRO6708955
OCG 编译器95841193
区别-30%-20%

  更快速的中断,降低20%的消耗功率-HI-TECH C PRO利用“全知代码生成(OCG)技术,全面搜集整个程序中每个寄存器、堆栈、指针、对象以及变量说明中的数据。它使用这些信息来优化整个程序中的寄存器使用、堆栈分配和指针。它还能够确保变量的一致性和模块间的对象声明,并去除无用的变量和函数。

  没有OCG功能的编译器独立编译每个代码模块,对来自程序其它部分的信息一无所知。因为它们不知道整个程序会用到哪些寄存器,所以通常情况下,它们必须保留所有八个通用寄存器,以及每次中断所需的其它片上资源。这些步骤要求多达48个时钟周期。相反,OCG编译器对整个程序中的每个变量、寄存器以及指针信息都有全面的了解。因为它准确知道中断会用到哪个寄存器,所以它能够以程序编辑时的状态为基础,动态决定上下文大小。由OCG编译器产生的代码在中断程序过程中可能不需要保留所有寄存器,因此能够节省非OCG编译器中所浪费的高达48个周期。

  考虑这样的一个应用:以8kHz采样一个音频输入,利用10位ADC将采样的音频转换为mu-law编码(8位,用于电话通信),然后通过RS232串行电路以115,200波特率进行传输,同时处理音频信号并驱动声量计(VU meter)显示当前的音频水平。

  波特率会对CPU时钟速度产生限制。时钟速度必须是波特率(例如115,200)的整数倍,同时还必须足够快,每次采样时每秒钟都能执行800次完整的指令序列。

  非OCG编译器针对Silicon Labs单电池供电C80519XXF所产生的代码,每次数据采样平均会有108个周期来执行中断服务程序和主循环。最大的时钟周期数为135,需要的时钟频率为1.08 MHz。但是,1.08 MHz并不是115,200波特率的整倍数,所以时钟频率必须增加到1.1152MHz。在这样的时钟频率下,C8051F9xx的平均消耗为248μA。

  利用HI-TECH C PRO编译同样的程序,所产生的代码执行时只需要93个周期,最大周期数为110,时钟频率为880 kHz。根据整数倍原理,最接近的时钟频率为921.6 kHz。在这样的时钟频率下,C8015F9XX的平均消耗为202μA,也就是说,比非OCG编码的执行节省了22%。

  去除对存储空间限制的要求-Silicon Labs的C8051微控制器具有分层存储架构,拥有6个不同但是重叠的存储空间。编译器供应商提供C语言扩展,允许程序员手动制定每个变量所需的存储空间,从而提高读取速度。但是这样的手动制定使得代码不可移植,而为了获得可能是最好的结果,这样做同时也增加了程序员的工作量。但是,随着程序开发的进展,变量到存储空间的最优化分配可能无法实现,而这样也就导致了代码整体性能的下降。

  HI-TECH C PRO完全解决了这一问题。因为它了解每个变量的使用频率以及其所依靠的变量是哪个,所以它能够优化指针,并将对象安置在最为有效的存储空间内。根据它们各自的尺寸以及被引用的次数,全局和静态变量被分配到可利用的存储空间。函数参数和自动变量被分配到被编译过的栈空间内。扩展内存中读取数据所需要的多余代码被最小化或干脆去掉。编译器自动允许那些其函数在同一时间内未被激活的变量共享同一内存,从而减少了高达80%的RAM使用。这些过程中,没有手动编程或者是C扩展。


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

编译器? 8051编译器? MCU?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈