。。我有好长一段时间没有写博文了,这是一个学者莫大的悲哀和耻辱。很多东西,你曾经折腾过,不敢说有多好的结果,引发了什么样的反响或是平淡无奇,激荡不起表面的一点波澜,但是,你曾经无论是因为谋生或是兴趣都去研究和应用它,那么只要花了时间和精力,并且过了脑的,我觉得就有必要 留下一些见解和足迹。当然,这些东西我希望是有价值的,有意义的,而不是千篇一律的,应该是有独到之处的,一定是多加思考和有严谨科学思维的。 。。曾经的我在思想上也是随波逐流的,我看问题的角度和方向都是单一的,甚至脱离实际的,而思考的境界也是比较 低的,心里想的只是最终的结果,至于实现的过程如何,我不必关心它,正是这样的思想,渐渐的你会发现,你其实付出的可能比别人更少时间精力,得到了比别人更加好的结果和成就感,然而你可能并没有学到任何东西,甚至在吃老本,那是退步的,不仅仅是行为上的退步,甚至是思想上的,如果你对自己还是有些要求的话,细细思量,那是恐怖、不安和令人难以入眠的。 。。那么此时,你就应该行动起来了,反思、检讨自己,而不是继续沉溺其中,而不自知,“学而不思则罔,思而不学则殆”的亘古真理是有用的。然而,人都是有惰性的,需要刺激和外部激励来提供源源不断的动力的,做一件事情之前,你可能只是随口一说,接着随手一做,激情和需求消磨殆尽之后便把它永久丢弃,“我轻轻的走了,就像我轻轻的来过,我挥了挥衣袖,不带走天边的一片云彩”便是真是的写照。我不希望如此,并且为此不断努力着,希望跳出这样的思维界限而又被约束着,因为约束着才是最正确的真理,没有约束也是不切 实际的。纯纯的思想输出,那是费脑的、极度疲劳的,也是令人讨厌的。 。。好了,说了这么一大堆之后,也仅仅只为指明当前的想法,和一些有价值的点,接下来就来说说正题吧。能来到这里的,都是迫切需要解决问题和有一定基础的,因为精准定位问题的关键也是一种不可多得的技能,下面我将会通过问题,找到最为本质的解决方法,同时我也希望,能给读者看到的是发现问题到解决问题的方式方法和思想,而不是独立的无任何价值的教程和只为参看源码的目的出发。一个好的教程和源码确实能解决不少疑难问题,但最后也仅仅只限于解决特定问题而已,除此之外,你别无所获,甚至无任何地方是自己解决的,可以这么说,而我希望的是,透过现象能够看到本质,从最原始、最简单的地方出发,探索它本质和璞真的规律,并且抽出一套方法去解决一类问题,说白了,就是“授人以鱼不如授人以渔”。 。。我到底是遇到了怎么奇葩的问题呢?上图,看一下:
图一 报错截图。。熟悉的朋友都可以看得出来,那是报错内存溢出了,此时我们百度一下,你会发现千篇一律的都基本会和你说 :芯片SRAM不够用了,最直接方法就是换一块更大内存的芯片或者删除不必要的C文件。不排除这样的可能,比如51单片机RAM可能就几KB,但我使用的是STM32F407,192+4K,那是的多大程序呀,况且只是搭载FreeRTOS,没有GUI,更何况别人都成功了!此时如果不加思索就信了,那么你就没搞头了! 。。于是,我们接着查资料: 各路大佬就是告诉你,可以试一下程序优化,或者使用micro LIB项勾选,甚至勾选use cross-module optimization(跨模块优化),具体参看:
https://blog.csdn.net/xlhcgd/article/details/45875897详细解决说法还可参看:
https://blog.csdn.net/ppdyhappy/article/details/72984780但是这两种方式试了个把小时:结果是无用!编译可能少了几个error,仍然治标不治本啊。 。。好了,接下来我们就要稍微高级点了,去动启动汇编文件 的stack和heap试图减小堆栈的尺寸和堆的尺寸,我们看一下: 具体操作方式请看:
https://blog.csdn.net/sshyidishui/article/details/70779356哎,好激动,编译通过了,貌似没问题,烧到芯片看一下,结果是:别想了,那个会这个容易 ,程序不知卡死那个硬中断了!!! 。。一顿破骂它祖宗十八代,细想,本来出发点就是错的,用的hal库,人家既然底层库都给你设计好了,你去动芯片底层引导,或对才是错的呢!就像很多时候,你会去怀疑,是不是IDE软件有问题?大多数情况可以肯定的是:是你程序有问题!!!通常情况下,软件是经得住考验的,出发就错了。可能使用自己配置寄存器的方式,这种方式也许可行! 。。一顿操作猛如虎,一朝回到解放前,就是我们目前结果,此时我开始想是不是要去搞内存分布了const,idata,xdata,code,显然结果告诉我们:任然不可行! 具体用法请参看:
https://www.cnblogs.com/GL-BBL/archive/2012/08/19/2646408.html https://blog.csdn.net/qq_27747359/article/details/84993056 图二 map图内存使用统计map图使用方法,请参看:
https://blog.csdn.net/qlexcel/article/details/78884379。。折腾了这么长时间,差不多也该出结果了吧,还是得从本质出发,可以肯定的是:SRAM的问题,与Flash无关,那么会不会是内存分配出问题,导致编译器无法划分静态区存储常量呢? 遵循这样的思想,我们考虑malloc和free管理内存,结合思考FreeRTOS是提供了内存管理的heap_4.c文件,加之我使用了原子哥的内存管理文件malloc.c,这一分析问题明显了,肯定是内存分配冲突了!,于是我们去搞内存池,甚至去除自带内存管理文件,此处说明:UCOSIII,时并未出现这个问题!!!
图三 问题解决预览。。好了,仅仅只是把100和60缩减为5,到这里我们的问题终于解决了,可以激动一下下了,哈哈,这样奇葩的问题就分享到这里啦。 详细说法请参看:
https://blog.csdn.net/I_LOVE_MCU/article/details/108920413