找回密码
 立即注册
楼主: 神***

向【64位超算中心】前进 ! DPU32@全新32位8051+DSP指令

[复制链接]
  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-21 04:53:25 | 显示全部楼层
    早期的 一个多芯片系统实例, 点阵式 LED显示大屏, 1片 CPU 控制一块区域的 LED刷新, N片CPU组成一个完整的 LED显示大屏,

    再用一片主控 CPU , 和其他 CPU组成星型网络通讯.
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-24 04:11:24 | 显示全部楼层
    建议 尽量优化 寄存器和 Keil 的匹配, 不要动不动就用万金油 关中断.
    执行 DPU32 指令, 需调用子程序和返回(3+3), 格外增加 6个指令周期.
    如布局不合理, 需再增加中断保护及关开(1+1+1), 格外再增加 3个指令周期.
    共计 9个指令周期. DPU32 执行速度再快, 也被整体拖慢

    点评

    不关中断,是DPU32执行时,不给CPU时钟,中断如发生,后续会被响应  详情 回复 发表于 2024-3-24 08:00
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    556

    主题

    9693

    回帖

    1万

    积分

    管理员

    积分
    14193
     楼主| 发表于 2024-3-24 08:00:55 | 显示全部楼层
    LAOXU 发表于 2024-3-24 04:11
    建议 尽量优化 寄存器和 Keil 的匹配, 不要动不动就用万金油 关中断.
    执行 DPU32 指令, 需调用子程序和返回 ...

    不关中断,是DPU32执行时,不给CPU时钟,中断如发生,后续会被响应

    点评

    按照原技术标准, DPU32使用 00H-07H, 08H-0FH 地址 RAM 前者是映像寄存器, 不用关中断, 如计划不变(我前面建议改用寄存器), 当使用后者(08H-0FH)必须关中断 ! 否则会连锁产生一系列问题.  详情 回复 发表于 2024-3-24 09:22
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-24 09:22:38 | 显示全部楼层
    神农鼎 发表于 2024-3-24 08:00
    不关中断,是DPU32执行时,不给CPU时钟,中断如发生,后续会被响应

    按照原技术标准, DPU32使用 00H-07H, 08H-0FH 地址 RAM

    前者是映像寄存器, 不用关中断, 如计划不变(我前面建议改用寄存器), 当使用后者(08H-0FH)必须关中断 !
    ===是暂时不给CPU时钟,CPU无法取指令  ,不需要关中断

    否则会连锁产生一系列问题.

    点评

    “当使用后者(08H-0FH)必须关中断 !” 谁告诉你的这个“全称肯定”的观点是正确的? 别把风车当魔鬼,别再自己不停地抬出些不成立的观点来吓唬人!  详情 回复 发表于 2024-3-24 13:31
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    66

    主题

    714

    回帖

    1万

    积分

    荣誉版主

    积分
    10975
    发表于 2024-3-24 13:31:47 | 显示全部楼层
    LAOXU 发表于 2024-3-24 09:22
    按照原技术标准, DPU32使用 00H-07H, 08H-0FH 地址 RAM

    前者是映像寄存器, 不用关中断, 如计划不变(我前 ...

    “当使用后者(08H-0FH)必须关中断 !”

    谁告诉你的这个“全称肯定”的观点是正确的?
    别把风车当魔鬼,别再自己不停地抬出些不成立的观点来吓唬人!

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-24 14:37:22 | 显示全部楼层
    神农鼎


    以 32位乘除运算(MMD32_EABX)为例,


    寄存器命名: EAX(DR4), EBX(DR0), ECX(08H), EDX(0AH),  
    执行 : {ECX,EAX} = EAX*/EBX/EDX;


    extern long *mmd32(long EAX, long EBX, long EDX)
    // 注: 返回结果存 指针指向 64位


    汇编子程序:
    mmd32?_   mov   DR4, .. // 可重入函数, 传递参数
              mov   DR0, .. // 略(不会出错)
              mov   0AH, ..
              ....      // 出错处
              mov   DMAIR,#MMD32_EABX  // 执行32位乘除运算, CPU时钟停止.
              ....     // 出错处
              mov   xx,08H  
              mov   xx,EAX
              ....
    }


    实例程序:
    void int1(void)  interrupt  1
    {
       long *mmd32(long EAX1, long EBX1, long EDX1);
    }


    void main(void)
    {  do{
          long *mmd32(long EAX0, long EBX0, long EDX0);
       while(1);




    出问题处如, 当 main 中 mmd32, 执行到 上述 mmd32?_ 汇编子程序中 红色蓝色高亮显示处,


    被中断打断, 中断执行新的 mmd32 后返回,


    如是红色处被中断打断, 返回时 EDX(0AH) 被改变, 已不是 main 中 mmd32 的装载参数了, 而是中断中 EDX(0AH)的值.  .


    如是蓝色处被中断打断, 返回时 ECX(08H) 被改变, 已不是 main 中 mmd32 的装载参数了, 而是中断中 ECX(08H)的值.  .


    与执行32位乘除运算,暂时不给CPU时钟,CPU停止工作无关 !  

    点评

    你这书写方式明显有误呀,转换为汇编以后,传参数是在调用函数之前的. 换句话来说:mmd32?_ 处, 参数已在DR0,DR4, XXXX, 其中XXXX分两种情况,如果函数声明为reentrant,XXXX在栈中,如果非可重入则XXXX在固定的R  详情 回复 发表于 2024-3-24 21:37
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-24 14:42:28 | 显示全部楼层
    汇编子程序 改成如下, 加关中断就没事了:

    mmd32?_   mov   DR4, .. // 可重入函数, 传递参数
              mov   DR0, .. // 略(不会出错)
              PUSH   IE
              CLR     EA
              mov   0AH, ..
              mov   DMAIR,#MMD32_EABX  // 执行32位乘除运算, CPU时钟停止.
              mov   xx,08H  
              POP    IE
              mov   xx,EAX
              ....
    }



    点评

    汇编子程序 改成如下, 加关中断就没事了: mmd32?_ mov DR4, .. // 可重入函数, 传递参数 mov DR0, .. // 略(不会出错) PUSH IE CLR EA mov 0AH, ..  详情 回复 发表于 2024-3-25 08:37
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-24 14:58:49 | 显示全部楼层
    不在 mmd32?_ 中加关中断,  换种方法也行,


    由于 mmd32 函数占用 08H-0FH, 对外显性有类拟于不可重入特性.

    因此, 需在 OS 及中断中, 增加 压栈 保护 08H-0FH,  这样一来, 使用更麻烦.

    不如在  mmd32?_ 中加关中断  简洁.



    这是一些最最基本的常识, 我以为大多数人都懂的, 所以给了个结论, 未说明简单过程.


    不好意思, 给老姚添麻烦了, 对不起.

    点评

    只回复说的最对的只有三个字,便是“我以为”, 你确实有些“你以为了”。  发表于 2024-3-25 15:48
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    580

    回帖

    1229

    积分

    荣誉版主

    积分
    1229
    发表于 2024-3-24 21:37:46 | 显示全部楼层
    本帖最后由 tzz1983 于 2024-3-24 22:17 编辑

    你这书写方式明显有误呀,转换为汇编以后,传参数是在调用函数之前的.
    换句话来说:mmd32?_ 处, 参数已在DR0,DR4, XXXX,
    其中XXXX分两种情况,如果函数声明为reentrant,XXXX在栈中,如果非可重入则XXXX在固定的RAM处,
    所以你只要把 
    extern long *mmd32(long EAX, long EBX, long EDX);
    改为 extern long *mmd32(long EAX, long EBX, long EDX) reentrant;
    就解决了.非要人家硬件来配合你干什么呢,  硬件不像写代码,说改就改,过家家呢

    点评

    简写了, 默认 C编写的函数, 都是可重入的 问题不是出在函数入口, 而是出在 固定的RAM处, 至于你说出这种话, 只能证明 如下: 你没仔细看 前后因果关系, 这个 固定的RAM , 不是我指定的, 而是 STC目前 的设计方案  详情 回复 发表于 2024-3-24 23:21
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:47
  • 签到天数: 158 天

    [LV.7]常住居民III

    39

    主题

    901

    回帖

    4312

    积分

    荣誉版主

    积分
    4312
    发表于 2024-3-24 23:21:45 | 显示全部楼层
    tzz1983 发表于 2024-3-24 21:37
    你这书写方式明显有误呀,转换为汇编以后,传参数是在调用函数之前的.
    换句话来说:mmd32?_ 处, 参数已 ...

    简写了, 默认 C编写的函数, 都是可重入的

    问题不是出在函数入口, 而是出在 固定的RAM处,

    至于你说出这种话, 只能证明 如下:

    你没仔细看 前后因果关系, 这个 固定的RAM , 不是我指定的, 而是 STC目前 的设计方案指定的,



    我是强力要求取消这个指定, 这是 争论的交点
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-1 05:15 , Processed in 0.069513 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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