health 发表于 2026-1-4 19:25:01

关于TFPU的使用方式,写入DMAIR后需跟随NOP指令。

实际使用中发现,写入DMAIR后需要跟着一条NOP指令,否则会死机。
例如浮点乘法计算,
MOV DMAIR, #0x1E
NOP
如果去掉后面的NOP,直接使用计算结果的话,导致死机。
死机是个笼统的说法,实际是系统失去响应,具体是计算结果出错,还是跑飞目前还没深究。

官方通用的使用方法是代替keil库函数,
MOV DMAIR之后必然有RET指令,
也就是写DMAIR和取计算结果之间有一些间隔,
官方这样用法是没问题的。

同样的 MOV DMAIR, #0x1E,有些地方可以不跟随NOP,有些地方必须跟NOP。

例子可参考https://www.stcaimcu.com/forum.php?mod=viewthread&tid=21780中的asm文件,内部大量的MOV DMAIR,#xx指令,后面均附带NOP指令。
去掉其中个别NOP运行无影响,但有另一些NOP去掉会导致死机。
暂时还没看到规律。

神农鼎 发表于 2026-1-4 20:55:08

具体哪个型号的 MCU, 工作频率 ?


AI8051U ?
STC32G144K246 ?

ercircle 发表于 2026-1-4 20:57:47

和执行时间有关?


health 发表于 2026-1-4 21:40:05

神农鼎 发表于 2026-1-4 20:55
具体哪个型号的 MCU, 工作频率 ?




AI8051U上试的,STC32G144还没试。
CPU 40MHz,TFPU 120MHz。

health 发表于 2026-1-4 21:41:17

ercircle 发表于 2026-1-4 20:57
和执行时间有关?

好像是和MOV DMAIR后面的指令有关。

神农鼎 发表于 2026-1-4 23:13:55

uS级【硬件三角函数/浮点运算器,TFPU】@Ai8051U, @120MHz, 计算sin函数@1.2uS - TinyML,Ai8051U 人工智能 开山之作,AI手写计算器 国芯人工智能技术交流网站 - AI32位8051交流社区

health 发表于 2026-1-5 00:35:04

最简测试工程
等效C代码
void calc(float fa, float fb, float *fc)
{
      *fc = fa * fb;
}

汇编
      MOV      DR8,fc?040          ;参数fc
      MOV      DMAIR,#0x1E         ;DR4 = DR4 * DR0
      NOP                      ;不加NOP会死机
      MOV      @DR8+0x2,WR6      ;保存计算结果
      MOV      @DR8,WR4
      RET   


完整测试工程

已确认与时钟频率无关,与TFPU时钟选择系统时钟或PLL高速时钟无关。
只要MOV DMAIR,#data后面是MOV@DRk+dis,WRj或MOV@DRk,WRj这种指令就会死机。
在MOV DMAIR,#data后面是其它指令则不会死机。

在 MOV DMAIR,#data
和 MOV@DRk+dis,WRj
之间插入NOP可避免死机。

health 发表于 2026-1-5 00:55:45

程序段后面加上亮LED指令验证,死机时不会继续向下执行。

已确认
不是计算结果错误,是彻底停机,不再继续执行指令。

EasyLad 发表于 2026-1-5 14:51:06

每个芯片都有这问题还是个别芯片有这问题

health 发表于 2026-1-5 15:11:39

EasyLad 发表于 2026-1-5 14:51
每个芯片都有这问题还是个别芯片有这问题
目前测的是全部ai8051u有这个问题,
STC32G144没问题。
页: [1] 2
查看完整版本: 关于TFPU的使用方式,写入DMAIR后需跟随NOP指令。