002-SLM130(NB-IOT)C-SDK(OpenCPU)学习开发-关于Flash分配和程序加载过程

2022-04-29 17:08:03 浏览数 (1)

说明

模组内部使用的M3的内核, 如果大家伙使用过STM32或者类似的ARM核的单片机做过程序升级,

那么这篇文章就可以基本上看懂了, 如果没有做过升级,建议看一下下面的

https://mnifdv.cn/resource/cnblogs/iot_documents/STM32 OTA demo.pdf

然后呢, 模组的开发是没有使用IDE的, 是直接使用的ARMCC Cmake

咱以前是直接在Keil上进行配置, 是软件帮咱内部配置的编译过程.

实际上脱离了Keil软件照样是可以编译程序的, Keil只是提供了页面配置而已.

有兴趣的同学可以百度下如何脱离Keil使用 Cmake编译程序.

先来看程序加载的过程

1.使用文本编辑软件打开 PLAT文件夹 (我就使用 VSCode)

2.BootLoader程序会执行 SystemXIPNormalBoot 函数

ec_main 就是程序入口函数

3.SystemXIPNormalBoot 函数里面最终会执行跳转

APP_FLASH_LOAD_ADDR 地址呢是 0x00820000 ; 其实就是咱用户程序(执行具体功能的程序)存放在flash的起始地址

咱的用户程序就是从这个地址开始烧录到flash

看下下面的跳转程序,因为是ARM内核嘛, 所以最终就是要执行程序的复位中断入口地址,

注:falsh是4字节代表一个地址, 地址加1 正好是复位中断地址(如果不理解,说明没有玩转ARM单片机升级....)

执行完上面的其实就是运行了用户程序了.

现在整体说下flash的分配情况

1.BootLoader程序

BootLoader程序是从flash的 0x00804000 地址开始存储的, 总共 0x00012000(73728字节,72KB)

(说明最底层还有一套程序,这个咱就不关心了)

2.用户程序

用户程序是从flash的 0x00820000 地址开始存储的, 总共 0x280000(2621440字节,2560KB)

3.后面的(因为刚使用,还没有具体了解, 我猜的)

FLASH_MEM_BACKUP_ADDR 感觉是升级程序时, 接收的差分程序文件存放的地址,

FLASH_MEM_PLAT_INFO_ADDR  不知道, 要么是内部使用的, 要么是提供给用户使用的.....

编译的时候如何设置程序运行的ROM起始地址

1,在有IDE软件的时候咱都知道在上面就可以设置程序运行的ROM地址

2,在没有IDE的时候如何做的呢?

编译程序的时候其实有个链接文件 xxxxx.ld文件;

现在咱看是如何把BootLoader程序设置到运行在上面说的0x00804000 地址上的

其实就是xxxxx.ld文件控制的哈, 不过咱只需要了解就可以, 咱也不需要改什么.

同样的用户程序也有设置(注意哈,所有的用户程序是在上面的文件夹里面统一设置的)

提示:上面说的这个不必深究, 了解下就可以, 后面应该是用不到去自己调整flash分配

0 人点赞