在线时间4067 小时
UID3441752
注册时间2017-11-21
NXP金币754069
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32024
- 最后登录
- 2024-4-25
|
QN902x简介
QN902x是一款超低功耗、高性能和高度集成的Bluetooth LE解决方案。在单个芯片上集成了射频前端、控制器(MCU)、协议栈和profile应用,提供了一种灵活易用的SoC解决方案。
QN902x适用于需要蓝牙数据传输的各种应用领域,如运动健身、人机界面设备以及启用应用程序的智能配件。该产品专为可穿戴电子产品而设计,可在纽扣电池等小容量电池的驱动下运行。典型的应用包括穿戴式设备、智能门锁、POS机等。
用户还可以将QN902x用作嵌入式控制器,连接至其他应用处理器,以实现更高级的应用。
QN902x的其他系统特性包括完整集成的DC-DC和LDO、低功耗睡眠定时器、电池检测器、通用ADC和通用IO。在所有模式下都具有非常低的功耗,它能够在电池供电系统中实现较长的使用寿命,同时保持出色的射频性能。
背景
QN902x的存储器包含三部分:
ROM:存放蓝牙协议栈代码
Flash:128KB,存储代码和数据。
RAM:64KB,用于存放运行时的数据和应用代码。
在Boot期间,引导程序会将应用程序代码从Flash导入到RAM中运行,所以运行的代码和数据两者总量,最大不得超过RAM的容量,即不能超过64KB。这样在RAM中运行代码,从而有效地降低芯片的功耗。
ROM的空间不允许用户使用,但ROM中的蓝牙协议栈的全局变量和exchange memory会占用RAM的一部分空间,除去该部分外,用户可在RAM中使用的代码空间约为51KB。
QN902x SDK中提供的所有例程代码的scatter file中有如下定义:
LR_ROM1 0x10000000 0xCDB0
在用户的代码中,QN902x蓝牙协议栈做从设备的补丁函数库qn9020b4_lib_peripheral_v42.lib约占用16.5KB,在线升级函数库OTA_LIB约占3.5KB。因此,最终预留给应用程序的代码空间约为31KB,如当前所用的代码空间不够用的情况下,需要一种优化办法来提升可用的应用代码空间。
优化办法
在研究ROM的蓝牙协议栈中发现,如果设备作Peripheral角色时,可以抠出一部分指定区域的的RAM空间,供用户代码使用。这是因为QN902x作Central角色时,可以同时支持连接8个设备,ROM里的蓝牙协议栈预留了存储8个设备连接信息的数据块,即全局变量llc_env[]和smp_env[],且这两个数据块在RAM中是指定在固定位置的。
但芯片作Peripheral角色时,只需连接一个设备,可以将未使用的RAM空间拿来填充用户代码。因此这种情况下,代码空间可以优化,具体的操作步骤如下:
步骤一: 在工程的scatter file 中新增六块片区,将大小合适的可链接文件放入新增片区空间。经实际测试和验证,可以增加如下加粗字体部分的内容,其中蓝色字体的部分可增加一块不大于560 Bytes空间,其余五个片区都可以增加不大于444 Bytes的额外代码空间。
步骤二:打开基于prj_qpps更改后的工程编译成功后生成的map文件,如下图所示。map文件中每一行代表一个文件的存储分配情况。
选取那些一行中所有占用空间(即Code + RO + RW + ZI )段之和,大小小于560字节或者444字节的可链接文件放入新增的代码空间中。
举例说明
下面举两个示例操作如下:
示例1:上图中的app_task.o的Code + (inc. data)+ RO 总和为524 Bytes, 小于560 ,大于444, 则它的放置位置如下:
APP_CODE_BANK7_PERIPHERAL_ONLY 0x1000D2E4 0x230
{
app_task.o (+RO +RW +ZI)
}
示例2:上图中的serialflash.o和wdt.o的Code + (inc. data)+ RO + RW 的总和是194字节,小于444,则它们可以放置的位置如下:
APP_CODE_BANK7_PERIPHERAL_ONLY_1 0x1000E580 0x1BC
{
serialflash.o (+RO +RW +ZI)
wdt.o (+RO +RW +ZI)
}
重新编译成功之后,再打开map文件,检查以下这些片区是否分配正确的可链接文件。
0x1000D2E4
0x1000E580
0x1000E764
0x1000E948
0x1000EB2C
0x1000ED10
如下图为以上示例1和示例2更改后,更改有效之后,在map文件中显示如下:
结论
用户代码一共可以增加如下六块碎片区域:
六部分的可用空间一共是0x230+0x1BC * 5 = 0xADC(2780), 约2.71 KB. 所以如果芯片作Peripheral角色时,最大可增加用户代码约2.7KB。
作者:张文斌 文章出处:恩智浦MCU加油站
|
|