- Developing an Enterprise-level Embedded software stack from scratch by identifying and integrating required components
- Flexibility and control over every part of Firmware development i.e from the Linker script level to the firmware application design.
- Use modern build systems (CMake and Meson) to make a IDE independent development environment to reduce cost of development and maintenance.
- Integrate tooling such as static analysis, clang-format, unit testing, mocking and debugging to improve the quality of code.
Download this PDF for a diagrammatic explanation.
arm-none-eabi-*
GNU Toolchain- CMake/Meson
- Ninja
- STM32CubeProgrammer
- OpenOCD
- VSCode Plugins
- CMake
- Cortex-Debug
- C/C++
- STM32 Website for B-L475E-IOT01A
- STM32L475_x examples use the B-L475E-IOT01A board
- STM32 Website for NUCLEO-F746ZG
- STM32F7ZG examples use the NUCLEO-F746ZG board
- Baremetal
- Low level Linker script and learning
- Integrate critical external components to a project
- doc
- Component datasheeets
- Board schematics and microcontroller datasheets
- STM32_HAL
- STM32 HAL based examples for various microcontrollers
- Template
- Projects built after Minimal_CMSIS in Baremetal
- Actual application level code with various levels of tooling support
- Takes each core part of an embedded system and creates a project around it
- third_party
- Third Party software ZIP files used in Template projects
- tools
- Tools used by the project, pre-installed in your system
- Links or ZIP files
Create a folder structure that would need minimal change when porting between different architectures and microcontrollers
To port our project to a different controller we would need to update these folders
- l0_lowlevel
- l1_third_party_device_specific
- l2_drivers
To port our project to a different board we would need to update these folders
- l2_board_specific
- l5_application
Platform independent code
- l3_functional_third_party
- l4_module (Design drivers that use the platform agnostic l2_drivers)
+-- l0_lowlevel
| +-- arm_cmsis
| +-- linker_script
| +-- device
| +-- toolchain_specific_syscalls
+-- l1_third_party_device_specific
| +-- RTOS
| +-- External_Libraries_device_specific
+-- l2_drivers
| +-- gpio_device_specific
| +-- uart_device_specific
+-- l2_board_specific
| +-- peripheral_initialization
+-- l3_functional_third_party
| +-- ring_buffer
+-- l4_module
| +-- sensors/actuators
| +-- technology
| +-- protocol
+-- l5_application
| +-- application_logic
| +-- main.c
- ARM CMSIS 5 has different compiler and architecture specific changes
- ARM CMSIS 5 Linker script is dependent on architecture of microcontroller
- Device Header is dependent of the Microcontroller Manufacturer
- Device Startup is dependent on ARM Architecture and Microcontroller Manufacturer
- Certain Third Party software changes its behaviour based on the architecture and device
- For example: FreeRTOS needs to be configured differently according to different microcontroller family and architectures
- Basic drivers for GPIO, Interrupt Handing
- Basic protocol for UART, SPI, I2C
- These are microcontroller and architecture dependent
- For internal board_specific initialization
- Syscalls based externed functions
- Functional Third Party code integrated into the project
- For example: Ring Buffer, JSON Library
Writing code for various hardwares i.e
- Communication
- Sensors
- Actuators
- Application Logic for the project
main.c
resides on the top level
- arm-none-eabi-*
- clang for ARM
- CMake
- Meson
- Bazel
- Premake
- Scons
- Custom Linker Script
- Custom Startup
- Integrate CMSIS Linker Script
- Integrated CMSIS Startup
- CMSIS_5
- STM32 HAL
- Amazon FreeRTOS
- Microsoft ThreadX
- C
- Baremetal
- Basic Driver
- RTOS
- Unit Testing
- Design
- Tooling
- C++
- Baremetal
- Basic Driver
- RTOS
- Unit Testing
- Design
- Tooling
- Rust
- Baremetal
- Basic Driver
- RTOS
- Unit Testing
- Design
- Tooling
- openOCD
- arm-none-eabi-gdb
- Semihosting
- Unity
- CppUTest
- Google Tests
- Catch
- Fake Function Framework (FFF)
- CMock
- CppUMock
- Google Mock
- Ring Buffer
- JSON Parser
- Clang Format
- Static Analysis
- Code Coverage
- Continuous Integration
- Documentation Generator