Skip to content

8-bit PIC Memory Constraints Analysis

Overview

Analysis of memory limitations in 8-bit PIC microcontrollers and their impact on C++ implementation feasibility.

PIC8 Memory Architecture

Harvard Architecture Characteristics

  • Separate Program and Data Memory: Cannot execute code from data memory
  • Limited Data Memory: Typically 32 bytes to 4KB total
  • Bank Switching: Data memory divided into banks (128-256 bytes each)
  • Special Function Registers: Overlay data memory space
  • Stack Limitations: Hardware stack, typically 8-32 levels deep

Memory Map Structure

Program Memory (Flash)
├── Reset Vector (0x0000)
├── Interrupt Vector (0x0004/0x0008)
├── User Code Space
└── Configuration Bits

Data Memory (RAM)
├── Bank 0: General Purpose + SFRs
├── Bank 1: General Purpose + SFRs  
├── Bank N: Additional banks
└── Common RAM (accessible from all banks)

Device Memory Specifications

PIC10F Family (Ultra Low-End)

Device Program RAM Stack C++ Feasible?
PIC10F200 256 words 16 bytes 2 levels ❌ No
PIC10F206 512 words 24 bytes 2 levels ❌ No
PIC10F320 256 words 64 bytes 8 levels ❌ No

Analysis: Too constrained for any meaningful C++ usage.

PIC12F Family (Low-End)

Device Program RAM Stack C++ Feasible?
PIC12F508 512 words 25 bytes 2 levels ❌ No
PIC12F629 1K words 64 bytes 8 levels ❌ Unlikely
PIC12F1822 2K words 128 bytes 16 levels ⚠️ Maybe
PIC12F1840 4K words 256 bytes 16 levels ⚠️ Possible

Analysis: Only the newer 12F devices might support minimal C++.

PIC16F Family (Mid-Range)

Device Program RAM Stack C++ Feasible?
PIC16F84A 1K words 68 bytes 8 levels ❌ No
PIC16F628A 2K words 224 bytes 8 levels ⚠️ Maybe
PIC16F877A 8K words 368 bytes 8 levels ✅ Likely
PIC16F18857 32K words 2K bytes 16 levels ✅ Yes

Analysis: Modern 16F devices with >1KB RAM could support C++.

PIC18F Family (High-End 8-bit)

Device Program RAM Stack C++ Feasible?
PIC18F2520 16K words 1.5K bytes 31 levels ✅ Yes
PIC18F4550 32K words 2K bytes 31 levels ✅ Yes
PIC18F47K42 64K words 4K bytes 31 levels ✅ Yes

Analysis: All modern 18F devices should support C++ reasonably well.

C++ Memory Overhead Analysis

Minimal C++ Runtime Requirements

Essential Components

// Estimated memory overhead
void* operator new(size_t size);      // ~50 bytes
void operator delete(void* ptr);      // ~30 bytes
void __cxa_pure_virtual();           // ~20 bytes
// Total: ~100 bytes minimum

Class Implementation Overhead

class SimpleClass {
    int value;                        // 2 bytes
    void method();                    // No overhead if not virtual
};
// Instance overhead: 2 bytes
// Code overhead: Actual method code only

Virtual Function Overhead

class VirtualClass {
    virtual void method();            // +2 bytes for vtable pointer
};
// Per instance: +2 bytes
// Per virtual method: +2 bytes in vtable
// Virtual call: +~10 bytes overhead per call

Memory Usage Examples

Simple Class Usage

class LED {
    bool state;                       // 1 byte
    uint8_t pin;                      // 1 byte
public:
    void on() { state = true; }       // Inline, no overhead
    void off() { state = false; }     // Inline, no overhead
};

LED led1, led2;                      // 4 bytes total
Overhead: Essentially zero vs equivalent C code.

Template Usage (if supported)

template<uint8_t PIN>
class TemplateLED {
    bool state;                       // 1 byte per instance
    // PIN is compile-time constant, no storage
public:
    void toggle() { /* ... */ }       // Code generated per PIN value
};

TemplateLED<2> led1;                  // 1 byte
TemplateLED<3> led2;                  // 1 byte + duplicate code
Overhead: Code duplication for each template instantiation.

Feasibility Assessment by Device Class

Definitely Feasible (✅)

Requirements: >1KB RAM, >8K program memory, modern architecture - PIC18F family (most devices) - PIC16F with Enhanced Mid-Range core and >1KB RAM - Suitable for: Classes, simple inheritance, basic templates

Possibly Feasible (⚠️)

Requirements: 256-1KB RAM, >2K program memory - Newer PIC12F devices (12F1822+) - Mid-range PIC16F with sufficient RAM - Suitable for: Simple classes, no inheritance, minimal features

Not Feasible (❌)

Requirements: <256 bytes RAM or <2K program memory - PIC10F family (all devices) - Older PIC12F devices - Basic PIC16F devices - Too constrained for meaningful C++ usage

Memory Optimization Strategies

Code Size Optimization

  1. Aggressive Inlining: Eliminate function call overhead
  2. Template Specialization: Reduce code duplication
  3. Compiler Optimizations: -Os optimization level
  4. Feature Subset: Only enable essential C++ features

RAM Usage Optimization

  1. Stack Management: Careful stack usage monitoring
  2. Static Allocation: Avoid dynamic allocation completely
  3. Bank Optimization: Efficient use of banked memory
  4. Overlay Techniques: Reuse memory for temporary objects

Allowed Features

  • ✅ Classes and member functions
  • ✅ Constructors and destructors (simple)
  • ✅ Function overloading
  • ✅ References
  • ✅ Inline functions
  • ✅ Simple templates (limited instantiation)
  • ✅ Operator overloading

Restricted Features

  • ⚠️ Virtual functions (only if >1KB RAM)
  • ⚠️ Inheritance (simple only)
  • ⚠️ Multiple inheritance (not recommended)

Prohibited Features

  • ❌ Dynamic allocation (new/delete)
  • ❌ Exceptions
  • ❌ RTTI
  • ❌ STL
  • ❌ Complex templates

Target Device Recommendations

Primary Targets (Best C++ Support)

  1. PIC18F47K42: 64K program, 4KB RAM - Full C++ subset
  2. PIC18F4550: 32K program, 2KB RAM - Good C++ support
  3. PIC16F18857: 32K program, 2KB RAM - Modern mid-range

Secondary Targets (Limited C++ Support)

  1. PIC16F877A: 8K program, 368B RAM - Basic C++ classes
  2. PIC12F1840: 4K program, 256B RAM - Very limited C++

Testing Priorities

  1. Start with PIC18F47K42 (best case scenario)
  2. Validate on PIC16F18857 (modern mid-range)
  3. Test limits with PIC16F877A (minimal viable)
  4. Stretch goal: PIC12F1840 (extreme constraint)

Conclusions

Feasibility Summary

  • High-end 8-bit PICs: C++ is definitely feasible with careful design
  • Mid-range PICs: Limited C++ subset possible
  • Low-end PICs: Not practical for C++ development
  1. Target Modern Devices: Focus on PIC18F and newer PIC16F
  2. Subset Implementation: Support only essential C++ features
  3. Aggressive Optimization: Prioritize code size and RAM usage
  4. Clear Documentation: Define supported subset and limitations

Memory Requirements for Minimal C++ Support

  • Minimum RAM: 256 bytes (very limited features)
  • Recommended RAM: 1KB+ (reasonable C++ subset)
  • Optimal RAM: 2KB+ (most C++ features except prohibited ones)
  • Program Memory: 4KB minimum, 16KB+ recommended