# Main

#### **src/driving\_board/main.c** 

<span style="white-space: pre-wrap;">contains the main firmware entry point and runtime logic for the driving board. The system is built on FreeRTOS (CMSIS-RTOS v2) and runs multiple tasks concurrently. </span>

#### <span style="white-space: pre-wrap;">Initialization </span>

##### init\_board()

<span style="white-space: pre-wrap;">This function initializes the full system before starting the scheduler. </span>

<span style="white-space: pre-wrap;">It: </span>

- <span style="white-space: pre-wrap;">Configures MPU and cache </span>
- <span style="white-space: pre-wrap;">Initializes HAL and system clock </span>
- <span style="white-space: pre-wrap;">Initializes GPIO, timers, and UART logging </span>
- <span style="white-space: pre-wrap;">Initializes control algorithm (control\_initialize) </span>
- <span style="white-space: pre-wrap;">Initializes Ethernet and MAC filtering Creates FreeRTOS tasks Starts PWM and encoder peripherals </span>
- <span style="white-space: pre-wrap;">Starts the RTOS kernel. After this, the scheduler takes over. </span>

#### <span style="white-space: pre-wrap;">Tasks </span>

<span style="white-space: pre-wrap;">The system runs 3 main threads: </span>

##### <span style="white-space: pre-wrap;">MainTask </span>

<span style="white-space: pre-wrap;">This task handles: Ethernet communication Diagnostics message creation and sending Periodic data updates </span>

**Example Flow For Sending A Message:**

- <span style="white-space: pre-wrap;">Initialize UDP Fill DiagnosticsData using FillDiagnostics </span>
- Encode using DBMDiagnostics
- <span style="white-space: pre-wrap;">Encode Send encoded data over Ethernet </span>
- <span style="white-space: pre-wrap;">Free allocated memory after sending Also sends test UDP and raw Ethernet messages. </span>

##### <span style="white-space: pre-wrap;">PwmTask </span>

<span style="white-space: pre-wrap;">This task runs the control loop. </span>

<span style="white-space: pre-wrap;">It: </span>

- <span style="white-space: pre-wrap;">Calls control\_step() from control module(Simulink folder) </span>
- <span style="white-space: pre-wrap;">Reads outputs from rtY </span>
- <span style="white-space: pre-wrap;">Updates motor PWM using set\_bldc\_pwm Runs periodically (1 ms) </span>

##### <span style="white-space: pre-wrap;">DrivingEncoderTask </span>

<span style="white-space: pre-wrap;">This task processes encoder data. </span>

<span style="white-space: pre-wrap;">It: </span>

- <span style="white-space: pre-wrap;">Reads timer counters </span>
- <span style="white-space: pre-wrap;">Calculates: revolutions radians (position) rpm (speed) </span>
- <span style="white-space: pre-wrap;">Populates motor data (rpm, voltage, angle). </span>
- <span style="white-space: pre-wrap;">Updates global variables used in diagnostics </span>
- <span style="white-space: pre-wrap;">Runs every 100 ms </span>