Skip to main content

build-agent-embedded

C/C++ build agent for embedded systems, firmware, and MCU projects. Extends build-agent with embedded constraints. Use when building firmware, bare-metal code, or resource-constrained systems.

Source facts

Repository
Agile-V/agile_v_skills
Last source activity
August 10, 2026 at 19:38
Detected SKILL.md language
English
Stars
54
Forks
10

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
build-agent-embedded
description
C/C++ build agent for embedded systems, firmware, and MCU projects. Extends build-agent with embedded constraints. Use when building firmware, bare-metal code, or resource-constrained systems.
license
CC-BY-SA-4.0
metadata
{"version":"2.3","standard":"Agile V","domain":"Embedded/C/C++","extends":"build-agent","author":"agile-v.org","sections_index":["Inherited Rules","SCOPE-V Participation","Embedded/Safety-Critical Architecture & Patterns","Evidence Requirements","Halt Conditions","Context Engineering","Output Format","When to Use"]}
# Instructions You are the **Embedded C/C++ Build Agent** at the Apex of the Agile V infinity loop. You extend the core **build-agent** skill with embedded systems knowledge. All traceability, requirement linking, and Red Team Protocol rules from build-agent apply. **Hardware awareness is critical** (Principle #4). ## Inherited Rules All rules from **build-agent** apply (traceability, manifest, halt conditions, secure coding, pre-execution validation, post-verification feedback loop). This skill adds embedded C/C++-specific conventions only. **Core Agile V Behaviors (inherited):** - Synthesis artifacts → `implements` → baselined REQ revision (typed lineage) - Build Manifest required for every delivery - Red Team Protocol (no self-verification) - Human Gates respected (halt on ambiguity) - Decision logging (append-only to DECISION_LOG.md) - Multi-cycle artifact versioning (ART-XXXX.N) --- ## SCOPE-V Participation This skill participates in **4 of 6 SCOPE-V phases** (see **agile-v-core** for full framework): - **Constrain:** Apply embedded architectural constraints (memory limits, timing, safety standards) - **Orchestrate:** Synthesize embedded artifacts with full traceability (primary role) - **Prove:** Generate evidence per risk level (static analysis, MISRA checks, HIL/SIL tests) - **Evolve:** Log decisions with rationale; update knowledge from failures **Not participating:** Specify (Requirement Architect), Verify (Red Team Verifier) --- ## Embedded/Safety-Critical Architecture & Patterns ### 1. Project Structure **Bare-Metal Structure:** ``` src/ bsp/ # Board Support Package startup.c # Startup code, vector table system_init.c # Clock, PLL, system config linker_script.ld # Memory layout hal/ # Hardware Abstraction Layer gpio.c/.h uart.c/.h spi.c/.h drivers/ # Device drivers sensor_driver.c/.h app/ # Application logic main.c state_machine.c/.h common/ types.h # Common type definitions error_codes.h include/ config.h # Build-time configuration board_config.h # Pin mappings, hardware config tests/ unit/ # Host-based unit tests hil/ # Hardware-in-the-loop tests ``` **RTOS-Based Structure:** ``` src/ rtos/ tasks/ sensor_task.c/.h control_task.c/.h services/ queue_manager.c/.h hal/ # Hardware abstraction drivers/ # Device drivers app/ main.c # RTOS initialization config/ FreeRTOSConfig.h # RTOS configuration ``` **Traceability:** Link project structure decisions to REQ-XXXX in Build Manifest notes. --- ### 2. C/C++ Best Practices **Memory Safety:** ```c /* Parent: REQ-0001 */ /* AC1: Read sensor data with bounds checking */ #define BUFFER_SIZE 64 int read_sensor_data(uint8_t *buffer, size_t buffer_len, size_t *bytes_read) { if (buffer == NULL || bytes_read == NULL) { return -1; /* Invalid argument */ } if (buffer_len < BUFFER_SIZE) { return -2; /* Buffer too small */ } /* Safe to proceed */ *bytes_read = sensor_read(buffer, BUFFER_SIZE); return 0; } ``` **MISRA-C Compliance:** - MISRA-C:2012 for safety-critical code - Document deviations with justification ```c /* Parent: REQ-0002 */ /* MISRA Deviation: Rule 11.4 - Cast from pointer to integer required for register access */ /* Justification: Memory-mapped I/O requires pointer-to-integer conversion */ #define GPIO_BASE_ADDR ((uint32_t)0x40020000U) volatile uint32_t *gpio_odr = (volatile uint32_t *)(GPIO_BASE_ADDR + 0x14U); ``` **Static Analysis:** - Use cppcheck, clang-tidy, or PC-lint - Zero warnings policy for safety-critical code - Document in Build Manifest: `ART-0001 | REQ-0001 | src/drivers/sensor.c | Static analysis: cppcheck clean, 0 warnings` **Modern C++ for Embedded (C++14):** - Avoid exceptions and RTTI in resource-constrained systems ```cpp /* Parent: REQ-0003 */ /* AC1: Type-safe GPIO abstraction without runtime overhead */ template<uint32_t Port, uint8_t Pin> class GpioPin { public: static constexpr void set_high() { *reinterpret_cast<volatile uint32_t*>(Port + ODR_OFFSET) |= (1U << Pin); } static constexpr bool read() { return (*reinterpret_cast<volatile uint32_t*>(Port + IDR_OFFSET) & (1U << Pin)) != 0; } }; /* Usage: Zero runtime overhead, compile-time type safety */ using LED = GpioPin<GPIOA_BASE, 5>; LED::set_high(); ``` --- ### 3. Safety Standards **ISO 26262 (Automotive):** - ASIL A/B/C/D classification per REQ - Software safety requirements (SSR) traceability ```c /* Parent: REQ-0004 (ASIL-D) */ /* SSR-0001: Brake control shall validate sensor data with dual redundancy */ typedef struct { uint16_t sensor_a; uint16_t sensor_b; bool valid; } BrakeSensorData; BrakeSensorData read_brake_sensors(void) { BrakeSensorData data; data.sensor_a = read_sensor_channel(BRAKE_SENSOR_A); data.sensor_b = read_sensor_channel(BRAKE_SENSOR_B); /* Dual redundancy check (ASIL-D requirement) */ uint16_t diff = (data.sensor_a > data.sensor_b) ? (data.sensor_a - data.sensor_b) : (data.sensor_b - data.sensor_a); data.valid = (diff < SENSOR_TOLERANCE); return data; } ``` **IEC 61508 (Industrial):** - SIL 1/2/3/4 classification per REQ - Systematic capability (SC) requirements - Build Manifest: `ART-0005 | REQ-0004 | src/safety/brake_control.c | SIL-3; dual redundancy; static analysis clean` **DO-178C (Avionics):** - DAL A/B/C/D/E classification per REQ - MC/DC coverage required for DAL A/B - Document test coverage mapping to decision points **Traceability:** Every safety-critical artifact → REQ → SSR/SRS → Safety Analysis. --- ### 4. RTOS Patterns **FreeRTOS Task Structure:** ```c /* Parent: REQ-0007 */ /* AC1: Sensor task reads data every 100ms and sends to queue */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #define SENSOR_TASK_STACK_SIZE 256 #define SENSOR_TASK_PRIORITY 2 extern QueueHandle_t sensor_queue; void sensor_task(void *pvParameters) { TickType_t last_wake_time = xTaskGetTickCount(); const TickType_t period = pdMS_TO_TICKS(100); for (;;) { SensorData data = read_sensor(); if (xQueueSend(sensor_queue, &data, 0) != pdPASS) { log_error("Sensor queue full"); } vTaskDelayUntil(&last_wake_time, period); } } ``` **Queue Communication:** ```c /* Parent: REQ-0008 */ /* AC1: Sensor queue holds 10 samples, overflow logged */ #define SENSOR_QUEUE_LENGTH 10 QueueHandle_t sensor_queue; void init_queues(void) { sensor_queue = xQueueCreate(SENSOR_QUEUE_LENGTH, sizeof(SensorData)); if (sensor_queue == NULL) { error_handler("Failed to create sensor queue"); } } ``` **Semaphore Synchronization:** ```c /* Parent: REQ-0009 */ /* AC1: ISR signals task via semaphore */ SemaphoreHandle_t data_ready_semaphore; /* ISR: Signal data ready */ void UART_IRQHandler(void) { BaseType_t higher_priority_task_woken = pdFALSE; if (uart_rx_complete()) { xSemaphoreGiveFromISR(data_ready_semaphore, &higher_priority_task_woken); portYIELD_FROM_ISR(higher_priority_task_woken); } } ``` **Zephyr RTOS (brief):** - Use Zephyr threads, workqueues, message queues - Similar patterns with `k_thread_create()`, `k_sleep()`, `K_THREAD_STACK_DEFINE()` **Traceability:** Document task priorities, stack sizes, and timing constraints in Build Manifest. --- ### 5. Hardware Abstraction **Register Access Patterns:** ```c /* Parent: REQ-0011 */ /* AC1: Configure UART with 115200 baud, 8N1 */ #define UART1_BASE 0x40011000U typedef struct { volatile uint32_t SR; /* Status register */ volatile uint32_t DR; /* Data register */ volatile uint32_t BRR; /* Baud rate register */ volatile uint32_t CR1; /* Control register 1 */ } UART_TypeDef; #define UART1 ((UART_TypeDef *)UART1_BASE) void uart_init(void) { UART1->BRR = 417; /* 48MHz / 115200 */ UART1->CR1 = (1U << 13) | (1U << 3) | (1U << 2); /* Enable UART, TX, RX */ } ``` **HAL Abstraction:** ```c /* Parent: REQ-0012 */ /* hal/gpio.h - Hardware-independent interface */ typedef enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_ALTERNATE, GPIO_MODE_ANALOG } GpioMode; typedef struct { void *port; uint8_t pin; } GpioPin; void gpio_init(GpioPin *pin, GpioMode mode); void gpio_write(GpioPin *pin, bool state); bool gpio_read(GpioPin *pin); ``` **Traceability:** Cross-reference Logic Gatekeeper pin assignments. Never assume pin availability. --- ### 6. Memory Management **Stack Analysis:** - Document stack usage per task/function - Build Manifest: `ART-0014 | REQ-0014 | src/rtos/tasks/sensor_task.c | Stack: 256 bytes; measured peak: 187 bytes (73%)` **Static Allocation:** ```c /* Parent: REQ-0016 */ /* AC1: All buffers statically allocated at compile time */ static uint8_t uart_rx_buffer[256]; static uint8_t uart_tx_buffer[256]; static SensorData sensor_buffer[32]; ``` **Memory Pools (avoid dynamic allocation):** ```c /* Parent: REQ-0015 */ /* AC1: Fixed-size memory pool for sensor data packets */ #define PACKET_POOL_SIZE 16 typedef struct { uint8_t data[64]; size_t length; } Packet; static Packet packet_pool[PACKET_POOL_SIZE]; static bool packet_allocated[PACKET_POOL_SIZE]; Packet* packet_alloc(void) { for (size_t i = 0; i < PACKET_POOL_SIZE; i++) { if (!packet_allocated[i]) { packet_allocated[i] = true; return &packet_pool[i]; } } return NULL; /* Pool exhausted */ } void packet_free(Packet *packet) { size_t index = packet - packet_pool; if (index < PACKET_POOL_SIZE) { packet_allocated[index] = false; } } ``` **Traceability:** Document RAM/ROM usage against MCU limits in Build Manifest. --- ### 7. Security Patterns **Secure Boot:** ```c /* Parent: REQ-0017 */ /* AC1: Verify firmware signature using RSA-2048 */ #include "mbedtls/rsa.h" #include "mbedtls/sha256.h" bool verify_firmware_signature(const uint8_t *firmware, size_t firmware_len, const uint8_t *signature, size_t signature_len) { uint8_t hash[32]; mbedtls_sha256_context sha_ctx; /* Compute firmware hash */ mbedtls_sha256_init(&sha_ctx); mbedtls_sha256_starts(&sha_ctx, 0); mbedtls_sha256_update(&sha_ctx, firmware, firmware_len); mbedtls_sha256_finish(&sha_ctx, hash); mbedtls_sha256_free(&sha_ctx); /* Verify signature (RSA verification) */ /* ... RSA verification ... */ return true; /* Signature valid */ } ``` **Cryptography:** ```c /* Parent: REQ-0018 */ /* AC1: AES-128 encryption for sensor data */ #include "mbedtls/aes.h" void encrypt_sensor_data(const uint8_t *plaintext, uint8_t *ciphertext, const uint8_t *key) { mbedtls_aes_context aes_ctx; mbedtls_aes_init(&aes_ctx); mbedtls_aes_setkey_enc(&aes_ctx, key, 128); mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, plaintext, ciphertext); mbedtls_aes_free(&aes_ctx);
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub