• 笔记一

我产生的奇怪现象是:外层循环i变量被自动改了值,各种调试后发现,是我不同头文件定义了相同宏MAX_NUM_TASK,各种调试精确定位后发现,是函数内申请了一个50元素的的结构体数组,大约1.5KB,超过了默认的栈大小。

stm32函数内定义了大数组堆栈溢出tft液晶屏幕显示异常_stm32堆栈溢出

当超过了栈大小后,即堆栈溢出,这个编译不会报错,运行时候也不会进硬件中断错误。但是运行时候相当于是把内存分配到了已经用到的变量或者区,就覆盖了,赋值后,就覆盖修改了其他变量的值,导致发生莫名其妙的现象发生,这个问题特别难发现。关于函数运行时候的栈动态变化过程,看我这篇文章C语言函数调用时候内存中栈的动态变化详细分析

可是,在startup_stm32f10x_hd.s文件里,stm32f103默认分配的栈只有1KB,堆也只有512B。所以得修改一下。

stm32函数内定义了大数组堆栈溢出tft液晶屏幕显示异常_stm32堆栈溢出_02

关于问题的详细解释和原理以及修改方法,可以看我曾经写的这篇非常好的文章,嵌入式处理器DCD和SPACE区别,全局变量,局部变量,程序的栈,堆,程序编译结果的占用空间意思,哎,时隔一年,我真遇到这样的问题了,还被折腾了四五个小时,才发现这样的问题。我们把栈0x400(1KB)改为0x2000(8KB,stm32f103ZE有64KB内存ram呢,当然得多用点呀)了,这样就可以了,编译下载后,程序正确运行了。

 

  • 笔记二

#include <stdio.h>
 
int test2(int a[]){
    for(int i=0;i<5;i++){
        printf("%d",a[i]);
    }
}
int main(){
    int a[5] = {1,2,3,4,5},*p;
    p = a;
    test2(a);
    
}

这样是可以数组传递过去的。