资源占用测试报告

综合来看有以下的资源占用报告

ROM \ RAM (byte) O0 O3
库本体 20724 \ 200 10360 \ 204
1 个从机对象 988 \ 80 632 \ 80
1 个映射条目 (静态) 20 \ 0 20 \ 0
1 个主机对象 908 \ 21012 548 \ 21016
主机成员从机对象,与从机对象类似 未测试 未测试

除此以外,为对象准备的收发 buffer 空间也会占用少量 RAM ,编写复杂的回调函数会占用少量 ROM ,但这些可以自定自控制。

注意到整个库,大部分的内容都使用较少的资源,只有主机对象占用了大量的 RAM,这是由于开启了所有占用资源的配置项。

以下会有一个推荐的裁剪过程。

默认用户已经熟读了用户配置文件 的内容,对于资源受限的芯片,

MBX_MODULE_TCP_MASTER_ENABLE 置为 0
MBX_MASTER_REQUEST_QUEUE_MAX 置为 32
MBX_MASTER_ERROR_QUEUE_MAX 置为 1
MBX_MASTER_MULTI_REG_MAX 置为 20

会显著降低为这样的资源消耗

0x2400001c g O .bss 0x00000638 MBxMaster

RAM (byte) O0 O3
1 个主机对象 1592 1592

开启所有占用资源的配置选项,有如下

ROM \ RAM (byte) O0 O3
基准参考1
(没有启动文件)
96 \ 28 96 \ 28
基准参考2
(带有启动文件)
936 \ 28 924 \ 28
库本体
(仅调用库tick)
21660 \ 228 11284 \ 232
库本体 + 1 个从机对象
(无映射条目无收发buffer)
22648 \ 308 11916 \ 308
库本体 + 1 个从机对象 +
1 个映射条目
(无收发buffer))
22668 \ 308 11936 \ 308
库本体 + 1 个从机对象 +
1 个映射条目 + 1 个简单回调
(无收发buffer))
22700 \ 308 11940 \ 308
库本体 + 1 个主机对象
(无收发buffer,无从机成员))
22568 \ 21240 11832 \ 21244

基准参考1

只链接了必要库的空项目,没有启动文件,无法链接出实际产物

O0 优化

[build] c:/111_apps/msys2/mingw64/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08020000
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:          96 B         2 MB      0.00%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:          28 B       512 KB      0.01%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

03优化

[build] c:/111_apps/msys2/mingw64/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08020000
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:          96 B         2 MB      0.00%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:          28 B       512 KB      0.01%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

基准参考2

只链接了必要库的空项目,有启动文件,链接出实际产物

O0 优化

[build] [100%] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:         936 B         2 MB      0.04%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:          28 B       512 KB      0.01%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

03优化

[build] [4/4 100% :: 1.100] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:         924 B         2 MB      0.04%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:          28 B       512 KB      0.01%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

库本体资源占用

以下代码测试(不展示启动文件)

#include <MBx_api.h>

//
int main( )
{
    MBx_Ticks(1);
    return 0;
}

ARM-GCC 编译测试,库本体,而没有任何一个主从机对象

O0 优化

占用 21468 字节 ROM ,200 字节 RAM

具备启动文件和main函数,在配置文件开启了完全的功能,如下

[build] [100%] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       21660 B         2 MB      1.03%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         228 B       512 KB      0.04%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

03优化

占用 11188 字节 ROM ,204 字节 RAM

具备启动文件和main函数,在配置文件开启了完全的功能,如下

[build] [100%] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       11284 B         2 MB      0.54%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         232 B       512 KB      0.04%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

一个从机对象,简单port,空映射表

以下代码测试(不展示启动文件)

#include <MBx_api.h>

static const _MBX_MAP_LIST_ENTRY MapList[];
_MBX_SLAVE                       MBxSlave;

//
uint32_t SendPort(const void *Data, size_t Len)
{
    return MBX_PORT_RETURN_DEFAULT;
}

uint32_t GetcPort(uint8_t *Data)
{
    return MBX_PORT_RETURN_DEFAULT;
}

//
int main( )
{
    /* 初始化modbus从机1 */
    if(MBx_Slave_RTU_Init(&MBxSlave, // 从机对象
                          1,         // 从机ID
                          MapList,   // 地址映射表
                          SendPort,  // 发送函数
                          GetcPort,  // 接收函数
                          9600,      // 波特率
                          NULL,      // 库内接收buffer分配
                          84,        // 接收buffer最大长度
                          NULL,      // 库内发送buffer分配
                          84)        // 发送buffer最大长度
       != MBX_API_RETURN_DEFAULT)
    {
        /* 初始化错误 自行判断返回值差错 */
    }

    MBx_Ticks(1);
    return 0;
}

static const _MBX_MAP_LIST_ENTRY MapList[] = {

    MBX_MAP_LIST_END
};

O0 优化

占用 22552 字节 ROM ,280 字节 RAM

[build] [100%] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       22648 B         2 MB      1.08%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         308 B       512 KB      0.06%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

O3优化

具备启动文件和main函数,在配置文件开启了完全的功能,如下

[build] [  4%] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       11916 B         2 MB      0.57%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         308 B       512 KB      0.06%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

一个从机对象,简单port,一个条目映射表,无实际回调函数

以下测试代码(不展示启动文件)

#include <MBx_api.h>

static const _MBX_MAP_LIST_ENTRY MapList[];
_MBX_SLAVE                       MBxSlave;

//
uint32_t SendPort(const void *Data, size_t Len)
{
    return MBX_PORT_RETURN_DEFAULT;
}

uint32_t GetcPort(uint8_t *Data)
{
    return MBX_PORT_RETURN_DEFAULT;
}

//
int main( )
{
    /* 初始化modbus从机1 */
    if(MBx_Slave_RTU_Init(&MBxSlave, // 从机对象
                          1,         // 从机ID
                          MapList,   // 地址映射表
                          SendPort,  // 发送函数
                          GetcPort,  // 接收函数
                          9600,      // 波特率
                          NULL,      // 库内接收buffer分配
                          84,        // 接收buffer最大长度
                          NULL,      // 库内发送buffer分配
                          84)        // 发送buffer最大长度
       != MBX_API_RETURN_DEFAULT)
    {
        /* 初始化错误 自行判断返回值差错 */
    }

    MBx_Ticks(1);
    return 0;
}

static const _MBX_MAP_LIST_ENTRY MapList[] = {

    {.Addr = 0x0001, .Memory = &(MBxSlave.Config.MapNum), .Type = MBX_REG_TYPE_U16, .Handle = NULL, .Para = &DefaultPara},

    MBX_MAP_LIST_END
};

O0 优化

[build] [43/43 100% :: 2.018] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       22668 B         2 MB      1.08%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         308 B       512 KB      0.06%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

O3优化

具备启动文件和main函数,在配置文件开启了完全的功能,如下

[build] [2/2 100% :: 1.049] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       11936 B         2 MB      0.57%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         308 B       512 KB      0.06%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

一个从机对象,简单port,无从机成员对象,无实际回调函数

以下测试代码(不展示启动文件)

#include <MBx_api.h>

static const _MBX_MAP_LIST_ENTRY MapList[];
_MBX_SLAVE                       MBxSlave;

//
uint32_t SendPort(const void *Data, size_t Len)
{
    return MBX_PORT_RETURN_DEFAULT;
}

uint32_t GetcPort(uint8_t *Data)
{
    return MBX_PORT_RETURN_DEFAULT;
}

uint32_t ModbusSetFoo(void *value, _MBX_REG_HANDLE_PARA *para)
{
    int16_t ValueGet = (*(int16_t *)value);
    return MBX_API_RETURN_DEFAULT;
}

//
int main( )
{
    /* 初始化modbus从机1 */
    if(MBx_Slave_RTU_Init(&MBxSlave, // 从机对象
                          1,         // 从机ID
                          MapList,   // 地址映射表
                          SendPort,  // 发送函数
                          GetcPort,  // 接收函数
                          9600,      // 波特率
                          NULL,      // 库内接收buffer分配
                          84,        // 接收buffer最大长度
                          NULL,      // 库内发送buffer分配
                          84)        // 发送buffer最大长度
       != MBX_API_RETURN_DEFAULT)
    {
        /* 初始化错误 自行判断返回值差错 */
    }

    MBx_Ticks(1);
    return 0;
}

static const _MBX_MAP_LIST_ENTRY MapList[] = {

    {.Addr = 0x0001, .Memory = &(MBxSlave.Config.MapNum), .Type = MBX_REG_TYPE_U16, .Handle = ModbusSetFoo, .Para = &DefaultPara},

    MBX_MAP_LIST_END
};

O0 优化

[build] [2/2 100% :: 1.197] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       22700 B         2 MB      1.08%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         308 B       512 KB      0.06%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

O3优化

具备启动文件和main函数,在配置文件开启了完全的功能,如下

[build] [43/43 100% :: 2.079] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       11940 B         2 MB      0.57%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:         308 B       512 KB      0.06%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

一个主机对象,简单port,一个条目映射表,一个实际回调函数

以下测试代码(不展示启动文件)

#include <MBx_api.h>

_MBX_MASTER MBxMaster;

//
uint32_t SendPort(const void *Data, size_t Len)
{
    return MBX_PORT_RETURN_DEFAULT;
}

uint32_t GetcPort(uint8_t *Data)
{
    return MBX_PORT_RETURN_DEFAULT;
}

int main( )
{
    /* 初始化modbus主机1 */
    if(MBx_Master_RTU_Init(&MBxMaster, // 主机对象
                           SendPort,   // 发送函数
                           GetcPort,   // 接收函数
                           9600,       // 波特率
                           NULL,       // 库内接收buffer分配
                           84,         // 接收buffer最大长度
                           NULL,       // 库内发送buffer分配
                           84)         // 发送buffer最大长度
       != MBX_API_RETURN_DEFAULT)
    {
        /* 初始化错误 自行判断返回值差错 */
    }

    MBx_Ticks(1);
    return 0;
}

O0 优化

[build] [43/43 100% :: 2.056] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       22568 B         2 MB      1.08%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:       21240 B       512 KB      4.05%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%

O3优化

具备启动文件和main函数,在配置文件开启了完全的功能,如下

[build] [43/43 100% :: 2.164] Linking C executable arm-size-test.elf
[build] Memory region         Used Size  Region Size  %age Used
[build]            FLASH:       11832 B         2 MB      0.56%
[build]       RAM_BLFlag:          0 GB          4 B      0.00%
[build]          DTCMRAM:        1540 B     131068 B      1.17%
[build]           RAM_D1:       21244 B       512 KB      4.05%
[build]           RAM_D2:          0 GB       288 KB      0.00%
[build]           RAM_D3:          0 GB        64 KB      0.00%