经验分享 | 高实时性程序优化设计

2024-07-03
浏览量:
177

工程苗小兵

先楫资深FAE工程师


电力电子与电力传动专业硕士研究生,一个从事了20多年的功率控制的工程小兵,有多年的电机驱动和电源控制经验,专注电力电子控制方向。


简 介

先楫半导体为客户提供了480MHz - 1GHz的不同主频高性能MCU,适用于不同高算力、实时控制要求的场合。在电机、电源应用场合,需要us级响应和运算,对响应时间的一致性、快速性都有非常高的要求。随着MCU主频提高,MCU的存储方式和总线频率也更加多样化,先楫MCU中内部有ILM、DLM、AXI_SRAM、flash等多种存储空间,但同时不同存储需要的时钟也不同,给软件工程师设计带来很大困扰。先楫在官网已经提供了优化DSP和FFT运算、使用片上SRAM等相关应用文档。


本文重点简述基于电机、电源应用的具体代码优化方案。

经验分享


1

ILM程序优化

以下展示的是HPM6280的系统框图


CPU内部包含了ILM、DLM、cache,这些内存都可达 600Mhz主频。AXI总线上有AXI_SRAM和ILM_SLV、DLM_SLV,访问频率可达200MHz,总线宽度64bit,可以cache缓存。XPI接口为QSPI总线,最高频率133Mhz,双沿采样,通常只有4bit宽度。其中AHB总线还有32kbyte SRAM,但主要用于外设存储,这里不做赘述。


实际应用中程序都会放到flash中存储,而XPI的接口速度极大限制了代码执行效率。此外,由于XPI接口是可以cache缓存,导致XPI执行时cache命中和没有命中的运行时间差别非常大,代码一致性很差。为了方便客户使用,可以生成工程时选用debug/release模式,指定程序在ILM中执行。随后通过先楫manufacture tool可以实现镜像功能,即生成在从FLASH 加载的RAM启动镜像。通过这种方式实现代码完全在ILM中执行。


镜像助手可将SDK中的debug/release 构建的应用转化为FLASH启动镜像。

关键参数:

  • 固件首地址相对容器首地址偏移

  • 加载地址

  • 入口点地址


2

SEGGER编译优化在AXI_RAM执行

由于ILM空间限制,很多电源或电机复杂应用无法将程序全部放到ILM中执行,会导致因读取存储速度限制了CPU算力。 


HPM6200、HPM6E00系列在AXI总线的大容量SRAM可以配置成程序存储,其中HPM6260、HPM6E60还可以将CPU1的ILM、DLM配置到AXI总线上,基本满足了绝大部分应用。AXI RAM主频可达200Mhz,64bit位宽,有cache缓存,可以大大减少程序读取对CPU性能的影响。 


segger编译器可以自动生成flash加载到RAM的拷贝代码,只要在linker文件中配置相应特性,不需要额外修改flash拷贝代码。 


在linker文件中重新划分AXI RAM,增加代码区域。在软件中指定代码生成后存放区域。 


通过SDK GUI直接指定修改后的linker文件,即可实现代码在ILM+AXI RAM中执行。


代码指定区域可以通过SEEGER IDE批量指定文件或文件夹的程序放置区域,也可以在函数名前面增加函数宏定义。


3

GCC编译优化在AXI_RAM执行

先楫产品支持Andes加速指令,可以加速三角函数、指数运算等复杂运行速度,但同时需要GCC编译器支持。 


在linker文件中重新划分AXI RAM,增加代码区域。在软件中指定代码生成后存放区域。


与segger编译器不同,GCC编译需要增加额外代码实现flash加载到RAM的拷贝,需要修改相应的reset.c文件。 


支持Andes加速指令需要引用hpm_math.h库文件,会调用libdspf.a、libdspd.a、libdsp.a等封装库。由于封装库非明文代码,无法通过常规方法指定代码存放区域,导致调用该代码时会因代码放置在flash降低整体执行速度。需要在linker文件中额外配置响应代码区域分配。 


GCC编译后无法像segger一样编译后通过图形显示生成代码的占有率,且map文件阅读性差。对gcc编译的map文件需要引用AMAP.EXE工具。




GCC编译需要增加额外代码实现flash加载到RAM的拷贝,相应代码位于 SOC/HPM6XXX/TOOLCHAINS/GCC/reset.c 中。


在reset.c中函数c_startup实现flash到RAM程序的拷贝。 

程序运行时,会以start.s开始,进入main函数之前先调用c_startup 函数完成程序搬移,在客户的应用代码中不会因程序放置位置不同而增加额外操作。


4

优化小知识

segger编译器会将所有常数默认为定点数,即使该常数为小数,也需要在对应常数前加强制浮点转换或者在常数后面加“f”做说明。 


函数的inline定义在optimization level=0时是无效的,需要把优化等级设为1或更高。 


建议将常用函数或变量通过attribute属性定义到“.fast”和“.fast_ram”。 


先楫MCU为多总线系统,当CPU读写外设时会有时钟同步问题,建议在配置外设时尽量提高外设频率,减少时钟同步延迟。 


HPM6260以及HPM6E60可以通过ILM_SLV、DLM_SLV接口可以将CPU1的内部存储作为AXI_RAM使用。





“先楫半导体”(HPMicro)是一家致力于高性能嵌入式解决方案的半导体公司,总部位于上海,产品覆盖微控制器、微处理器和周边芯片,以及配套的开发工具和生态系统。公司成立于2020年6月,总部坐落于上海市浦东软件园区,并在天津、苏州、深圳和杭州均设立分公司。核心团队来自世界知名半导体公司管理团队,具有15年以上,超过20个SoC的丰富的研发及管理经验。先楫半导体以产品质量为本,所有产品均通过严格的可靠性测试。目前已经量产的高性能通用MCU产品包含HPM6700/6400、HPM6300、HPM6200、HPM5300、HPM6800及HPM6E00系列,性能领先国际同类产品并通过AEC-Q100认证。公司已完成ISO9001质量管理认证和ISO 26262/IEC61508功能安全管理体系双认证,全力服务中国乃至全球的工业、汽车和能源市场。更多信息,敬请访问 https://hpmicro.com/