本帖最后由 cry1109 于 2020-4-26 13:55 编辑
跑裸机时,128kB的flash分区情况:BOOT区48k,USB-HOST只配置为MSC类+fatfs,对U盘进行读写操作用于U盘IAP;APP区80k,USB-HOST配置为Supporting ALL Classes+fatfs,用于U盘读写+HID设备通讯。系统很稳定并没有出现异常。 上了FreeRTOS后,采用相同的分区情况相同的外设配置,BOOT还是采用之前的BOOT程序,没有任何改变,就是在APP里跑了FreeRTOS。问题来了,只要在FreeRTOS任务里调用f_mount()、f_open()等操作U盘的函数,程序从BOOT跳转至APP后立刻飞了,开的看门狗都无法复位,而且也没进入Error_Handler(),由于程序有个跳转的动作没法用仿真器追踪,不知道程序飞到哪儿去了。把任务里的f_mount()、f_open()这些函数屏蔽掉,程序跳转后可以正常运行,难道是fatfs操作U盘时需要的堆栈较大?调大U盘任务堆栈后问题并未解决,甚至把任务堆栈调到了5120 words还是不行。增大任务堆栈不行,那我增大单片机的系统堆栈可以吗?在启动文件里把Stack_Size和Heap_Size增加到0x2000,问题依然没能解决。好吧,那我不分区了,直接把APP下载到0x08000000起始地址,板子上的小小LED终于闪烁了起来。 问题就出现在分区上,不确定是由于BOOT里对USB和fatfs的配置引起APP程序跑飞的或者是因为分区导致内存不足引起跑飞的。后来将BOOT重新分区,由原来的48k减小为36k,这样留给APP的内存由原来的80k增加到92k,OK,终于能够正常运行了。具体原因不知道为什么,猜测是由于FreeRTOS+fatfs需要的堆栈较大,导致内存溢出。
|