Skip to content

JH7110多系统间通讯设计

JH7110 hart0:hart0不支持S态,只能运行在M态

因此采用以下架构:

  • hart0 (M态): embassy_preempt RTOS
  • hart1-4 (S态): Linux/StarryOS

系统架构

JH7110非对称多处理器配置

  • hart0: embassy_preempt独占M态(无OpenSBI层)
  • hart1-4: 标准配置(OpenSBI M态 + Linux S态)
┌─────────────────────────────────────────────────────────────────┐
│                    JH7110 SoC                                   │
├─────────────────────────────────────────────────────────────────┤
│  hart0                    │  hart1-4                           │
│  ┌──────────────────┐     │  ┌──────────────────────────────┐  │
│  │embassy_preempt   │     │  │ OpenSBI (M态)                │  │
│  │     (M态)        │     │  │                              │  │
│  │                  │     │  │ ┌──────────────────────────┐ │  │
│  │ ┌──────────────┐ │     │  │  │SBI扩展                  │ │  │
│  │ │直接硬件访问  │ │     │  │  │- hart0 MSIP0操作        │ │  │
│  │ │- CLINT读写   │ │     │  │  │- 跨hart通信             │ │  │
│  │ │- MSIP0中断   │ │     │  │  │- 权限验证              │ │  │
│  │ │- 消息处理    │ │     │  │  └──────────────────────────┘ │  │
│  │ └──────────────┘ │     │  └──────────────────────────────┘  │
│  └──────────────────┘     │              ↓                      │
│         ↓                 │  ┌──────────────────────────────┐  │
│                           │  │ Linux (S态)                  │  │
│                           │  │                              │  │
│                           │  │ ┌──────────────────────────┐ │  │
│                           │  │  │SSI中断处理              │ │  │
│                           │  │  │- 检查共享内存          │ │  │
│                           │  │  │- 消息处理              │ │  │
│                           │  │  │- SBI调用               │ │  │
│                           │  │  └──────────────────────────┘ │  │
│                           │  └──────────────────────────────┘  │
│         ↕                  │              ↓                      │
│  ┌──────────────────┐     │  ┌──────────────────────────────┐  │
│  │ 共享内存访问     │◄────┼──┼─ 共享内存访问                │  │
│  │ - 消息队列       │     │  │ - 消息队列                   │  │
│  │ - 同步原语       │     │  │ - 同步原语                   │  │
│  └──────────────────┘     │  └──────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

               ┌─────────────────────┐
               │   CLINT (0x02000000) │
               │   MSIP0-4 寄存器     │
               │   中断委托(mideleg)  │
               └─────────────────────┘

中断流向:
• Linux → SBI ecall → OpenSBI设置MSIP0 → embassy_preempt MSI中断
• embassy_preempt → MSIP1-4 → Linux SSIP中断(通过mideleg委托)

IPI通信机制

场景1: Linux → OpenSBI → embassy_preempt


场景2: embassy_preempt → Linux(完整流程)


共享内存设计

内存布局


┌────────────────────────────────────────┐
│  magic number和版本 (16 bytes)         │
├────────────────────────────────────────┤
│  Linux → RTOS 消息队列 (8KB)           │
│  - 环形缓冲区                           │
│  - 读/写索引                           │
│  - 消息计数                            │
├────────────────────────────────────────┤
│  RTOS → Linux 消息队列 (8KB)           │
│  - 环形缓冲区                           │
│  - 读/写索引                           │
│  - 消息计数                            │
├────────────────────────────────────────┤
│  同步和状态区域 (8KB)                  │
│  - 原子标志位                           │
│  - 心跳计数器                          │
│  - 错误状态                            │
├────────────────────────────────────────┤
│  大数据传输区 (40KB)                   │
│  - 用于传递大数据块                     │
└────────────────────────────────────────┘

消息队列结构

rust
#[repr(C)]
struct SharedMessageQueue {
    // 魔数用于验证共享内存初始化
    magic: AtomicU32,        // 0xDEADBEEF
    version: AtomicU32,      // 版本号

    // Linux → RTOS 队列
    linux_to_rtos: MessageQueue,

    // RTOS → Linux 队列
    rtos_to_linux: MessageQueue,

    // 同步原语
    sync: SyncFlags,
}

#[repr(C)]
struct MessageQueue {
    // 环形缓冲区
    buffer: [Message; 256],  // 每个消息32字节

    // 读写索引
    read_idx: AtomicU16,
    write_idx: AtomicU16,

    // 消息计数
    count: AtomicU16,

    // 统计信息
    sent: AtomicU64,      // 发送消息总数
    received: AtomicU64,  // 接收消息总数
    dropped: AtomicU64,   // 丢弃消息数
}

#[repr(C)]
struct Message {
    msg_type: u32,        // 消息类型
    length: u32,          // 数据长度
    timestamp: u64,       // 时间戳
    data: [u8; 16],       // 小数据内联
}

#[repr(C)]
struct SyncFlags {
    // IPI触发标志
    linux_pending: AtomicBool,   // Linux有待处理消息
    rtos_pending: AtomicBool,    // RTOS有待处理消息

    // 心跳
    linux_heartbeat: AtomicU64,
    rtos_heartbeat: AtomicU64,

    // 状态
    linux_ready: AtomicBool,
    rtos_ready: AtomicBool,

    // 错误计数
    linux_errors: AtomicU32,
    rtos_errors: AtomicU32,
}