高实时性程序优化设计

描述

工程苗小兵

先楫资深FAE工程师

 

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

 

 

简 介

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

 

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

经验分享

 

1

ILM程序优化

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

cpu

 

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

 

cpu

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

 

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

关键参数:
 

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

加载地址

入口点地址

cpu

 

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中执行。

cpu

 

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

cpucpu

 

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工具。

cpu

 

cpu

 

cpu

 

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


 

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

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

cpu

 

4

优化小知识

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

 

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

 

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

 

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

 

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分