首页 > 解决方案 > 如果我不打印它,数组的数据就会改变

问题描述

我正在 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;

非常感谢您的帮助

标签: cembeddedglobal-variablescortex-m

解决方案


推荐阅读