资源占用测试报告
综合来看有以下的资源占用报告
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%