I am trying to deploy acados on a Zynq-7000 platform (Cortex-A9) used in the Inteco UnTrans (two-wheeled unstable transporter). The system runs PetaLinux on a single Cortex-A9 core. According to the hardware vendor, NEON is not used. The Linux side occupies around 750 MB RAM and about 250 MB RAM is available on the FPGA side. The controller is intended to run in real-time and the final output must be a standalone ELF binary.
My workflow is the following: I generate an NMPC solver using acados from MATLAB/Simulink. The solver is integrated as an S-function inside a Simulink model. Code is generated via Simulink Coder, and the acados-generated C files (from c_generated_code) are manually added to a custom .tmf makefile template used by the vendor’s ARM cross-compilation toolchain (arm-xilinx-eabi-gcc). The final goal is to build a single .elf binary for the Cortex-A9 target.
I am not using shared libraries – everything is compiled and linked statically into the final ELF. During compilation, I include acados core sources, HPIPM, BLASFEO and the generated solver sources. However, I am running into multiple compilation/linking issues (undefined references and inconsistencies related to BLASFEO/HPIPM symbols). It is not entirely clear whether the problem comes from an incomplete set of source files, inconsistent compile-time flags, or an incorrect BLASFEO target configuration.
My main questions are:
- What is the minimal required subset of acados components for a standalone embedded NMPC deployment?
As far as I understand, for a typical OCP NLP solver with HPIPM backend, I should only need:
-
acados core (ocp_nlp, sim, utils, ocp_qp interface),
-
HPIPM (ocp_qp and/or dense_qp parts actually used),
-
BLASFEO,
-
generated solver sources.
Is that correct? Are any other components strictly required at link time?
-
For Cortex-A9 (ARMv7-A) without NEON, what is the correct BLASFEO target configuration?
Should I explicitly set something like TARGET=ARMV7A or force a reference implementation?
Is it recommended to compile BLASFEO in REFERENCE mode (e.g. LA_REFERENCE) for maximum portability?
Are there specific compiler flags required to avoid accidental NEON usage? -
Is there an officially recommended way to build acados for bare-metal / embedded ARM targets without the full CMake install workflow (i.e. by directly compiling source files into a custom toolchain build system)?
If yes, which directories/files are mandatory and which can be safely excluded (e.g. examples, MATLAB interface, other QP solvers, etc.)? -
Has anyone successfully deployed acados on Zynq-7000 (Cortex-A9) without NEON?
If so, could you share the relevant build configuration (BLASFEO target, compiler flags, static vs shared, etc.)?
The key constraints in my case are:
-
static linking only,
-
minimal binary size,
-
no NEON,
-
cross-compilation with arm-xilinx-eabi-gcc,
-
integration inside a Simulink-generated project (custom .tmf-based build system).
Any guidance on the minimal required source set and correct BLASFEO/HPIPM configuration for ARMv7-A without NEON would be highly appreciated.