关于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去掉会导致死机。
暂时还没看到规律。
具体哪个型号的 MCU, 工作频率 ?
AI8051U ?
STC32G144K246 ?
和执行时间有关?
神农鼎 发表于 2026-1-4 20:55
具体哪个型号的 MCU, 工作频率 ?
AI8051U上试的,STC32G144还没试。
CPU 40MHz,TFPU 120MHz。 ercircle 发表于 2026-1-4 20:57
和执行时间有关?
好像是和MOV DMAIR后面的指令有关。 uS级【硬件三角函数/浮点运算器,TFPU】@Ai8051U, @120MHz, 计算sin函数@1.2uS - TinyML,Ai8051U 人工智能 开山之作,AI手写计算器 国芯人工智能技术交流网站 - AI32位8051交流社区
最简测试工程
等效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可避免死机。 程序段后面加上亮LED指令验证,死机时不会继续向下执行。
已确认
不是计算结果错误,是彻底停机,不再继续执行指令。
每个芯片都有这问题还是个别芯片有这问题 EasyLad 发表于 2026-1-5 14:51
每个芯片都有这问题还是个别芯片有这问题
目前测的是全部ai8051u有这个问题,
STC32G144没问题。
页:
[1]
2