0613——关于MCU的存储空间进一步的学习与探索 FLASH(ROM)/SRAM(RAM)
探索动机
自从我来到乐歌,接手一个走步机手控器项目后,几乎是从0~1的这么个开发过程。
由于这个手控器的MCU是用的MM32F0系列,而公司内大部分产品都是ST的芯片,例如STM32F0,STM32G0等。 所以想要开发出一些功能,得靠自己摸索。然而这是好事,帮助我进一步深入理解MCU开发,学到很多。
首先是MCU业务上的进步,如软件定时器,状态机,循环队列,事件驱动等等。但是过了这座山,后面还有无穷尽的山。
因为之前样品开发时间紧,没有考虑太多,样品通过Jlink来开发调试,烧录等,很多东西都不需要再多去考虑。 只要保证在时间内将样品业务层面上打造到尽可能好就行。 现在样品交付已过,需要进一步完善为成品,电子成品软件必然有个绕不开的问题,就是软件升级。
在样品中,软件刷新都是交给Jlink完成的(ICP),通过电路板上引出的SWD接口,但是产品往往是没有裸板接口条件的,外壳拆来卸去也很麻烦。 故大部分电子产品软件需要引入一个额外的软件,通过已有通信接口和固件来升级自己的固件(IAP),即bootloader程序。
-
铺垫至此,引入写这篇文章的动因
我需要为MM32F0020这个MCU开发bootloader程序,首先需要熟悉它的特性,查看芯片手册可知,它是CortexM0内核的。
而IAP的原理就是在Flash(ROM)中存放两段程序(bootloader程序+app程序),bootloader程序的功能是通过已有通信接口,搬运接收到的上位机(PC)数据到FLASH中指定的APP程序地址。是一个只实现了通信与FLASH读写的简单程序,一般占用较小Flash空间。app程序是该电路板的实际业务功能程序,即正常情况下一直运行的功能程序。
MCU上电时,首先取到在app之前的boot程序的地址,并且开始运行boot程序。boot通过校验app程序段的完整性,来决定是否跳转到app。由于FLASH中存在两段互不相扰的重新,那么程序段的各中断向量表地址也是不同的。
由于CorteM0内核的MCU,不支持跳转程序后重新定向中断向量在Flash中的地址,所以只能将中断向量复制到SRAM中,再指定中断向量表定向到SRAM。
而该MCU的中断向量表为200Byte,糟糕的是它的SRAM只有2K byte,意味着复制到SRAM中需要固定的占用10%的空间。
在我编译完我的代码,IAR(IDE)显示我的RAM已经占用了1700 byte,再复制200 byte,很可能RAM空间不足,而我的业务代码只占用了700byte,并没有可以多优化的空间了。
那么多的1K byte被谁占用了呢?答案是程序的栈空间。这个栈空间是可以配置的,而默认的配置大小就是1K byte,我想是否能碰缩小下这个空间?当然我得先熟悉它。并且若不是MCU资源少且必须腾空间的情况下,最好还是不要太压缩它的空间。