ZHCUCO7B December   2024  – November 2025 F29H850TU , F29H859TU-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
  5. 2性能优化
    1. 2.1 编译器设置
      1. 2.1.1 启用调试和源代码交叉列
      2. 2.1.2 优化控制
      3. 2.1.3 浮点数学
      4. 2.1.4 定点除法
      5. 2.1.5 单精度与双精度浮点
      6. 2.1.6 链接时优化 (LTO)
    2. 2.2 存储器设置
      1. 2.2.1 从 RAM 执行代码
      2. 2.2.2 从闪存执行代码
      3. 2.2.3 数据放置
    3. 2.3 代码结构和配置
      1. 2.3.1 内联
      2. 2.3.2 内联函数
      3. 2.3.3 易失性变量
      4. 2.3.4 函数参数
      5. 2.3.5 启用更广泛的数据访问
      6. 2.3.6 自动代码生成工具
      7. 2.3.7 准确剖析代码
    4. 2.4 应用代码优化
      1. 2.4.1 SDK 优化库
      2. 2.4.2 使用库优化代码尺寸
      3. 2.4.3 C29 特别指令
      4. 2.4.4 C29 并行性
      5. 2.4.5 首选 32 位变量和写入
      6. 2.4.6 编码风格及其对性能的影响
  6. 3参考资料
  7. 4修订历史记录

首选 32 位变量和写入

ECC 位包含 32 位数据,因此小于 32 位的 RAM 写入大小,存储器包装会执行读取-修改-写入操作来补入新值,并重新计算整个 32 位字的 ECC。当发生小于 32 位的多次写入时,会导致停滞。包括 ARM CPU 在内的大多数 CPU 都是如此。

Example: 5 writes take 13 cycles
ST.16 *(ADDR1)(A4+#0x1a),#0x1
ST.16 *(ADDR1)(A4+#0x14),#0x303
ST.8 *(ADDR1)(A4+#0x1e),#0x0
ST.8 *(ADDR1)(A4+#0x16),#0x4
ST.16 *(ADDR1)(A4+#0x1c),#0x0
注: 应用程序代码必须尽量减少小于 32 位的写入,在一般情况下,尽可能使用 32 位变量。
使用 32 位变量有时还可避免编译器添加额外指令来对 16 位值进行符号扩展。以下示例显示了一个编译器用于将 16 位值符号扩展到 32 位值的附加指令。
Example:
int16_t mashup_16(int16_t in_a, int16_t in_b) 
{
int16_t tmp1, tmp2, tmp3, tmp4; 
   tmp1 = in_a + in_b; 
   tmp2 = in_a - in_b; 
   tmp3 = in_b - in_a; 
   tmp3 = tmp1>>(tmp3 &0x7); 
   tmp4 = tmp2<<(tmp1 &0x7);
   return (tmp3 ^ tmp4);
}
Generated code:
20103420 <mashup_16>:
20103420:  33dd 0004         	MV	A4,D0
20103424:  33dd 0025         	MV	A5,D1
20103428:  3204 18a4         	SUB	A6,A5,A4,#0x0
2010342c:  b2e7 b200 3386 0007 20a4 0007 
                            	MV.S16	A7,#0x7
                             ||	ADD	A8,A5,A4,#0x0
                             ||	AND.U16	A6,#0x7
20103438:  33d2 1d07         	AND	A7,A8,A7
2010343c:  b3e4 3204 0108 1085 
                            	SEXT.16	A8,A8
                             ||	SUB	A4,A4,A5,#0x0
20103444:  33d8 1087         	LSL	A4,A4,A7
20103448:  b3d5 7a09 1506    	ASR	A5,A8,A6
                             ||	RETD
2010344e:  33e6 10a4         	XOR	A4,A5,A4
20103452:  33e4 0084         	SEXT.16	A4,A4
20103456:  33e0 0004         	MV	D0,A4
注: 由于所有 CPU 寄存器都是 32 位的,对寄存器的运算也是 32 位的,因此使用 32 位数据变量(对于时间关键型代码)一般会提高代码性能。