Static Stm32非静态阵列已损坏
在stm32固件中,我声明非静态阵列:Static Stm32非静态阵列已损坏,static,stm32,Static,Stm32,在stm32固件中,我声明非静态阵列: uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 }; 当我用这个数组作为参数调用函数时,它会被破坏(填充了另一个数据)。调试时,我观察到该数组位于地址0x20007fc8。RAM大小从0x20000000到0x20008000。因此,此数组被放置在堆栈中并被损坏 如果我将此数组声明为静态,则不会发生这种情况。在本例中,编译器将其数组放置在地址0x20000234处 那个么什么是数
uint8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
当我用这个数组作为参数调用函数时,它会被破坏(填充了另一个数据)。调试时,我观察到该数组位于地址0x20007fc8
。RAM大小从0x20000000
到0x20008000
。因此,此数组被放置在堆栈中并被损坏
如果我将此数组声明为静态
,则不会发生这种情况。在本例中,编译器将其数组放置在地址0x20000234
处
那个么什么是数组损坏的问题呢?即使我将数组声明为非静态数组,也不应该发生这种情况
如果我将此数组声明为静态数组,则不会发生his
当我用这个数组作为参数调用函数时,它会被破坏(填充了另一个数据)
我想你的代码是这样的
int another_function(int8_t *array){
//Your routine with array
}
int yourfunction(){
int8_t bufCan[8] = {0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
another_function(bufCan);
}
所以,当您访问另一个_函数中的数组时,您会发现它已损坏。但将此数组声明为静态可以解决问题。因此,我们可以假设问题与堆栈有关
可能发生的事情很少,首先是动态内存分配,让我假设在调用另一个函数之前,或者在另一个函数体中,您已经使用了动态内存分配程序malloc()。这可能导致堆栈损坏
另一种选择是,您已经向堆栈上的另一个数组写入了某些内容,并越过了它的边界,从而再次导致数组损坏
如果你能用代码更新你的帖子,我可以提供更详细的答案。你设置了合适的堆栈大小吗?您能显示链接器脚本和启动代码吗?一小段代码来演示这个问题也很好。我认为了解您使用的编译器也很重要。如果您声明它是静态的,它将不再在堆栈上分配。这可能指向您在数组超出范围后使用它。或者,另一段代码正在破坏该内存位置的堆栈。