如果不打印,数组的数据将被更改

我正在eclipse上编写一个C程序,以通过I2C中的我的ARM Cortex M4-F微控制器与其另一个主MCU进行通信。
在我的I2C库中,我使用一个静态全局变量来存储通信的所有参数(地址,长度,数据缓冲区)。问题是,即使在执行代码之前(发生中断条件(I2C总线上的从站地址后面跟着从站地址))发生中断时,该变量的一部分(包含要传输的数据的数组,均为8位整数)也会被修改。我把处理程序。无论初始值是多少,它都会被赋值为8。
我试图将断点基本上放置在所有位置,并在变量上放置一个观察点,这种变化似乎从无处发生,而不是在while循环中,并且在调用my_I2C_Handler()之前发生,因此中断显然是原因。
我还尝试将变量设置为volatile,但这并没有改变。
我注意到了一件有趣的事情:在my_I2C_Init()或my_SlaveAsync()期间放入数组数据的printf,就像这样:

printf("%d\n",req.tx_data[0]);

可解决此问题,但是为什么呢?我想在调试后删除所有打印件。

#include <stdint.h>
#include "my_i2c.h"

void I2C1_IRQHandler(void)
{
    printf("\nI2C Interrupt\n");
    my_I2C_Handler(MXC_I2C1);    // MXC_I2C1 is a macro for the registry used
}

int main(void)
{
    int error = 0;
    printf("\nStarting I2C debugging\n");

    // Setup the I2C
    my_I2C_Shutdown(MXC_I2C1);
    my_I2C_Init(MXC_I2C1);

    NVIC_EnableIRQ(I2C1_IRQn);    // Enable interrupt
    my_I2C_SlaveAsync(MXC_I2C1);  // Prepare to receive communication

    while (1)
    {
        LED_On(0);
        LED_Off(0);
    }
    printf("\nDone testing\n");
    return 0;
}

包含通信参数的请求的结构如下:

typedef struct i2c_req i2c_req_t;
struct i2c_req {
    uint8_t addr;                       // I2C 7-bit Address
    unsigned tx_len;                    // Length of tx data
    unsigned rx_len;                    // Length of rx
    unsigned tx_num;                    // Number of tx bytes sent
    unsigned rx_num;                    // Number of rx bytes sent
    uint8_t *tx_data;                   // Data for mater write/slave read
    uint8_t *rx_data;                   // Data for master read/slave write
};

在文件开头声明为:

static i2c_req_t req;

并在my_I2C_Init()中以这种方式分配:

uint8_t rx[1] = {0};
uint8_t tx[1] = {12};

req.addr        = 0xAA;
req.tx_data     = tx;
req.tx_len      = 1;
req.rx_data     = rx;
req.rx_len      = 1;
req.tx_num      = 0;
req.rx_num      = 0;

非常感谢您的帮助

ycit_wdrangers 回答:如果不打印,数组的数据将被更改

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3059017.html

大家都在问