220 lines
11 KiB
ReStructuredText
220 lines
11 KiB
ReStructuredText
.. _optimization_tools:
|
|
|
|
Optimization Tools
|
|
##################
|
|
|
|
.. _footprint_tools:
|
|
|
|
Footprint and Memory Usage
|
|
**************************
|
|
|
|
The build system offers 3 targets to view and analyse RAM, ROM and stack usage
|
|
in generated images. The tools run on the final image and give information
|
|
about size of symbols and code being used in both RAM and ROM. Additionally,
|
|
with features available through the compiler, we can also generate worst-case
|
|
stack usage analysis:
|
|
|
|
Tools that are available as build system targets:
|
|
|
|
Build Target: puncover
|
|
======================
|
|
|
|
This target uses a 3rd party tools called puncover which can be found `here
|
|
<https://github.com/HBehrens/puncover>`_. When this target is built, it will
|
|
launch a local web server which will allow you to open a web client and browse
|
|
the files and view their ROM, RAM and stack usage. Before you can use this
|
|
target, you will have to install the puncover python module::
|
|
|
|
pip3 install git+https://github.com/HBehrens/puncover --user
|
|
|
|
|
|
Then:
|
|
|
|
.. zephyr-app-commands::
|
|
:tool: all
|
|
:app: samples/hello_world
|
|
:board: reel_board
|
|
:goals: puncover
|
|
|
|
|
|
To view worst-case stack usage analysis, build this with the
|
|
:kconfig:option:`CONFIG_STACK_USAGE` enabled.
|
|
|
|
.. zephyr-app-commands::
|
|
:tool: all
|
|
:app: samples/hello_world
|
|
:board: reel_board
|
|
:goals: puncover
|
|
:gen-args: -DCONFIG_STACK_USAGE=y
|
|
|
|
|
|
Build Target: ram_report
|
|
========================
|
|
|
|
List all compiled objects and their RAM usage in a tabular form with bytes
|
|
per symbol and the percentage it uses. The data is grouped based on the file
|
|
system location of the object in the tree and the file containing the symbol.
|
|
|
|
Use the ``ram_report`` target with your board:
|
|
|
|
.. zephyr-app-commands::
|
|
:tool: all
|
|
:app: samples/hello_world
|
|
:board: reel_board
|
|
:goals: ram_report
|
|
|
|
which will generate something similar to the output below::
|
|
|
|
Path Size %
|
|
==============================================================================================================
|
|
...
|
|
...
|
|
SystemCoreClock 4 0.08%
|
|
_kernel 48 0.99%
|
|
_sw_isr_table 384 7.94%
|
|
cli.10544 16 0.33%
|
|
gpio_initialized.9765 1 0.02%
|
|
on.10543 4 0.08%
|
|
poll_out_lock.9764 4 0.08%
|
|
z_idle_threads 128 2.65%
|
|
z_interrupt_stacks 2048 42.36%
|
|
z_main_thread 128 2.65%
|
|
arch 1 0.02%
|
|
arm 1 0.02%
|
|
core 1 0.02%
|
|
aarch32 1 0.02%
|
|
cortex_m 1 0.02%
|
|
mpu 1 0.02%
|
|
arm_mpu.c 1 0.02%
|
|
static_regions_num 1 0.02%
|
|
drivers 536 11.09%
|
|
clock_control 100 2.07%
|
|
nrf_power_clock.c 100 2.07%
|
|
__device_clock_nrf 16 0.33%
|
|
data 80 1.65%
|
|
hfclk_users 4 0.08%
|
|
...
|
|
...
|
|
|
|
|
|
Build Target: rom_report
|
|
========================
|
|
|
|
List all compiled objects and their ROM usage in a tabular form with bytes
|
|
per symbol and the percentage it uses. The data is grouped based on the file
|
|
system location of the object in the tree and the file containing the symbol.
|
|
|
|
Use the ``rom_report`` to get the ROM report:
|
|
|
|
.. zephyr-app-commands::
|
|
:tool: all
|
|
:app: samples/hello_world
|
|
:board: reel_board
|
|
:goals: rom_report
|
|
|
|
which will generate something similar to the output below::
|
|
|
|
Path Size %
|
|
==============================================================================================================
|
|
...
|
|
...
|
|
CSWTCH.5 4 0.02%
|
|
SystemCoreClock 4 0.02%
|
|
__aeabi_idiv0 2 0.01%
|
|
__udivmoddi4 702 3.37%
|
|
_sw_isr_table 384 1.85%
|
|
delay_machine_code.9114 6 0.03%
|
|
levels.8826 20 0.10%
|
|
mpu_config 8 0.04%
|
|
transitions.10558 12 0.06%
|
|
arch 1194 5.74%
|
|
arm 1194 5.74%
|
|
core 1194 5.74%
|
|
aarch32 1194 5.74%
|
|
cortex_m 852 4.09%
|
|
fault.c 400 1.92%
|
|
bus_fault.isra.0 60 0.29%
|
|
mem_manage_fault.isra.0 56 0.27%
|
|
usage_fault.isra.0 36 0.17%
|
|
z_arm_fault 232 1.11%
|
|
z_arm_fault_init 16 0.08%
|
|
irq_init.c 24 0.12%
|
|
z_arm_interrupt_init 24 0.12%
|
|
mpu 352 1.69%
|
|
arm_core_mpu.c 56 0.27%
|
|
z_arm_configure_static_mpu_regions 56 0.27%
|
|
arm_mpu.c 296 1.42%
|
|
__init_sys_init_arm_mpu_init0 8 0.04%
|
|
arm_core_mpu_configure_static_mpu_regions 20 0.10%
|
|
arm_core_mpu_disable 16 0.08%
|
|
arm_core_mpu_enable 20 0.10%
|
|
arm_mpu_init 92 0.44%
|
|
mpu_configure_regions 140 0.67%
|
|
thread_abort.c 76 0.37%
|
|
z_impl_k_thread_abort
|
|
76 0.37%
|
|
...
|
|
...
|
|
|
|
|
|
Data Structures
|
|
****************
|
|
|
|
|
|
Build Target: pahole
|
|
=====================
|
|
|
|
Poke-a-hole (pahole) is an object-file analysis tool to find the size of
|
|
the data structures, and the holes caused due to aligning the data
|
|
elements to the word-size of the CPU by the compiler.
|
|
|
|
Poke-a-hole (pahole) must be installed prior to using this target. It can be
|
|
obtained from https://git.kernel.org/pub/scm/devel/pahole/pahole.git and is
|
|
available in the dwarves package in both fedora and ubuntu::
|
|
|
|
sudo apt-get install dwarves
|
|
|
|
or in fedora::
|
|
|
|
sudo dnf install dwarves
|
|
|
|
|
|
.. zephyr-app-commands::
|
|
:tool: all
|
|
:app: samples/hello_world
|
|
:board: reel_board
|
|
:goals: pahole
|
|
|
|
|
|
After running this target, pahole will output the results to the console::
|
|
|
|
/* Used at: zephyr/isr_tables.c */
|
|
/* <80> ../include/sw_isr_table.h:30 */
|
|
struct _isr_table_entry {
|
|
void * arg; /* 0 4 */
|
|
void (*isr)(void *); /* 4 4 */
|
|
|
|
/* size: 8, cachelines: 1, members: 2 */
|
|
/* last cacheline: 8 bytes */
|
|
};
|
|
/* Used at: zephyr/isr_tables.c */
|
|
/* <eb> ../include/arch/arm/aarch32/cortex_m/mpu/arm_mpu_v7m.h:134 */
|
|
struct arm_mpu_region_attr {
|
|
uint32_t rasr; /* 0 4 */
|
|
|
|
/* size: 4, cachelines: 1, members: 1 */
|
|
/* last cacheline: 4 bytes */
|
|
};
|
|
/* Used at: zephyr/isr_tables.c */
|
|
/* <112> ../include/arch/arm/aarch32/cortex_m/mpu/arm_mpu.h:24 */
|
|
struct arm_mpu_region {
|
|
uint32_t base; /* 0 4 */
|
|
const char * name; /* 4 4 */
|
|
arm_mpu_region_attr_t attr; /* 8 4 */
|
|
|
|
/* size: 12, cachelines: 1, members: 3 */
|
|
/* last cacheline: 12 bytes */
|
|
};
|
|
...
|
|
...
|