STM32F429同时使用LTDC和外部SDRAM作堆栈导致HardFault死机

最近在研究STM32F429的LTDC驱动LCD和emWin运行DEMO时候,发现程序总是异常死机,DEBUG发现是进入了HardFault!查看堆栈数据发现数据异常,难道是程序有BUG导致堆栈被破坏了吗?

于是新建一个最小工程,使用最精简的代码,只创建一个GUI线程跑emWin的DEMO程序,发现还是会不定时死机!难道是GUI线程的堆栈设置太小了吗?

于是加大GUI任务的堆栈,由8K增加到16K,故障依旧!!!不应该啊,难道是我的RTOS有问题吗?

于是去掉RTOS,修改emWin的配置文件,改为裸机运行,跑了一段时间,竟然不死机了!WTF!!!

于是又单独测试RTOS,去掉GUI任务反复测试,运行非常正常,各种测试代码都没有问题啊!!!

到底是怎么回事呢,为什么GUI和RTOS同时使用就会死机呢?

对比两份代码,区别就是使用RTOS的时候,把外部SDRAM用作了任务堆栈,而裸机程序使用的是内部RAM做堆栈。

于是把RTOS的任务堆栈设置为内部RAM,结果程序运行正常了! 真是奇怪,难道STM32F429的SDRAM不能作堆栈吗?

不对,不对,不对,在移植GUI之前一直都是用外部SDRAM作任务堆栈,从来没有出现过这种死机的问题啊,难道是LTDC的问题吗?

于是又恢复刚才的代码,继续使用外部SDRAM作堆栈,但是去掉LTDC的初始化代码,再次运行程序,屏幕虽然没有任何显示,但是从板子上的不断闪烁的LED来看,程序并没有死机,继续观察10多分钟,也没有死机.

我的天!!!这是为何???

在启用LTDC之后,使用外部SDRAM用作堆栈会导致程序异常死机,至今没有找到原因。


你可能感兴趣的:(学习笔记)