c - 如果我不打印它,数组的数据就会改变
问题描述
我正在 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;
非常感谢您的帮助
解决方案
推荐阅读
- textbox - 如何获取所选值以在百里香中输入文本框
- html - HTML .png 模糊
- opencv - cmd中的openCV mingw-32错误
- xml - 方法调用失败,因为 [System.String] 不包含名为“AppendChild”的方法
- ios - PiP AVPlayerViewController 问题 iPhone
- angular - 角度组件 ExpressionChangedAfterItHasBeenCheckedError 中的 Mat 对话框错误
- jenkins - 在 Jenkins 上轮询 SCM 多个存储库
- elasticsearch - 如何将 X.PagedList 与 ElasticSearch Nest 一起使用?
- windows - WINAPI:如何避免根据监视器比例因子缩放窗口?
- python - python多处理谷歌计算引擎