查看: 1330|回复: 0

如何增加QN902x可用的代码空间

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2019-7-17 08:48:08 | 显示全部楼层 |阅读模式
    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的额外代码空间。
    1.png
    步骤二:打开基于prj_qpps更改后的工程编译成功后生成的map文件,如下图所示。map文件中每一行代表一个文件的存储分配情况。



    选取那些一行中所有占用空间(即Code + RO + RW + ZI )段之和,大小小于560字节或者444字节的可链接文件放入新增的代码空间中。
    2.png
    举例说明


    下面举两个示例操作如下:


    示例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文件中显示如下:
    3.png
    结论



    用户代码一共可以增加如下六块碎片区域:
    4.png
    六部分的可用空间一共是0x230+0x1BC * 5 = 0xADC(2780), 约2.71 KB. 所以如果芯片作Peripheral角色时,最大可增加用户代码约2.7KB。




    作者:张文斌    文章出处:恩智浦MCU加油站



    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 01:49 , Processed in 0.113610 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表