Cypress Semiconductor与HI-TECH Software共同发表一款最新的编译程序技术,能有效扩充可动态调整的PSoC混合讯号数组中的内存容量与效能。此新款符合ANSI规范的C语言编译程序—「专为PSoC混合讯号数组量身设计的HI-TECH C PRO」,运用HI-TECH的「Omniscient Code Generation(OCG)」全知程序代码产生技术,可大幅缩减PSoC程序代码大小。
PSoC混合讯号数组将可编程的模拟与数字功能与8位MCU核心整合在一起,并包含最大可达32Kbyte的闪存,及最大可达2Kbyte的SRAM。PSoC混合讯号数组可广泛运用在各种注重成本、及有空间限制的消费性应用,包括:触控屏幕接口、马达控制、以及近距离侦测等。PSoC组件具备动态调整功能,并可由同一个硅组件执行多个独立运作的功能,因此能降低组件数量、机板空间、以及电源消耗。
虽然将可重新组态的功能加入到PSoC组件不会增加所需的硅组件数量,但每个可重新组态的功能将需要更多的程序代码。在某些应用中,增加功能会让程序代码增加并超过芯片内建闪存的容量。此外,更大的软件堆栈和设计变化的需求,促使芯片内建SRAM的使用状况不断接近极限,增加未侦测堆栈溢满的机会。目前解决SRAM与闪存诸多限制的解决方案有下列3个:(1)限制产品的功能;(2)将应用移转至包含更多SRAM与闪存容量的更大的PSoC组件;(3)撰写组译语言程序代码,以缩小程序、堆栈、以及变量的数量,这种方法非常耗时费力,并让程序代码的移植能力大幅受限。这些替代方案的都不实用。
锁定PSoC混合讯号数组的HI-TECH C PRO编译程序采用OCG技术,在检查所有程序模块后,再进行编译与指针、缓存器、和堆栈配置的优化,以及删除多余程序代码等作业。编译程序亦释放出SRAM空间,并针对所有非递归与非重进入的程序代码,编译直接寻址与优化函数堆栈,以减少PSoC组件索引缓存器竞用资源的状况。由于缩小的程序代码能在更少的周期内执行完毕,因此,新款编译程序亦可增加PSoC组件的效能。
因为OCG知道变量与已编译堆栈需要多少内存,并可随时配置,如此可让SRAM的使用能更有效率,甚至能分析指针变量的范围,并在适当的时机配置单位指针。编译程序可藉此增加可用SRAM的容量,有时增加的幅度相也当可观。此外,根据统计数据设定的堆栈,可增加到程序需要的最大深度,OCG并可藉以防范可能导致严重故障的堆栈满溢状况。
扫瞄所有程序模块,并对应至呼叫图与指针参考图功能
在准备编译时,OCG编译程序会针对程序中每个模块,建立部份编译的程序函式库。然后再搜寻所有对应至程序的函式库功能,并建立一个“呼叫图”。在呼叫图完成后,从头到尾都没有被呼叫的函式就会被移除,编译程序会找出并标示被称为「重新进入」的函式,像是在主程序代码与中断函式中的函式。
OCG编译程序亦会在每个程序模块中,为每个指针产生一个指针参考图。因为编译程序知道任何指针所寻址的对象尺寸,因此可侦测出任何一个存取静态分配对象端的动作,并警告程序设计师可能的无效内存存取动作。从未启动过的指针将会被删除,并在编译时间内发出适当警告。此外,编译程序亦提供开发工程师一个相当有价值的除错报告,可显示出所有指针及其目标对象。编译程序还会在不同原始码档案中,先确认出彼此不兼容的变量或对象,并向用户提出警告。
针对变量与堆栈进行优化,释出SRAM资源
传统的编译程序一般会对变量尺寸做最坏状况的假设。这种模式导致SRAM资源的使用效率低落。由于编译程序知道所有变量的大小,因此仅会配置需要的内存来储存每个变量,并能依应用的程度,配合释放出最高达10%或更多的SRAM空间。
在许多低成本8位可编程组件中,PSoC混合讯号数组使用相同的SRAM空间来储存软件函数堆栈与数据变量。若没有配置足够的SRAM空间来配合动态堆栈的最大容量,堆栈可能就会溢满到数据变量空间,而造成程序当机。
排除PSoC索引缓存器竞争资源的窘境
要存取储存在PSoC组件中动态堆栈内的数据,需要先拿到仅用来移动与移除缓存器内容的堆栈指针,并传送到可存取数据的索引缓存器。由于PSoC组件仅含有一个索引缓存器,因此动态配置的堆栈会造成竞用稀有资源的状况。此外,若堆栈指针变更,或索引缓存器改用于其他用途,堆栈指针就必须先储存,然后重新复制到索引缓存器。每次指针复制出或写入到索引缓存器时,都分别需要4与10个频率周期,经常存取动态堆栈的应用程序,会导致系统需要使用超过某些数量的程序代码,才能执行系统功能。
优化PSoC内存使用模式
PSoC混合讯号数组拥有一个分页式SRAM架构,无论任何时刻都仅能存取256字节的SRAM。要存取其他内存分页,需要透过分页选择缓存器(PSR)进行重置。每个PSR重置动作需要3字节的程序代码以及12个周期来执行。若分页中一个使用中的数据(像是一个中断例程)必须写入另一个内存分页,就需要使用更多程序代码和更多频率周期。例如,Page0被自动选取用来支持中断例程。若中断例程需要存取Page0以外其他分页中的变量时,就须先储存PSR,再变更内存存取模式,然后PSR再加载其他分页地址。之后PSR必须回复原先的状态,然后再进行中断。
HI-TECH支持OCG的编译程序拥有智能型功能,能侦测到所有程序模块使用的变量与指针,以及它们所使用的频率,并且再产生程序代码之前,就已经知道堆栈需要多少容量,以及应该配置的区域。它会把最常用到的变量配置到最方便存取的RAM,并把较不常用到的数据放到分页RAM。结果可以避免让程序代码设定分页选择缓存器,并可藉此增进程序代码密度,进而大幅提升效能。
能与PSoC Designer v4.4整合
HI-TEC支持OCG技术的编译程序,可完全整合至用于PSoC混合讯号数组的Cypress PSoC Designer集成开发环境(IDE)。