溢出?找不到来源,奇怪
overflow? cannot find source, strange
我的项目中有以下两个结构
typedef volatile struct {
unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over UART
uint8_t rx_flag; //Indicates received data over UART
uint8_t rx_length; //length of the input buffer
} UART;
UART *gUART;
typedef volatile struct {
unsigned int target_s[NR_BLDC]; //Target Position in Signals
int distance_s[NR_BLDC]; //Distance between gActual_s[NR_BLDC] and gTarget_s
unsigned int old_s[NR_BLDC]; //Position before starting to new destination
unsigned int ramp_s[NR_BLDC]; //Duration of ramp(accelerate/decelerate) in Signals
unsigned int count_dt[NR_BLDC]; //Actual nr of PWM ISR timer calls
uint8_t dc_max[NR_BLDC]; //Maximal Duty Cycle set to reach the destination
} POSITIONING;
POSITIONING *gPOS;
当我在 *gUART 中写入 rx_flag 或 rx_length 时,它以某种方式更改了 *gPOS 结构中 distance_s[0] 的内容(执行其中一个时发生错误下面代码部分中的两行)。 i 是 uint8_t 类型并且在限制范围内。
gUART->rx_length = i; //set receive byte length
gUART->rx_flag = 1; //Indicate that data ready for use
我不知道这是怎么发生的,因为即使它是溢出,两个结构至少在 bss 部分中被多个字节分隔。
任何tricks/ideas如何找到错误。
提前致谢
由于您没有显示更多代码,我必须做出两个假设:前缀为 g
的变量是全局变量,并且您没有初始化这些指针(即使它们指向任何地方)。
未初始化的全局变量由编译器零初始化。对于指针,这意味着它们被初始化为 NULL
,这意味着两个指针都指向 NULL
。取消引用 NULL
指针会导致 undefined behavior.
在你的具体情况下,你很幸运整个应用程序不会崩溃和燃烧,更具体地说,因为两个指针都指向 NULL
它们都指向相同的内存,这意味着改变一个结构将改变两者。
要么您需要实际使指针指向某处,要么根本不将它们声明为指针。
我的项目中有以下两个结构
typedef volatile struct {
unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over UART
uint8_t rx_flag; //Indicates received data over UART
uint8_t rx_length; //length of the input buffer
} UART;
UART *gUART;
typedef volatile struct {
unsigned int target_s[NR_BLDC]; //Target Position in Signals
int distance_s[NR_BLDC]; //Distance between gActual_s[NR_BLDC] and gTarget_s
unsigned int old_s[NR_BLDC]; //Position before starting to new destination
unsigned int ramp_s[NR_BLDC]; //Duration of ramp(accelerate/decelerate) in Signals
unsigned int count_dt[NR_BLDC]; //Actual nr of PWM ISR timer calls
uint8_t dc_max[NR_BLDC]; //Maximal Duty Cycle set to reach the destination
} POSITIONING;
POSITIONING *gPOS;
当我在 *gUART 中写入 rx_flag 或 rx_length 时,它以某种方式更改了 *gPOS 结构中 distance_s[0] 的内容(执行其中一个时发生错误下面代码部分中的两行)。 i 是 uint8_t 类型并且在限制范围内。
gUART->rx_length = i; //set receive byte length
gUART->rx_flag = 1; //Indicate that data ready for use
我不知道这是怎么发生的,因为即使它是溢出,两个结构至少在 bss 部分中被多个字节分隔。
任何tricks/ideas如何找到错误。
提前致谢
由于您没有显示更多代码,我必须做出两个假设:前缀为 g
的变量是全局变量,并且您没有初始化这些指针(即使它们指向任何地方)。
未初始化的全局变量由编译器零初始化。对于指针,这意味着它们被初始化为 NULL
,这意味着两个指针都指向 NULL
。取消引用 NULL
指针会导致 undefined behavior.
在你的具体情况下,你很幸运整个应用程序不会崩溃和燃烧,更具体地说,因为两个指针都指向 NULL
它们都指向相同的内存,这意味着改变一个结构将改变两者。
要么您需要实际使指针指向某处,要么根本不将它们声明为指针。