浏览代码

[libcpu][C28x] Fix bugs of old c28x interrupt api which can not save and restore int status

In C28x DSP, interrupt status are stored in ST1 register. Both INTM and DBGM is used for masking interrupt, while the latter one is used in real-time debug mode. The origin function rudely enable and disable the interrupt without considering the recent interrupt status, which not only may cause  problem in some situation but also is not in conformity with rt-thread design specifications. The new api will fix this bug.
明德无敌赵晓薇 5 年之前
父节点
当前提交
21d32cdb3a
共有 1 个文件被更改,包括 5 次插入2 次删除
  1. 5 2
      libcpu/ti-dsp/c28x/context.s

+ 5 - 2
libcpu/ti-dsp/c28x/context.s

@@ -73,7 +73,9 @@ RT_CTX_RESTORE  .macro
 ;
 ;
     .asmfunc
     .asmfunc
 _rt_hw_interrupt_disable:
 _rt_hw_interrupt_disable:
-    DINT
+    PUSH  ST1
+    SETC  INTM,DBGM
+    MOV   AL, *--SP
     LRETR
     LRETR
     .endasmfunc
     .endasmfunc
 
 
@@ -82,7 +84,8 @@ _rt_hw_interrupt_disable:
 ;
 ;
     .asmfunc
     .asmfunc
 _rt_hw_interrupt_enable:
 _rt_hw_interrupt_enable:
-    EINT
+    MOV   *SP++, AL
+    POP   ST1
     LRETR
     LRETR
     .endasmfunc
     .endasmfunc