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.

[参考译文] MSP430FR2355:代码锁定开发板

Guru**** 2514375 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1131174/msp430fr2355-code-locking-up-development-board

器件型号:MSP430FR2355

早上好...

我有一个 MSP430FR2355开发板连接到通过 I2C 进行通信的 CO2传感器。  我将通过 UART 从 PC 发送命令来读取和写入传感器、以及其他一些命令来执行各种操作。  Main 休眠、直到接收到 UART 命令、然后相应地对其进行解析和处理。  接收到传入消息后、我执行的第一个命令是释放动态存储器、并在传入消息中为每个请求分配存储器长度(最多一个字节)。

我注意到(非常随机)、如果我在一段时间内(也是随机)读取/写入、那么电路板就会砖型并停止运行、我必须将其断电并重新为其供电。   整个应用程序由传入的 mssgs.....触发 在接收到 mssg 后、我在主程序的前端放置了一个一秒的看门狗、并在所有处理完成后重新启用 UART 上的 RX 之前启动看门狗。  我定期看到看门狗过期(根据 LED)。  这似乎是在对命令进行了长时间访问之后出现的、这意味着我不会在某种程度上释放动态存储器或这种性质的存储器。

我的代码很长、所以我将分享我希望相关的位。  这些都是内存和看门狗部分的分配。   

作为最后的说明(我不太熟悉动态存储器) 我在调试时注意到,每次执行 rcv UART 命令和释放内存并重新分配传入消息时,指针似乎不指向同一位置,而是每次都指向一个递增的位置...这是个问题吗??

谢谢

uint8_t *pI2CStream, command, temp;
__vo uint8_t mssgLength = 0, dataToSendUser = 0, noOfNacks = 0;

        if (ISR.UARTmssgRcvdFlag)
        {
            WDTCTL = WDT_ARST_1000;  //main has 1 second to process or else a reset occurs
            TimerCC_Delay(TIMER0, CC_ONE, ONE_SECOND - 2);

            free(pI2CStream);
            applicationUART.pSysCommsA->UCAxIE &= ~UCRXIE;
            TimerCC_Disable(TIMER0, CC_ZERO);
            pI2CStream = malloc(mssgLength);

#pragma vector=USCI_A1_VECTOR
__interrupt void COMM_ISR(void)
{
    switch(__even_in_range(UCA1IV, USCI_UART_UCTXCPTIFG))
    {
      case USCI_NONE: break;
      case USCI_UART_UCRXIFG:
          buffer[mssgLength] = UCA1RXBUF;
          mssgLength++;
          if (monitor == 0)
              TimerCC_Delay(TIMER0, CC_ZERO, ONE_SECOND);

          monitor = 1;
          if (UCA1RXBUF == 0x0D)
          {
              mssgLength--;
              ISR.UARTmssgRcvdFlag = T;
              LPM3_EXIT;
          }
          break;

        if (ISR.I2CComplete)
        {
            /*
             * house-keeping
             *
             */
            dataToSendUser = (*(pI2CStream));
            ISR.I2CComplete = F;
            noOfNacks = 0;
            memset((void *)buffer, 0, sizeof(buffer));
            mssgLength = 0;
            monitor = 0; //re-arm timeout counter
            i2c_cnt = 0;
            WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
            applicationUART.pSysCommsA->UCAxIFG &= ~UCRXIFG;
            applicationUART.pSysCommsA->UCAxIE |= UCRXIE;
            if (i2cstate == I2CRESTART)
                Mutex.UART_tx = T;
        }

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

    您好、Steve、

    在 MSP430和其他小型嵌入式控制器上使用动态内存分配并不是很常见、因此我不推荐使用它。  

    查看此主题中的一些资源可能会有所帮助: https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/690201/ccs-msp430f5529-how-to-write-on-heap-on-msp430/2543688#2543688

    [~用户名="393571" URL"支持/微控制器/MSP-low 功耗微控制器组/msp430/f/MSP-low 功耗微控制器论坛/1131174/msp430fr2355-code-locking-up-development -board"]

    我注意到(非常随机)、如果我在一段时间内(也是随机)读取/写入、那么电路板就会砖型并停止运行、我必须将其断电并重新为其供电。   整个应用程序由传入的 mssgs.....触发 在接收到 mssg 后、我在主程序的前端放置了一个一秒的看门狗、并在所有处理完成后重新启用 UART 上的 RX 之前启动看门狗。  我定期看到看门狗过期(根据 LED)。  这似乎是在对命令进行了长时间访问之后出现的、这意味着我不会在某种程度上释放动态存储器或这种性质的存储器。

    [/报价]

    如果 您通过 UART 更快地写入数据、那么这是否会更快地失败?  您的堆大小设置为什么? 这将位于 Project Properties -> MSP430 Linker -> Basic Options 下。 我认为 MSP430FR2355的默认值为160字节(不是特别大)。

    此致、
    Brandon Fisher