凌鸥08x dsp协处理器模式注意事项

[复制链接]
 楼主| 星辰大海不退缩 发表于 2023-7-21 18:00 | 显示全部楼层 |阅读模式
应用上如果只用到DSP做协处理器做数**算时,应避免在多个中断中同时调用DSP进行计算,如果有这方面的需求,可以使用1个全局变量和1个局部变量做状态判断,计算被打断后重新计算即可。
参考配置及头文件见附件
参考配置入下

  1. /*******************************************************************************
  2. * 版权所有 (C)2015, LINKO SEMICONDUCTOR Co.ltd
  3. *
  4. * 文件名称: lks32mc08x_dsp.c
  5. * 文件标识:
  6. * 内容摘要: DSP协处理器模式驱动程序
  7. * 其它说明: 无
  8. * 当前版本: V 1.0
  9. * 作    者: YangZJ
  10. * 完成日期: 2022年3月10日
  11. *
  12. * 修改记录1:
  13. * 修改日期:2022年3月10日
  14. * 版 本 号:V 1.0
  15. * 修 改 人:YangZJ
  16. * 修改内容:创建
  17. *
  18. *******************************************************************************/
  19. #include "lks32mc08x.h"
  20. #include "lks32mc08x_sys.h"
  21. static volatile u8 dsp_**; // 标志位,用于判断程序是否被打断
  22. /*******************************************************************************
  23. 函数名称:    s16 lks08x_dsp_sin(u16 val)
  24. 功能描述:    使用08x的DSP计算正弦
  25. 输入参数:    u16  val     角度0-65535对应0-360度
  26. 返 回 值:    s16 result  计算结果Q15格式
  27. 其它说明:
  28. 修改日期      版本号          修改人            修改内容
  29. -----------------------------------------------------------------------------
  30. 2022.03.10    V1.0           YangZJ            创建
  31. *******************************************************************************/
  32. s16 lks08x_dsp_sin(u16 val)
  33. {
  34.     s16 result;
  35.     u8 dsp_**_old;
  36.     do
  37.     {
  38.         dsp_**++;
  39.         dsp_**_old = dsp_**;
  40.         SYS_SoftResetModule(SYS_Module_DSP);
  41.         DSP_SC = BIT2 | BIT1;
  42.         DSP_CORDIC_THETA = val;
  43.         result = DSP_CORDIC_SIN;
  44.     } while (dsp_**_old != dsp_**);
  45.     return result;
  46. }
  47. /*******************************************************************************
  48. 函数名称:    s16 lks08x_dsp_cos(u16 val)
  49. 功能描述:    使用08x的DSP计算余弦
  50. 输入参数:    u16  val    角度0-65535对应0-360度
  51. 返 回 值:    s16  result 计算结果Q15格式
  52. 其它说明:
  53. 修改日期      版本号          修改人            修改内容
  54. -----------------------------------------------------------------------------
  55. 2022.03.10    V1.0           YangZJ            创建
  56. *******************************************************************************/
  57. s16 lks08x_dsp_cos(u16 val)
  58. {
  59.     s16 result;
  60.     u8 dsp_**_old;
  61.     do
  62.     {
  63.         dsp_**++;
  64.         dsp_**_old = dsp_**;
  65.         SYS_SoftResetModule(SYS_Module_DSP);
  66.         DSP_SC = BIT2 | BIT1;
  67.         DSP_CORDIC_THETA = val;
  68.         result = DSP_CORDIC_COS;
  69.     } while (dsp_**_old != dsp_**);
  70.     return result;
  71. }
  72. /*******************************************************************************
  73. 函数名称:    u16 lks08x_dsp_rms(s16 a,s16 b)
  74. 功能描述:    使用08x的DSP计算均方根
  75. 输入参数:    s16 a,b
  76. 其它说明:
  77. 修改日期      版本号          修改人            修改内容
  78. -----------------------------------------------------------------------------
  79. 2022.03.10    V1.0           YangZJ            创建
  80. *******************************************************************************/
  81. u16 lks08x_dsp_rms(s16 a, s16 b)
  82. {
  83.     u16 c;
  84.     u16 result;
  85.     u8 dsp_**_old;
  86.     do
  87.     {
  88.         dsp_**++;
  89.         dsp_**_old = dsp_**;
  90.         //先触发计算
  91.         //在计算的过程中判断数据是否可能溢出
  92.         a = (a > 0) ? a : -a;
  93.         b = (b > 0) ? b : -b;
  94.         c = a + b;
  95.         SYS_SoftResetModule(SYS_Module_DSP);
  96.         if (c > 32767) // 当数据可能溢出的时候降低1位精度并重新开始计算
  97.         {
  98.             DSP_CORDIC_X = a >> 1;
  99.             DSP_CORDIC_Y = b >> 1;
  100.             result = (u16)DSP_CORDIC_MOD;
  101.             result <<= 1;
  102.         }
  103.         else // 正常计算
  104.         {
  105.             DSP_CORDIC_X = a;
  106.             DSP_CORDIC_Y = b;
  107.             result = (u16)DSP_CORDIC_MOD;
  108.         }
  109.     } while (dsp_**_old != dsp_**);
  110.     return result;
  111. }
  112. /*******************************************************************************
  113. 函数名称:    u16 lks08x_dsp_arctan(s16 x,s16 y)
  114. 功能描述:    使用08x的DSP计算反正切
  115. 输入参数:    s16  x,y
  116. 返 回 值:    计算结果 角度0-65535对应0-360度
  117. 其它说明:
  118. 修改日期      版本号          修改人            修改内容
  119. -----------------------------------------------------------------------------
  120. 2022.03.10    V1.0           YangZJ            创建
  121. *******************************************************************************/
  122. u16 lks08x_dsp_arctan(s16 x, s16 y)
  123. {
  124.     u16 a;
  125.     u8 i;
  126.     u16 result = 0;
  127.     u8 dsp_**_old;
  128.     a = (x > 0) ? x : -x;
  129.     a = (y > 0) ? a + y : a - y;
  130.     do
  131.     {
  132.         dsp_**++;
  133.         dsp_**_old = dsp_**;
  134.         for (i = 0; i < 16; i++)
  135.         {
  136.             if ((a & (0x8000 >> i)) != 0)
  137.             {
  138.                 if (i == 0)
  139.                 {
  140.                     // 08x的DSP在计算角度时必须保证(x*x+y*y)<32767
  141.                     SYS_SoftResetModule(SYS_Module_DSP);
  142.                     DSP_CORDIC_X = x >> 1;
  143.                     DSP_CORDIC_Y = y >> 1;
  144.                 }
  145.                 else
  146.                 {
  147.                     // 08x的DSP在计算atan时为提高精度,应尽可能的放到X和Y的幅值
  148.                     SYS_SoftResetModule(SYS_Module_DSP);
  149.                     DSP_CORDIC_X = x << (i - 1);
  150.                     DSP_CORDIC_Y = y << (i - 1);
  151.                 }
  152.                 result = DSP_CORDIC_ARCTAN;
  153.                 break;
  154.             }
  155.         }
  156.     } while (dsp_**_old != dsp_**);
  157.     return result;
  158. }
  159. /*******************************************************************************
  160. 函数名称:    s32 lks08x_dsp_div(s32 a,s16 b)
  161. 功能描述:    使用08x的DSP计算除法
  162. 输入参数:    s32  a         被除数
  163.                s16  b         除数
  164. 其它说明:
  165. 修改日期      版本号          修改人            修改内容
  166. -----------------------------------------------------------------------------
  167. 2022.03.10    V1.0           YangZJ            创建
  168. *******************************************************************************/
  169. s32 lks08x_dsp_div(s32 a, s16 b)
  170. {
  171.     s32 c;
  172.     s32 result;
  173.     u8 dsp_**_old;
  174.     do
  175.     {
  176.         dsp_**++;
  177.         dsp_**_old = dsp_**;
  178.         SYS_SoftResetModule(SYS_Module_DSP);
  179.         DSP_DID = a;
  180.         DSP_DIS = b;
  181.         if (b == (s16)0x8000)
  182.         {
  183.             c = -a - 1;
  184.             result = (c >> 15) + 1;
  185.         }
  186.         else if (b == 0)
  187.         {
  188.             result = 0;
  189.         }
  190.         else
  191.         {
  192.             if (a != (s16)0x80000000)
  193.             {
  194.                 result = DSP_QUO;
  195.             }
  196.             else
  197.             {
  198.                 a >>= 1;
  199.                 DSP_DID = a;
  200.                 DSP_DIS = b;
  201.                 result = DSP_QUO << 1;
  202.             }
  203.         }
  204.     } while (dsp_**_old != dsp_**);
  205.     return result;
  206. }
  207. /*******************************************************************************
  208. 函数名称:    s32 lks08x_dsp_mod(s32 a,s16 b)
  209. 功能描述:    使用08x的DSP求模
  210. 输入参数:    s32  a         被除数
  211.                s16  b         除数
  212. 其它说明:
  213. 修改日期      版本号          修改人            修改内容
  214. -----------------------------------------------------------------------------
  215. 2022.03.10    V1.0           YangZJ            创建
  216. *******************************************************************************/
  217. s32 lks08x_dsp_mod(s32 a, s16 b)
  218. {
  219.     s32 result;
  220.     u8 dsp_**_old;
  221.     do
  222.     {
  223.         dsp_**++;
  224.         dsp_**_old = dsp_**;
  225.         SYS_SoftResetModule(SYS_Module_DSP);
  226.         DSP_DID = a;
  227.         DSP_DIS = b;
  228.         if (b == 0)
  229.         {
  230.             result = a;
  231.         }
  232.         else
  233.         {
  234.             result = DSP_REM;
  235.         }
  236.     } while (dsp_**_old != dsp_**);
  237.     return result;
  238. }
  239. /*******************************************************************************
  240. 函数名称:    u16 lks08x_dsp_sqrt(u32 val)
  241. 功能描述:    使用08x的DSP开平凡
  242. 输入参数:    u32 val 被开方数
  243. 其它说明:
  244. 修改日期      版本号          修改人            修改内容
  245. -----------------------------------------------------------------------------
  246. 2022.03.10    V1.0           YangZJ            创建
  247. *******************************************************************************/
  248. u16 lks08x_dsp_sqrt(u32 val)
  249. {
  250.     u16 result;
  251.     u8 dsp_**_old;
  252.     do
  253.     {
  254.         dsp_**++;
  255.         dsp_**_old = dsp_**;
  256.         SYS_SoftResetModule(SYS_Module_DSP);
  257.         DSP_RAD = val;
  258.         result = DSP_SQRT;
  259.     } while (dsp_**_old != dsp_**);
  260.     return result;
  261. }

游客,如果您要查看本帖隐藏内容请回复
tpgf 发表于 2023-8-10 16:29 | 显示全部楼层
请问什么叫做协处理器模式  与协处理模式相对应的是什么模式呢
八层楼 发表于 2023-8-10 17:20 | 显示全部楼层
协处理器,这是一种协助中央处理器完成其无法执行或执行效率、效果低下的处理工作而开发和应用的处理器
观海 发表于 2023-8-10 17:46 | 显示全部楼层
由于现在的计算机中,整数运算器与浮点运算器已经集成在一起,因此浮点处理器已经不算是辅助处理器
guanjiaer 发表于 2023-8-10 18:00 | 显示全部楼层
协处理器可以附属于ARM处理器。一个协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。一个或多个协处理器可以通过协处理器接口与ARM内核相连  。
heimaojingzhang 发表于 2023-8-10 18:18 | 显示全部楼层
协处理器可以通过一组专门的、提供load-store类型接口的ARM指令来访问。例如协处理器15(CP15),ARM处理器使用协处理器15的寄存器来控制cache、TCM和存储器管理。
keaibukelian 发表于 2023-8-11 09:09 | 显示全部楼层
协处理器co-processor:顾名思义,协助主处理器完成计算处理的工作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

287

主题

2525

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部