早上好...
我有一个 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;
}
