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.

[参考译文] CCS/MSP430FR5949:调试器卡在函数调用上

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/604978/ccs-msp430fr5949-debugger-stuck-on-function-call

器件型号:MSP430FR5949

工具/软件:Code Composer Studio

您好!

我将开始为 MSP430FR5949开发一个相当简单的代码。 我首先创建一些函数库、然后创建主文件。 在从其他项目导入一些基本配置(我仍然不太清楚)之后、我调用一些函数来配置 RTC 电流时间、i2c 引脚等 东西是:MSP 在调用这些函数中的任何一个时停止。 我在调用任何函数时以及在每个函数的第一行上都放置了断点、并意识到 MSP 似乎调用了该函数、但不执行函数的第一行、而是转到某个 esse。 当我暂停执行时、大部分时间它在 ZI_FUNCTION 上、停留在循环中的最后一行。 我无法理解为什么它无法正确调用任何函数。

代码:

#include 
#include 
#include 
#include "serial.h"
#include "serialalelo.h"
#include "i2c.h"
#include "controlador.h"

volatile uint16_t CONT_TIMEOUT_Rx;
volatile uint16_t IND_rx0、IND_rx1、CONT_rx0、CONT_rx1;
volatile uint8_t UART = 1;
volatile uint8_t rx0_buffer[TMN_buffer_rx0]、rx1_buffer[TMN_buffer_rx1];
// RTC
uint8_t CURRENT_TIME[6]={0、0、0、0、0、0、0};
// I2C 变量
volatile uint16_t i_controlpragma

(#t_set =.TI.noinit"


) volatile uintnatile uint16_t rure_time_time_controlpragma (#t_set =#t.controluintnature_time_time_time_time_time_time_controlpragma = 0);//
void #pragma SET_DATA_SECTION ()

#pragma vector = TIMER0_A0_VECTOR
_中断 void Timer_A (void)
{
 if (counter_plan)
  counter_plan -;
 if (i2c_timeout)
  i2c_timeout-;
}

// 计时器 B0
#pragma vector = TIMER0_B0_MODE_SIMPLE_TRIPE
_(void

  



  

 ) TI_TRIP_0_TRIPE = TI_TRIPE = TIVECT_U0 (void)~~UCCTRIP_0_0_TRIPE = TI_0_TRIPE = TIVECU0_0_TRIPE +(void)                      //清除中断
 rx0_buffer[ind_rx0]=UCA0RXBUF;
 ind_rx0++;
 if (ind_buffer_rx0)
  ind_rx0;
 cont_timeout_rx=0;      // limpa cont_time_rx
}
// UART 1
#pragma vector = tid_rx1
  

 ~;                     
 
 
 
    
 


 

// rtc1 = rn_unif_rx1 = n_r1;// rtc1 = rn_r1 = n_r= r1 inu1 = u1;// rtc1 = r1 r1 inu_r= r1 r1 r1 = u1 = u_r1 = u1 r1 r1 = u1 = u1;// rtc1 = u1 r1 r1 r1 = u1 in1 r1 r1 r1 r1 r1 r1 r1 r= u1 = u1 = u1 = u1 = u1 inu1 = u1 = u1 = u1;// r1 r
                    //停止 RTC 日历
 RTCYEAR = CURRENT_TIME[2];          //年
 RTCMON = CURRENT_TIME[1];              //月
 RTCDAY = CURRENT_TIME[0];              //天
 //RTCDOW = 0x01;              //周中某天= 0x01 =星期一
 RTCHOUR = CURRENT_TIME[3];          //小时 RTCCOW = 0x01;//
               当前
            
 时间= RTCCW[RTCC0]/分钟~;//当前时间= RTCCTLCHRN = 4秒;//当前时间= RTCCW[RTCCTE]           //开始 RTC 日历模式
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void get_time (void)
{
 while (!(RTCCTL01和 RTCRDY));
 current_time[2]= RTCYEAR;          //年
 Current_time[1]= RTCMON;           //月
 Current_time[0]= RTCDAY;           //天
 // RTCDOW = 0x01;                 //周中的一天= RTCMOUR = 0x4[MINUAR]
           
            =当前时间
 ;//当前时间= RTCDOW[RTC0]/分钟= RTCDOW]= 0x4小时;//当前时间= RTCDOW[RTC000_TIME]= RTC000[RTC000_TIME]= RTCDOW/分钟            //秒
}


int main (void)
{
 WDTCTL = WDTPW + WDTHOLD;//停止 WDT
 PM5CTL0 &=~LOCKLPM5;
 // FRAM Configuração
 //FRCTL0_H = 0xA5;  //解锁 FRAM 寄存器
 //FRCTL0_L = NWAITS0;
 // FCLK =
 
 0xCSCL0                                       
 ;//解锁 FCL0 = 0xCTR0;// FCL0 = 0xCTRL0 = 0xC0;// FCL0 = 0xCTRL0 = 0xCTRL0;// TCL0 = 0xCTRL0 = 0xCTRL0                           //将 DCO 设置为8MHz
 CSCTL2 = SELA_LFXTCLK | SELM_DCOCLK | SELM_DCOCLK;  // ACLK = SMCLK = DCO
 CSCTL3 = DIVA_1 | DIVM_1;                  // f (CLK
 )= MCLK = DCO CSCTL3 = DIVA_1;// f                                          (CLK = DIV1/ f)寄存器;// f (CLK = MCLK = MCLK = 1)/ f (CLK = MCLK);/ f (CLK = 1)
 -/
 * Px.7 Px.6 Px.5 Px.4 Px.3 Px.2 Px.1 Px.0   */
 PJDIR = 0b00000000;
 P1DIR = 0b00000000;
 P2DIR = 0b00000000;
 P3DIR = 0b00000000;

 // TimerA 配置
 TA0CC0 = 0CCTR0     ;中断= 0CCTR0;/中断= 0CCTRCTRC500;中断= 0CCTRCCTR0 = 0CCTRCTR0;中断= 0CCTRCAP
          // Timer A 计数直到12500 (12500 = 100ms)
 TA0CTL = tassel_2 | MC_1 | ID_3; // SMCLK、向上计数模式、TCLK/8
 TA0EX0 |= TAIDEX_7;        // TCLK/8


 // TimerB 配置
 TB0CCTL0 = CCIE;/ TBR0
 
 
 = TB0 + TBTR0;// TBR0 = TB0 = TB0 + TB0;/ TBTR0 = TB0 + TR0 ~ //引脚 P2.0 e P2.1作为 UART
 P2SEL1 |= BIT0 + BIT1;//引脚 P2.0 e P2.1作为 UART
 UCA0CTLW0 = UCSWRST;                     //将 eUSCI 置于复位
 UCA0CTLW0 |= UCSSLW_SMCLK;              // BRCLK = SMCLK UCS0CTK;// UCABR0
                             = UCC016
 
 | UCABR0 = UCABR0 | UCA0BR0 = UCA9600/ UCCR0 = UCA0 | UCABR0 = UCA0BR0
 ~                    //初始化 eUSCI
 UCA0IE |= UCRXIE;                        //启用 USCI_A1 RX 中断
 //---
 // UART1配置
 P2SEL0 &=~(BIT5 + BIT6);//引脚 P2.5 e P2.6作为 UART
 引脚 P2SEL1 |= BIT5 + BIT6;//UCS2.5 eUCSST_ UCT0
 = UCSLW1                     复位
               // BRCLK = SMCLK
 UCA1BR0 = 52;                            // int (BRCLK/16/9600)
 UCA1BR1 = 0x00;
 UCA1MCTLW |= UCOS16 | UCBRF_1;
 UCA1CTLW0 &=~                   
                         
 
 ~ UCSWRST;//初始化 eUSCI UCA1IE |= UCBRF_1;= UCA1CTJPJUSCI_4 + UCCTR1;//使能
 
 寄存器 UCCTR1 + BJPJTR1;// UCCTR1 = UCI_4 + UCCTR1 + UCI_4 + UCCTR1;// BTR1 = UCI_4 + BTR1   // Habilit性 interrupção GLOBAL_TIME[0]
 = 17;
 CURRENT_TIME[1]= 1;
 CURRENT_TIME[2]= 16;
 CURRENT_TIME[3]= 19;
 CURRENT_TIME[4]= 55;
 CURRENT_TIME[5]= 00;

 SET_TIME (); //它通常在此处停止执行
 i2c_init ();
 serialparalelo_init (); 

代码打开...

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

    尊敬的 Marco:

    我在 ZI_FUNCTION 中拥有的唯一信息:

    显然、您不应该卡在这个环路中。  尝试减少您的代码、直到它进入工作状态、然后添加功能、直到它再次中断。  您可以使用此信息进一步调试当前的特定问题。  例如,代码的这个简化版本可以正确访问 set_time()函数。

    #include 
    #include 
    #include 
    #include 
    
    volatile uint16_t cont_timeout_Rx;
    volatile uint16_t ind_rx0、ind_rx1、cont_rx0、cont_rx1;
    volatile uint8_t UART = 1;
    volatile uint8_t TMN_buffer_rx0 = 128、TMN_buffer_rx1 = 128;
    volatile uint8_t rx0_init[128]、rx1_buffer[128];
    // RTC
    uint8_t CURRENT_TIME[6]={0、0、0、0、0、0、0、0、0、0_volatile
    
    uinta/uint_duart
    
    =/uintnatile r.t
    COUNTER = 16;/uintuint_time_time_time_time_time_time_time_time_time_time_time_time";// volatile uinta/uintuintuinta/uint
    void #pragma SET_DATA_SECTION ()
    
    #pragma vector = TIMER0_A0_VECTOR
    _中断 void Timer_A (void)
    {
    if (counter_plan)
    counter_plan -;
    if (i2c_timeout)
    i2c_timeout-;
    }
    
    //计时器 B0
    #pragma vector = TIMER0_B0_MODE_SIMPLE_TRIPE
    _(void
    
    
    
    
    
    
    
    ) TI_TRIP_0_TRIPE = TI_TRIPE = TIVECT_U0 (void)~~UCCTRIP_0_0_TRIPE = TI_0_TRIPE = TIVECU0_0_TRIPE +(void) //清除中断
    rx0_buff[ind_rx0]=UCA0RXBUF;
    ind_rx0++;
    if (ind_rx0==TMN_buffer_rx0)
    ind_rx0=0;
    cont_timeout_rx=0; // limpa o cont_time_Rx
    }
    // UART 1
    #pragma vector = USCI_A1_vector
    __interrupt void USCI_A1_ISR (void)//USB
    {
    UCA1IFG &=~ UCRXIFG; //清除中断
    rx1_buffer[ind_rx1]= UCA1RXBUF;
    ind_rx1++;
    if (ind_rx1=TMN_buffer_rx1)
    IND_rx1=0;
    CONT_TIMEOUT_Rx=0;
    }//
    
    函数
    void SET_TIME()
    {
    RTCCTL01 |= RTCHOLD; //停止 RTC 日历
    RTCYEAR = CURRENT_TIME[2]; //年
    RTCMON = CURRENT_TIME[1]; //月
    RTCDAY = CURRENT_TIME[0]; //天
    //RTCDOW = 0x01; //周中某天= 0x01 =星期一
    RTCHOUR = CURRENT_TIME[3]; //小时
    RTCMIN = CURRENT_TIME[4]; //分钟
    RTCSEC = CURRENT_TIME[5]; //秒
    RTCCTL01 &=~(RTCHOLD); //开始 RTC 日历模式
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void get_time (void)
    {
    while (!(RTCCTL01和 RTCRDY));
    current_time[2]= RTCYEAR; //年
    CURRENT_TIME[1]= RTCMON; //月
    CURRENT_TIME[0]= RTCDAY; //天
    // RTCDOW = 0x01; //周中某天= 0x01 =星期一
    CURRENT_TIME[3]= RTCHOUR; //小时
    CURRENT_TIME[4]= RTCMIN; //分钟
    CURRENT_TIME[5]= RTCSEC; //秒
    }
    
    int main (void)
    {
    WDTCTL = WDTPW + WDTHOLD;//停止 WDT
    PM5CTL0 &=~LOCKLPM5;
    // FRAM Configuração
    //FRCTL0_H = 0xA5;//解锁 FRAM 寄存器
    //FRCTL0_L = NWAITS0;
    //FRCTL0_H = 0;
    //时钟配置
    CSCTL0_H = 0xA5; //解锁时钟寄存器
    CSCTL1 = DCOFSEL_3 | DCORSEL; //将 DCO 设置为8MHz
    CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;// ACLK = SMCLK = MCLK = DCO
    CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // f (ACLK)/1;f (SMCLK)/1;f (MCLK)/1
    CSCTL0_H = 0; //锁定 CS 寄存器
    //--
    /* Px.7 Px.6 Px.5 Px.4 Px.3 Px.2 Px.1 Px.0 *
    PJDIR = 0b00000000;
    P1DIR = 0b00000000;
    P2DIR = 0b00000000;
    P3DIR = 0b00000000;
    
    // TimerA 配置
    TA0CCTL0 = CCIE | CAP; // TACCR0中断被启用、比较模式
    TA0CCR0 = 12500; // Timer A 计数直到12500 (12500 = 100ms)
    TA0CTL = tassel_2 | MC_1 | ID_3;// SMCLK、向上计数模式、TCLK/8
    TA0EX0 |= TAIDEX_7; // TCLK/8
    
    
    // TimerB 配置
    TB0CCTL0 = CCIE;// TBCCR0中断被使能
    TB0CTL=MC_0;
    // UART0配置
    P2SEL0 &=~(BIT0 + BIT1);//引脚 P2.0 e P2.1作为 UART
    P2SEL1 |= BIT0 + BIT1;//引脚 P2.0 e P2.1作为 UART
    UCA0CTLW0 = UCSWRST; //将 eUSCI 置于复位状态
    UCA0CTLW0 |= UCSSEL_SMCLK; // BRCLK = SMCLK
    UCA0BR0 = 52; // int (BRCLK/16/9600)
    UCA0BR1 = 0x00;
    UCA0MCTLW |= UCOS16 | UCBRF_1;
    UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
    UCA0IE |= UCRXIE; //启用 USCI_A1 RX 中断
    //--
    // UART1配置
    P2SEL0 &=~(BIT5 + BIT6);//引脚 P2.5 e P2.6作为 UART
    P2SEL1 |= BIT5 + BIT6;//引脚 P2.5 e P2.6作为 UART
    UCA1CTLW0 = UCSWRST; //将 eUSCI 置于复位状态
    UCA1CTLW0 |= UCSSEL_SMCLK; // BRCLK = SMCLK
    UCA1BR0 = 52; // int (BRCLK/16/9600)
    UCA1BR1 = 0x00;
    UCA1MCTLW |= UCOS16 | UCBRF_1;
    UCA1CTLW0 &=~UCSWRST; //初始化 eUSCI
    UCA1IE |= UCRXIE; //启用 USCI_A1 RX 中断
    //RTC 配置
    PJSEL1 &=~(BIT4 + BIT5);
    PJSEL0 |= BIT4 + BIT5;
    _bis_SR_register (GIE);// Habilit性 interrupção 全局
    CURRENT_TIME[0]= 17;
    CURRENT_TIME[1]= 1;
    CURRENT_TIME[2]= 16;
    CURRENT_TIME[3]= 19;
    CURRENT_TIME[4]= 55;
    CURRENT_TIME[5]= 00;
    
    set_time();//它通常在此处停止执行
    } 

    此致、Ryan

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

    感谢您快速回答 Ryan。

    我的工作伙伴完全按照您的建议进行了操作、她跟踪了 Controlle 结构的错误。 似乎每当我们为 Controlle 的变量或其变量分配任何值时,程序就会在 main 代码中的第一个函数处停止(在本例中为 set_time())。 有趣的是:即使我们在代码底部为其中一个变量分配了一个值、它也会卡住。

    编辑:

    布置两个结构:

    typedef 结构
    {
    // unsigned int nugepos;
    uint16_t nestagios;
    uint16_t Estado;
    unsigned char nome[SIZENAME];
    uint8_t flag_agendagamento;
    uint8_t ano_esp、ms_esp、dia_esp、hora_esp、min_esp;
    uint8_t hora_ini、minuto_ini、segundo_ini、dow;
    Grupo estagios[NMAXPSTAG ][NMAXPGRPS];
    uint16_t duracao[NMAXPSTAG ];
    uint16_t defasagem;
    }Plano; 
    typedef struct
    {
    uint8_t nugepos;
    uint8_t conflitos[15];
    uint8_t nplanos;
    uint8_t Estado;
    uint8_t erro;
    Plano Planos[10];
    }控制; 

    我们设法通过将 Planos 矢量的数量减少到4来使代码运行、但我们不确定原因。

    现在、唯一的问题是所使用的内存量可能太大。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴听到这个问题已被局限于可变任务。 如果阵列内存超出允许的范围、我本来会遇到编译器错误、但您可以进一步调查映射文件以验证内存内容。 这也可能是堆栈溢出问题、因为该问题在函数调用期间发生。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。
    我们将大多数变量(包括结构)移动到 FRAM 存储器中、程序正在运行。
    我只能认为这是一个堆栈过载问题。

    此致、
    Marco