AgentSkillsCN

Architecture

架构

SKILL.md
skill
---
name: ncs-architecture
description: Architecture patterns for Nordic NCS projects - simple multi-threaded vs SMF+zbus modular
parent: ncs-project
---

# Architecture Patterns Subskill  

Choose the right architecture for your Nordic NCS project.

## 🎯 Two Patterns Available

### 1. Simple Multi-Threaded

**Best for**: 1-3 threads, simple control flow, quick prototypes

```bash
cp ~/.claude/skills/Developer/ncs/project/architecture/simple-multithreaded/templates/* src/
cp ~/.claude/skills/ProductManager/ncs/features/overlays/overlay-multithreaded.conf .
```

**Features**:
- K_MSGQ for inter-thread communication
- K_SEM for synchronization
- K_MUTEX for resource protection
- Atomic state management
- Blocking and non-blocking APIs

**Memory**: 8KB heap (lower overhead)

### 2. SMF + zbus Modular

**Best for**: 4+ modules, complex state machines, production systems

```bash
# Copy example modules (choose what you need)
cp -r ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/button_example src/modules/button
cp -r ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/sensor_example src/modules/sensor
cp -r ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/data_processor_example src/modules/data_processor

# Copy common message definitions
cp ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/common/messages.h src/modules/

# Copy configuration overlay
cp ~/.claude/skills/ProductManager/ncs/features/overlays/overlay-smf-zbus.conf .
```

**Features**:
- State Machine Framework (SMF)
- Message bus (zbus) for decoupled communication
- Task watchdog integration
- Run-to-completion model
- Follows Nordic Asset Tracker Template pattern
- **Professional module organization**: Each module is self-contained with CMakeLists.txt, Kconfig, source files

**Memory**: 16KB heap (higher for message bus)

## 📖 Comprehensive Guide

**[ARCHITECTURE_PATTERNS.md](architecture/guides/ARCHITECTURE_PATTERNS.md)** (~20,000 tokens)
- Deep comparison of both patterns
- Decision tree for choosing
- Full implementation examples
- Migration path simple → modular
- Best practices from Nordic

## 📊 Quick Comparison

| Aspect | Simple Multi-Threaded | SMF+zbus Modular |
|--------|----------------------|------------------|
| **Complexity** | Low | Medium |
| **Scalability** | Poor (3+ threads) | Excellent |
| **Coupling** | Tight | Loose |
| **Memory** | 8KB heap | 16KB heap |
| **Setup Time** | < 1 hour | 2-4 hours |
| **Maintenance** | Ha (Asset Tracker Template Pattern)

**Complete module examples** (copy into your `src/modules/` directory):

- **`modules/button_example/`** - Button input handler
  - `button.c`, `button.h` - State machine for button events
  - `CMakeLists.txt` - Module build configuration
  - `Kconfig.button` - Module-specific Kconfig options
  - Demonstrates: GPIO input, debouncing, zbus publishing

- **`modules/sensor_example/`** - Environmental sensor module
  - `sensor.c`, `sensor.h` - Periodic sensor reading with SMF
  - `CMakeLists.txt`, `Kconfig.sensor`
  - Demonstrates: Sensor drivers, periodic sampling, data publishing

- **`modules/data_processor_example/`** - Data processing module
  - `data_processor.c`, `data_processor.h` - Process incoming data
  - `CMakeLists.txt`, `Kconfig.data_processor`
  - Demonstrates: zbus subscription, data transformation, state management

- **`modules/common/messages.h`** - Shared message definitions for all modules

Each module is **production-ready** and follows Nordic's best practices from Asset Tracker Template.
- `module_template_simple.c` (~450 lines)
- `module_template_simple.h`
- `Kconfig.module_template_simple`

### SMF + zbus Modular
- `module_template_smf.c` (~400 lines)
- `module_template_smf.h`
- `Kconfig.module_template`
- `messages.h` (common message definitions)

## 🚀 Usage

### Simple Multi-Threaded
```bash
# Copy template and build
cp ~/.claude/skills/Developer/ncs/project/architecture/simple-multithreaded/templates/* src/
west build -p -b nrf7002dk/nrf5340/cpuapp -- \
  -DEXTRA_CONF_FILE="overlay-multithreaded.conf"
```

### SMF + zbus Modular (Recommended)
```bash
# 1. Create modules directory structure
mkdir -p src/modules

# 2. Copy example modules (customize module names as needed)
cp -r ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/button_example src/modules/button
cp -r ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/sensor_example src/modules/sensor
cp ~/.claude/skills/Developer/ncs/project/architecture/smf-zbus/modules/common/messages.h src/modules/

# 3. In your main CMakeLists.txt, add:
#    add_subdirectory(src/modules/button)
#    add_subdirectory(src/modules/sensor)

# 4. Build
west build -p -b nrf7002dk/nrf5340/cpuapp -- \
  -DEXTRA_CONF_FILE="wifi-sta.conf;overlay-smf-zbus.conf"
```

**Module Organization** (follows Asset Tracker Template):
```
your_project/
├── CMakeLists.txt
├── prj.conf
└── src/
    ├── main.c
    └── modules/
        ├── messages.h          # Common message definitions
        ├── button/             # Button module
        │   ├── button.c
        │   ├── button.h
        │   ├── CMakeLists.txt
        │   └── Kconfig.button
        └── sensor/             # Sensor module
            ├── sensor.c
            ├── sensor.h
            ├── CMakeLists.txt
            └── Kconfig.sensor
```

For complete details and decision guidance, see [ARCHITECTURE_PATTERNS.md](architecture/guides/ARCHITECTURE_PATTERNS.md)