This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请问DSP28335的赋值语句,会被中断,所打断吗?



如果赋值语句为赋值一个32位的值,那么是不是有可能在16位赋值完毕的时候,被中断所打断呢?

那么我在main循环中和某个中断中公用一个值的时候,且该值为关键的控制量时,做什么处理会比较安全呢?

  • 个人觉得不会,C2000都是32位系统,单次赋值应该不存在一次赋值16位的说法。除非是用的影子寄存器转换的,那样有可能出现被打断的情况
  • 你好,请看上图,其中driver_par.frq_pwm为16位数,他的汇编的赋值指令是一条(不知道这个是不是原子操作,即不会被中断打断的操作)。

    而driver_par.kpwm = driver_par.u_n 这条指令则是flout变量之间的赋值,包括下面的driver_par.iuvw_coff = 0.001395089286也是flout型变量的赋值,

    这两个语句的汇编指令都为两条以上,我觉得会不会有可能中断会出现在这两条汇编指令之间,如果在中断内有相同的变量进行赋值,不知道会不会导致赋值

    受到影响。

  • 16位数据与32位数据并不是造成差异的原因。
    在driver_par.frq_pwm语句中,是将driver_par.frq_pwm赋值一个常量。赋值常量会被合并到单个汇编指令中。
    在“driver_par.kpwm”里面,你是把它赋值给一个变量,所以需要两句语句配合完成。第一句将分配的值加载到累加器中,第二句将累加器存储到driver_par.kpwm。
    如果两个MOVL指令之间发生中断,则“driver_par.kpwm”的原始值仍将存在,并且在访问时将被使用。即,与两个MOVL指令中的第一个指令之前触发的中断没有区别。但是“driver_par.kpwm”的原始值不会有影响,MOVL是将所有32位数据一起移动的
  • 好的!十分感谢