找回密码
 立即注册
查看: 118|回复: 16

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2026-01-07 00:10:42

20

主题

182

回帖

1738

积分

金牌会员

积分
1738
发表于 3 天前 | 显示全部楼层 |阅读模式
实际使用中发现,写入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去掉会导致死机。
暂时还没看到规律。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:288
  • 最近打卡:2026-01-07 08:14:17

818

主题

1万

回帖

2万

积分

管理员

积分
21660
发表于 3 天前 | 显示全部楼层
具体哪个型号的 MCU, 工作频率 ?


AI8051U ?
STC32G144K246 ?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2026-01-07 08:56:44
已绑定手机

98

主题

3975

回帖

8583

积分

荣誉版主

无情的代码机器

积分
8583
发表于 3 天前 | 显示全部楼层
和执行时间有关?

截图202601042057221638.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2026-01-07 00:10:42

20

主题

182

回帖

1738

积分

金牌会员

积分
1738
发表于 3 天前 | 显示全部楼层
神*** 发表于 2026-1-4 20:55
具体哪个型号的 MCU, 工作频率 ?

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2026-01-07 00:10:42

20

主题

182

回帖

1738

积分

金牌会员

积分
1738
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2026-1-4 20:57
和执行时间有关?

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:288
  • 最近打卡:2026-01-07 08:14:17

818

主题

1万

回帖

2万

积分

管理员

积分
21660
发表于 3 天前 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2026-01-07 00:10:42

20

主题

182

回帖

1738

积分

金牌会员

积分
1738
发表于 前天 00:35 | 显示全部楼层
最简测试工程
等效C代码
  1. void calc(float fa, float fb, float *fc)
  2. {
  3.         *fc = fa * fb;
  4. }
复制代码


汇编
  1.         MOV      DR8,fc?040          ;参数fc
  2.         MOV      DMAIR,#0x1E         ;DR4 = DR4 * DR0
  3.         NOP                      ;不加NOP会死机
  4.         MOV      @DR8+0x2,WR6        ;保存计算结果
  5.         MOV      @DR8,WR4
  6.         RET   
复制代码


test_fpu.rar (22.36 KB, 下载次数: 4)
完整测试工程

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2026-01-07 00:10:42

20

主题

182

回帖

1738

积分

金牌会员

积分
1738
发表于 前天 00:55 | 显示全部楼层
程序段后面加上亮LED指令验证,死机时不会继续向下执行。

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

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:23
  • 最近打卡:2026-01-06 12:11:54

2

主题

105

回帖

1156

积分

金牌会员

积分
1156
发表于 前天 14:51 | 显示全部楼层
每个芯片都有这问题还是个别芯片有这问题
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:109
  • 最近打卡:2026-01-07 00:10:42

20

主题

182

回帖

1738

积分

金牌会员

积分
1738
发表于 前天 15:11 | 显示全部楼层
Easy*** 发表于 2026-1-5 14:51
每个芯片都有这问题还是个别芯片有这问题

目前测的是全部ai8051u有这个问题,
STC32G144没问题。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-1-7 16:00 , Processed in 0.128124 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表