emcell 0.0.4

Reserve flash memory regions to safely keep multiple binary and library binaries (cells) on a microcontroller. The cells can call functions from other cells.
Documentation
use crate::CellType;

#[derive(Copy, Clone)]
pub struct CellDefMeta {
    pub name: &'static str,
    pub cell_type: CellType,

    pub ram_range_start_offs: usize,
    pub ram_range_end_offs: usize,

    pub flash_range_start_offs: usize,
    pub flash_range_end_offs: usize,

    pub struct_sha256: [u8; 32],
}

#[derive(Copy, Clone)]
pub struct DeviceConfigMeta {
    pub initial_stack_ptr: usize,
    pub ram_range_start: usize,
    pub ram_range_end: usize,
    pub flash_range_start: usize,
    pub flash_range_end: usize,
}


#[derive(Copy, Clone)]
pub struct CellDefsMeta<const N: usize> {
    pub device_configuration: DeviceConfigMeta,
    pub cell_defs: [CellDefMeta; N]
}

impl<const N: usize> CellDefsMeta<N> {
    pub fn for_cell(&'static self, cell_name: &str) -> Option<&'static CellDefMeta> {
        self.cell_defs.iter().find(|cell| cell.name == cell_name)
    }
}

impl CellDefMeta {

    pub const fn absolute_ram_start(&self, device_config_meta: &DeviceConfigMeta) -> usize {
        device_config_meta.ram_range_start + self.ram_range_start_offs
    }
    pub const fn absolute_ram_end(&self, device_config_meta: &DeviceConfigMeta) -> usize {
        device_config_meta.ram_range_start + self.ram_range_end_offs
    }
    pub const fn absolute_flash_start(&self, device_config_meta: &DeviceConfigMeta) -> usize {
        device_config_meta.flash_range_start + self.flash_range_start_offs
    }
    pub const fn absolute_flash_end(&self, device_config_meta: &DeviceConfigMeta) -> usize {
        device_config_meta.flash_range_start + self.flash_range_end_offs
    }
}