|
发表于 2015-4-21 15:19:36
本帖最后由 FireBLE_blue 于 2015-4-21 15:22 编辑
xiaolong_ba:
你的问题非常有意义,是每一个刚接触QN902x 或者接触新的mcu 开发者的必进之路,曾经我也这么走过来。
希望我的回答能帮助你的理解:
Q1:ROM和RAM 都能有各自的地址空间,Flash 没有对应的地址空间,因为此Flash 为 spi nor Flash ,不可直接被mcu 直接访问,他是存储code 的载体,不是执行code 的主体,烧录进Flash 的二进制,需要copy 到RAM 才能执行。
Q2:这里的Flash 地址 就是code 执行的绝对地址,code 编译后的二进制 最后是保存在RAM里以便mcu 取指。
Q3:
1.是的,不能擦除,此部分的二进制在芯片生产的时候就掩膜(MASK)进去。
2.编译链接后的二进制是保存在Flash(spi nor Flash)里,上电后,掩膜(MASK)在ROM 的bootload 会拷贝到RAM里,以便mcu 通过总线取指。
Q4:ROM 和 RAM 的分配 请参考 链接文件 的定义,对于 我们编写的 app 而言,项目编译的 Code、RO、RW、ZI段都定义在RAM 分布区(虽然是烧进Flash ,但不代表执行体在Flash ,bootload 会拷贝)
如下:
- ; *************************************************************
- ; *** Scatter-Loading Description File generated by Quintic ***
- ; *************************************************************
- LR_ROM1 0x10000000 0xCDB0
- {
- APP_CODE 0x10000000 0xCDB0
- {
- *.o (RESET, +First)
- startup.o (+RO)
- *(InRoot$Sections)
- .ANY (+RO)
- .ANY (+RW +ZI)
- }
- }
复制代码
Q5:QN902x 提供了OTA 的蓝牙空中升级,如果要自己实现IAP ,可以直接把二进制文件烧录进Flash 里,但不是前面的几十KB 大小里,而是烧录进Flash 绝对地址 0x01100 ~0x1E000 处,并把相关的bootload information 烧录进 0x01000~0x01100。
|
|