# Running the "perf_conv" example on STM32F746IGT6-based board.

This page describes the steps required to build and run the `perf_conv` example on the STM32F746IGT6 evaluation board.

The `perf_conv` example demonstrates how to use an in-memory eXtremeDB/rt database.

The STM32F746IGT6 device has the following specifications:

- Core: ARM 32-bit Cortex-M7 CPU with FPU
- Maximum frequency: 216 MHz
- Flash memory: 1 MB NOR XIP flash
- RAM: 320 KB

As shown, the board’s resources are relatively constrained. It represents a mid-range target in the embedded systems landscape.

Note: Development for STM32 microcontrollers is typically performed using STM32CubeIDE.

## Building the Project

To build and run the `perf_conv` example, follow these steps:

1. Create a new empty project in STM32CubeIDE for the STM32F746IGTx target.

2. Use STM32CubeMX to generate a default configuration for this target.

3. In the configuration:

   - Enable UART (required to view example output via serial console).
   - Ensure the system clock (SYSCLK) is set to 200 MHz.

4. In the project’s linker script (`.ld` file), configure the heap and stack sizes as follows. The database memory will be allocated dynamically via `malloc()`:

           _Min_Heap_Size = 0x37000; /* 220 KB heap */
           _Min_Stack_Size = 0x4000; /* 64 KB stack */

5. After saving the configuration and generating the startup code, verify that the basic project builds and runs correctly on the target hardware.

6. In the eXtremeDB/rt package, generate the database schema code for the `perf_conv` example:

           cd eXtremeDB_rt/samples/perf_conv
           ../../host/bin/mcocomp -x32 perf.mco

7. Add the following files from the eXtremeDB/rt package to your project source tree. This includes the eXtremeDB/rt core, the MURSIW transaction manager, and the in-memory runtime:

           ./include/mcoewslite.h
           ./include/mcoflashsim.h
           ./include/mco.h
           ./include/mco.hpp
           ./include/mconet.h
           ./include/mcoquad.h
           ./include/mcorestrt.h
           ./include/mcosmint.h
           ./include/mcosmp.h
           ./include/mcospec.h
           ./include/mcossl.h
           ./include/mcostatrt.h
           ./include/mcotargt.h
           ./include/mcotime.h
           ./include/mcotrace.h
           ./include/mcouda.h
           ./include/mcovers.h
           ./include/mcowrap.h
           ./samples/perf_conv/main.c
           ./samples/perf_conv/perf.c
           ./samples/perf_conv/perf.h
           ./samples/perf_conv/perf.mco
           ./samples/common/common.c
           ./samples/common/common.h
           ./samples/common/initos.h
           ./samples/common/initos.c
           ./target/crypt/mcocryptstub.c
           ./target/mcolib/mcoabst.c
           ./target/mcolib/mcoabst.h
           ./target/mcolib/mcoamp.c
           ./target/mcolib/mcoamp.h
           ./target/mcolib/mcoautoid.c
           ./target/mcolib/mcoautoid.h
           ./target/mcolib/mcobmap.h
           ./target/mcolib/mcobse.h
           ./target/mcolib/mcobtree.c
           ./target/mcolib/mcocfg.h
           ./target/mcolib/mcocmpkt.c
           ./target/mcolib/mcocobj.c
           ./target/mcolib/mcocobj.h
           ./target/mcolib/mcoconn.c
           ./target/mcolib/mcoconn.h
           ./target/mcolib/mcoconst.h
           ./target/mcolib/mcocont.c
           ./target/mcolib/mcocryptmem.c
           ./target/mcolib/mcocryptmem.h
           ./target/mcolib/mcocsr.c
           ./target/mcolib/mcocsr.h
           ./target/mcolib/mcodb.c
           ./target/mcolib/mcodb.h
           ./target/mcolib/mcodict.c
           ./target/mcolib/mcodict.h
           ./target/mcolib/mcodiskbtree.h
           ./target/mcolib/mcodisk.h
           ./target/mcolib/mcodup.c
           ./target/mcolib/mcoerr.h
           ./target/mcolib/mcoevasy.c
           ./target/mcolib/mcoevasy.h
           ./target/mcolib/mcoevsyn.c
           ./target/mcolib/mcoevsyn.h
           ./target/mcolib/mcohash.c
           ./target/mcolib/mcoindex.c
           ./target/mcolib/mcoindex.h
           ./target/mcolib/mcomd.c
           ./target/mcolib/mcomembtree.c
           ./target/mcolib/mcomembtree.h
           ./target/mcolib/mcomem.h
           ./target/mcolib/mcoobj.c
           ./target/mcolib/mcoobj.h
           ./target/mcolib/mcoorder.c
           ./target/mcolib/mcopage.c
           ./target/mcolib/mcopmbuf.c
           ./target/mcolib/mcopmbuf.h
           ./target/mcolib/mcoproto.h
           ./target/mcolib/mcorec.c
           ./target/mcolib/mcortmt.c
           ./target/mcolib/mcortree_core.c
           ./target/mcolib/mcortreeu.c
           ./target/mcolib/mcortreeu.h
           ./target/mcolib/mcortst.c
           ./target/mcolib/mcoseri.h
           ./target/mcolib/mcoshm0.c
           ./target/mcolib/mcoshm.h
           ./target/mcolib/mcoshmu.c
           ./target/mcolib/mcostat.c
           ./target/mcolib/mcostatimpl.h
           ./target/mcolib/mcosys.h
           ./target/mcolib/mcothash.c
           ./target/mcolib/mcotmgr.h
           ./target/mcolib/mcotrans.c
           ./target/mcolib/mcotrans.h
           ./target/mcolib/mcowarr.c
           ./target/mcolib/mcowev.c
           ./target/mcolib/mcowfnd.c
           ./target/mcolib/mcowimp.c
           ./target/mcolib/mcowimp.h
           ./target/mcolib/mcowobj.c
           ./target/mcolib/mcowoid.c
           ./target/mcolib/mcowrap.c
           ./target/mcolib/mcowvec.c
           ./target/mcomd/mcomconv.c
           ./target/mcoseri/mcobse.c
           ./target/mcoseri/mcoseri.c
           ./target/mcoseri/mcosericmn.c
           ./target/mcotrace/mcoasynctrace.c
           ./target/mcotrace/mcostrerror.c
           ./target/mcotrace/mcotrace.c
           ./target/mcotrace/mcotracehandlers.c
           ./target/mcovtmem/mcovtmem.c
           ./target/misc/mcobmap.c
           ./target/misc/mcocompress.c
           ./target/misc/mcoerr.c
           ./target/misc/mcoheap.c
           ./target/misc/mcosort.c
           ./target/misc/mcosort.d
           ./target/misc/mcostrrt.c
           ./target/sal/atomic/mcosalatomic.c
           ./target/sal/latches/mcosallatches.c
           ./target/sal/mem/mcosysmem.c
           ./target/sal/smp/mconoos.c
           ./target/sal/sync/mcosnone.c
           ./target/sal/timer/mcosaltimer.c
           ./target/tmgr/mcotque.c
           ./target/tmgr/mcotuctrl.h
           ./target/tmgr/mursiw.c

8. Add the following include paths to your project settings:

           ../eXtremeDB_rt/include
           ../eXtremeDB_rt/target/mcolib
           ../eXtremeDB_rt/target/tmgr
           ../eXtremeDB_rt/samples/common

9. Add the following preprocessor definitions to your project settings:

           _ARM32
           STM32F746xx
           USE_HAL_DRIVER
           STM32F746IGTx
           STM32
           STM32F7
           MCO_TRACE_ENABLED=1
           MCO_TRACE_CONSOLE_SUPPORTED=1
           MCO_CONFIG_OVERRIDE_TRACE_FILE_ROTATION

10. Modify the auto-generated `main.c` (from STM32CubeMX) to call the example entry point: `sample_main()`.

11. Build the project and flash it onto the STM32F746IGT6 board.

## Expected Output

After successful compilation and deployment, the `perf_conv` example will execute on the target device. The output will appear on the UART console as follows:

        Sample 'perf_conv' demonstrates eXtremeDB/rt performance for basic operations.

        eXtremeDB/rt runtime version 2.0, Release
        Copyright (c) 2001-2026 McObject LLC. All Rights Reserved.

        First N objects are inserted into a class, a hash index is created
        on insertion, then used for searches. Then a tree index is built
        and searches are performed by key, then sequentially.
        Finally, the tree index is removed and all objects are deleted
        one-by-one. Each insert and delete is done in a separate
        transaction, so that the commit time is included in measurements.

        Memory usage 100992 from 193280 bytes
        Insert:
        ..........
        2000 objects: 0 milliseconds,(0 microsecs/object)
        Memory usage 167040 from 193280 bytes

        Hash search:
        ....................
        Memory usage 167040 from 193280 bytes
        4000 searches: 0 milliseconds (0 microsecs/search)

        Tree search:
        ....................
        4000 searches: 0 milliseconds (0 microsecs/search)
        Memory usage 167040 from 193280 bytes

        Sequential:
        ..........
        2000 searches: 0 milliseconds (0 microsecs/search)
        Memory usage 167040 from 193280 bytes

        Search/delete:
        ....................
        4000 objects: 1 milliseconds (0 microsecs/object)
        Memory usage 100992 from 193280 bytes