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.

[参考译文] 编译器/MSP430FR5959:在调试期间、MULT16_F5HW.asm 中的软件中断

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP430FR5959

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/566673/compiler-msp430fr5959-during-debugging-software-breaks-in-mult16_f5hw-asm

器件型号:MSP430FR5959

工具/软件:TI C/C++编译器

调试期间、MULT16_F5HW.asm 中的软件中断。

这意味着什么? 我不知道! 与中断 IM 相关的段

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Gerald Talley"]在调试 MULT16_F5HW.asm[/quot]中的软件中断期间

    您认为什么会导致您认为出现了问题?  您到底是如何看到它的?

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的堆栈是否足够大、能够在更糟糕的堆栈深度中处理中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在任何中断例程中是否有任何乘法代码? 您是否正在使用-disable_interrupts_around_hw_mpy 选项?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="archaeology">您在任何中断例程中是否有任何乘法代码? 您是否正在使用-disable_interrupts_around_hw_mpy 选项?

    [/报价]
    我有一个模量运算。。。 但当我把它取出时。。。 它会导致问题...
    此外、我也看不到该选项设置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我以前从未想过堆栈大小。 从何处开始?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查看构建控制台窗口。 在这里、您将看到每个编译器和链接器调用的完整命令行。

    尝试添加选项--disable_interrupts_around_hw_mpy=on;如果这样可以解决问题,我们可能能够缩小问题的范围。

    通常、链接器命令文件会设置栈的大小。 您可以通过查看.stack 段的链接器映射文件来查看链接器选择的大小。 应该有一个针对堆栈大小的项目属性设置;也许在 Build > MSP Linker > Basic Options 下?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我向编译器标志添加了--disable_interrupts_around_hw_mpy=on。 似乎什么都不做.. 此外、在基本选项下、堆栈大小为160.. 我把它更改为400没有效果。 我一直在使用 MSP430来做各种事情。 我以前从未见过这种情况。 在这个 CPU 上做的不是很多...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还会发现一些其他的东西。。。

    我有一些 ADC 输入... 我多次使用以下代码.. 这些指令需要大约2ms 的时间才能运行... 时间不是问题 CPU 没有太多工作... 但我决定用常量重写。

    current1 =(无符号长整型) getADC (ADC_CS1)* 2500 / 0x0FFF / 6.8;
    current2 =(无符号长整型) getADC (ADC_CS2)* 2500 / 0x0FFF / 6.8;
    电压=(无符号长整型) getADC (ADC_VS)* 2500 / 0x0FFF * 7.8;

    电流1 = getADC (ADC_CS1)* 10 / 111;  
    current2 = getADC (ADC_CS2)* 10 / 111;  
    电压= getADC (ADC_VS)* 14/3;

    某些精度会丢失、但 现在运行该代码需要.75ms。 和代码没有问题。

    接下来、我将其更改为测试。

    电流1 = getADC (ADC_CS1)* 10 / 111;  
    current2 = getADC (ADC_CS2)* 10 / 111;  
    电压= getADC (ADC_VS)* 4.7;

    使用浮点可增加时间.. 我的代码再次在 MULT16_F5HW.asm 中中断..

    当它中断时、它在 NOP 指令处停止。 我仍然不知道这里发生了什么 为什么 CCS 会中断 NOP 指令?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还会发现一些其他的东西。。。

    我有一些 ADC 输入... 我多次使用以下代码.. 这些指令需要大约2ms 的时间才能运行... 时间不是问题 CPU 没有太多工作... 但我决定用常量重写。

    current1 =(无符号长整型) getADC (ADC_CS1)* 2500 / 0x0FFF / 6.8;
    current2 =(无符号长整型) getADC (ADC_CS2)* 2500 / 0x0FFF / 6.8;
    电压=(无符号长整型) getADC (ADC_VS)* 2500 / 0x0FFF * 7.8;

    电流1 = getADC (ADC_CS1)* 10 / 111;  
    current2 = getADC (ADC_CS2)* 10 / 111;  
    电压= getADC (ADC_VS)* 14/3;

    某些精度会丢失、但 现在运行该代码需要.75ms。 和代码没有问题。

    接下来、我将其更改为测试。

    电流1 = getADC (ADC_CS1)* 10 / 111;  
    current2 = getADC (ADC_CS2)* 10 / 111;  
    电压= getADC (ADC_VS)* 4.7;

    使用浮点可增加时间.. 我的代码再次在 MULT16_F5HW.asm 中中断..

    当它中断时、它在 NOP 指令处停止。 我仍然不知道这里发生了什么 为什么 CCS 会中断 NOP 指令?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="George mock"]

    Gerald Talley
    调试期间、MULT16_F5HW.asm 中的软件中断

    您认为什么会导致您认为出现了问题?  您到底是如何看到它的?

    谢谢、此致、

    乔治

    调试代码时停止

    我还会发现一些其他的东西。。。
    我有一些 ADC 输入... 我多次使用以下代码.. 这些指令需要大约2ms 的时间才能运行... 时间不是问题 CPU 没有太多工作... 但我决定用常量重写。
    current1 =(无符号长整型) getADC (ADC_CS1)* 2500 / 0x0FFF / 6.8;
    current2 =(无符号长整型) getADC (ADC_CS2)* 2500 / 0x0FFF / 6.8;
    电压=(无符号长整型) getADC (ADC_VS)* 2500 / 0x0FFF * 7.8;

    电流1 = getADC (ADC_CS1)* 10 / 111;  
    current2 = getADC (ADC_CS2)* 10 / 111;  
    电压= getADC (ADC_VS)* 14/3;
    某些精度会丢失、但 现在运行该代码需要.75ms。 和代码没有问题。
    接下来、我将其更改为测试。
    电流1 = getADC (ADC_CS1)* 10 / 111;  
    current2 = getADC (ADC_CS2)* 10 / 111;  
    电压= getADC (ADC_VS)* 4.7;
    使用浮点可增加时间.. 我的代码再次在 MULT16_F5HW.asm 中中断..
    当它中断时、它在 NOP 指令处停止。 我仍然不知道这里发生了什么 为什么 CCS 会中断 NOP 指令?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果可以的话、你应该避免浮点算术、因为 MSP430没有浮点硬件。 它必须在库代码中模拟浮点算术、这需要额外的时间。 您可能会使看门狗计时器跳闸。 尝试禁用看门狗计时器以查看问题是否仍然存在。

    我不知道 CCS 为什么会中断该 NOP 指令;这可能是实际问题的副作用。

    您提到、此问题似乎与系统中的中断有关。 哪个中断? 您是否有用于此中断的中断处理程序?

    您已经向我们展示了电流和电压的计算;中断例程中是否有以下任何语句?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一个用于通信的中断例程 还有一些用于正交编码器的引脚。 我仍然会遇到此问题、因为此代码已禁用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在您的第一个帖子中、您说问题"似乎与我正在使用的中断有关;"是什么导致您怀疑问题与中断有关? 您仍然认为它可能相关吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="archaeology">在您的第一个帖子中、您说问题"似乎与我正在使用的中断有关;"是什么导致您怀疑问题与中断有关? 您仍然认为它可能相关吗?

    [/报价]
    我做了更多的测试...  我尝试过这么做.. 当我进入通信中断时、我将其设置为高电平、并在结束时将其设置为低电平。 当代码中断时、引脚为低电平。 我对两个中断都执行了此操作... 现在我删除了浮点、该误差不太常见、但我仍然得到它。 此外、如果我断开通信、我似乎不会得到 错误。
    中断发生在该代码处
    _mpyi_f5hw: .asmfunc stack_usage (2 + RETADDRSZ)
     PUSH W SR   ;保存当前中断状态
     Dint    ;禁用中断
     NOP    ;延迟帐户<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 在这里休息
     MOV.W OP1、&MPY_OP1  ;将操作数1加载到乘法器中
     MOV.W OP2、&MPY_OP2  ;加载触发 MPY 的操作数2
     MOV.W 结果、R12  ;将结果移动到返回寄存器中  
    中断恰好在禁用中断之后...但当它暂停时、它看起来不在通信或四路中断中...
    我在数学代码前后以及代码停止时执行了引脚高电平操作、引脚为高电平...
    我不熟悉 CPU 是如何处理 乘法代码的... 当它尝试禁用中断时、是否会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常有趣 此时、我们需要 MSP430硬件专家来研究这个问题。  我认为我们无法在编译器论坛上为您提供更多帮助、因为这是一个硬件问题、我们是编译器专家。  作为一个疯狂的猜测、使用 DINT 会强制 CPU 在禁用中断之前处理一些挂起的中断、这可能会在该 NOP 上出现。

    某些 MSP430器件(如 F5系列)具有硬件乘法硬件、但它不在 CPU 中完成;相反、有一个乘法外设。  通过写入专用存储器映射寄存器、等待适当数量的周期以及从结果寄存器中读取结果来执行乘法。  由于计算乘法运算需要全局状态、因此库会围绕乘法外设的使用创建一个关键区域、以便在乘法外设已经忙线时不会发生中断并执行乘法、这会损坏这两个结果。  因此、在中断和乘法硬件之间进行协调非常重要。  MSP430编译器用户指南第2.3.4节"运行时模型选项"对此进行了简要介绍。

    MSP430编译器用户指南downloads.ti.com/.../

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Gerald、

    您正在使用 MSP430FR5959器件、对吧? 该器件具有 MPY32硬件乘法器模块、因此考古学家在上一篇文章中关于库处理方式的评论应该适用于该器件。

    您的 ISR 中是否有任何一个调用其他函数? 您是否有任何嵌套中断(不建议这么做)、这意味着在 ISR 期间启用中断? 也许您可以共享您的 ISR 代码? 您的乘法在代码中的哪个位置发生?  
     
    此致、
    Katie

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是我的代码。 通信 ISR 有很多工作要做、但速度相当快。 我经常使用该代码。 四路 ISR 实际上是基本的。 当引脚上发生中断时、它会检查另一个引脚并递增或递减计数器。 计时器也很简单... 当我的代码暂停时、我可以看到堆栈吗? 以查看我的堆栈是否溢出? 代码决定中断的原因是什么? 每次我觉得我都换了一些东西,它的工作做得很好 我在这里停留了一会... 我没有在任何 ISR 中执行任何 mult 或 div 函数。 不调用任何函数.. 我找不到碰撞发生的地方

    //计时器
    #pragma vector=Timer1_A1_vector
    _interrupt void Timer1_A3_ISR (void){
    开关(__evo_in_range (TA1IV、14)){
    情况0:
    中断;//无中断
    案例2:
    flag_50ms = 1;
    TA1CCR1 += 20000;
    中断;// CCR1
    案例4:
    flag_250ms = 1;
    TA1CCR2 = 100000;
    中断;// CCR2
    案例6:
    中断;//保留
    案例8:
    中断;//保留
    案例10:
    中断;//保留
    情况12:
    中断;//保留
    案例14:
    中断;//溢出
    默认值:
    中断;



    //quad
    #pragma vector=Port1_vector
    _interrupt void P1 (void){
    IF (P1IFG & BIT0){
    IF (P1IN 和 BIT1)
    国家1-= 100;
    其他
    国家1 +=100;
    }否则、如果(P1IFG 和 BIT2){
    IF (P1IN 和 BIT3)
    国家2-= 100;
    其他
    count2 +=100;

    P1IFG = 0;


    #pragma vector=USCI_A0_Vector
    _interrupt void USCI_A0_ISR (void){

    开关(_evo_in_range (UCA0IV、18)){
    情况0://vector 0无中断
    中断;
    案例2://vector 2 UCRXIFG
    如果((UCA0STATW 和 UCADDR)== 2){
    RX_ST态= 1;
    UCA0CTL1 |= UCDORM;//仅接收地址位数据

    开关(Rx_state){
    案例1:
    RX_ADDRESS = UCA0RXBUF;
    RX_address2 = 0;
    xaddress = 0;
    if (rx_address =(camera1X_gc_adr + thisAddress)){
    UCA0CTL1 &=~UCDORM;
    RX_ST态= 2;
    }否则、如果(Rx_address = camera_gc_adr){
    UCA0CTL1 &=~UCDORM;
    RX_ST态= 3;
    }否则、如果(rx_address == cameratilT_gc_adr){
    UCA0CTL1 &=~UCDORM;
    xaddress = DATA_CAM_Tilt;
    转至跳转;

    中断;
    案例2://扩展地址
    RX_address2 = UCA0RXBUF;
    if (rx_address2 & 0x40){
    if (rx_address2 = 0x41){
    LRC = Rx_ADDRESS ^ Rx_ADDRES2;
    RX_ST态= 9;
    SEGI = 0;

    中断;
    }否则、如果(rx_address2 >= 16){
    RX_ST态= 0;
    UCA0CTL1 |= UCDORM;//仅接收地址位数据
    中断;

    跳转:if (data[rx_address2 + xaddress].reg & reg_writeMode){
    RX_ST态= 3;
    }否则{
    unsigned int v;
    v = data[rx_address2 + xaddress].value;
    TX_DATA[0]=(v >> 8);
    TX_DATA[1]= v;
    TX_DATA[2]= TX_DATA[0]^ TX_DATA[1]^ RX_ADDR_ADDRESS ^ RX_ADDRES2;
    TX_ST态= 0;
    UCA0TXBUF = 0x66;
    UCA0CTL1 |= UCDORM;

    中断;
    案例3://MSB
    MSB = UCA0RXBUF;
    RX_STUDE++;
    中断;
    情况4://LSB
    LSB = UCA0RXBUF;
    RX_STUDE++;
    中断;
    案例5://LRC
    LRC = UCA0RXBUF;
    RX_state = 0;//重置 rxstate
    UCA0CTL1 |= UCDORM;//仅接收地址位数据

    if (rx_address == camera_gc_adr){
    如果((rx_address ^ msb ^ lsb)= LRC){//计算 LRC。 如果 LRC !=0,则不保存 CONTRAL_DATA。
    data[data_camera_Control].value = lsb;
    commGood = 1;

    }否则、如果(rx_address ^ rx_address2 ^ msb ^ lsb = LRC){//计算 LRC。 如果 LRC !=0,则不保存 CONTRAL_DATA。
    data[rx_address2 + xaddress].value =(msb << 8)+ lsb;
    commGood = 1;

    中断;
    案例9:{//接收代码源
    SEG[SEGI]= UCA0RXBUF;
    LRC ^= seg[SEGi];
    eofrc[SEGi]^= seg[SEGi];
    SEG++;
    如果(SEGI ==19){
    SEG++;
    如果(LRC = 0){
    if (seg[0]= CODE_Address){//address
    地址=(*((unsigned long*) seg[2]));
    add =(unsigned char*)(地址- 0x8000);
    data[data_Thruster_UpdateStatus].value =((unsigned long) add)& 0x7FFF);
    }否则、如果(seg[0]= CODE_Line){
    unsigned int i;
    对于(I = 0;I < seg[1];I++)
    *add++= seg[i + 2];
    data[data_Thruster_UpdateStatus].value =((unsigned long) add)& 0x7FFF);
    }否则、如果(seg[0]= CODE_EOF){
    unsigned int i;
    DATA[DATA_Thruster_UpdateStatus].value = 0xFFFF;
    对于(i = 2;i <= 17;i++){
    if (eofrc[i]){
    DATA[DATA_Thruster_UpdateStatus].value = 0xFEEE;
    中断;


    }否则、如果(seg[0]= code_deploy){
    if (data[data_Thruster_UpdateStatus].value == 0xFFFF)
    flag_depoy = 1;
    }否则、如果(seg[0]= code_Start){
    unsigned int i;
    对于(I = 0;I < 19;I++)
    eofrc[i]= 0;
    DATA[DATA_Thruster_UpdateStatus].value = 0xFDDD;






    案例4:
    //向量4 UCTXIFG
    中断;
    案例6:
    接收到//起始位

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我已将堆栈增加到400、但仍有问题。 把它降到了80花了很长的时间.. 我想、如果这是一个堆栈问题、使堆栈变得很小、那么会导致堆栈更频繁发生。 看起来不是这样。。。 我甚至不知道在运行时这是否是一个真正的问题... 或者它只是调试问题...。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在编译器选项中有.. RTS mpy 例程的内联硬件乘法版本...
    如果我将其设置为无... 这可以禁用它吗? 计算数学甚至不需要花费更长的时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Gerald、

    此处提供了一些有关尝试识别堆栈溢出或您正在使用的堆栈的信息: processors.wiki.ti.com/.../Stack_and_Heap_size_requirements 。这适用于 CCSv4、但我认为它仍应适用。 CCS 中有一个用于堆栈溢出中断的功能-我想知道默认情况下是否启用了该功能?

    运行这些测试时是否启用了任何其他断点?

    此致、
    Katie

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Gerald、

    您是否仍然遇到此问题? 我们还能做些什么来提供帮助吗?

    此致、
    Katie
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我最后只会禁用硬件乘法器。  我猜只是有太多的重叠中断、 并且正在溢出。  如果数学运算需要更长时间才能运行、则在应用中无关紧要。