跳到主要内容

21 系统模块管理的设计

系统模块化设计:将系统中有关联的部分组合在一起,构成具有特定功能的子系统;模块的内部组成具有较强的耦合性,模块本身具有一定通用性;不同的模块间可以进行相互组合与依赖,进而构成不同的产品。

模块化设计

模块化设计示例

各个模块间需要相互依赖,进而完成产品功能;根据依赖关系能够将模块分为不同的层。

模块间的分层:硬件层,系统层,平台层,框架层,应用层

模块的分级(更细的设计粒度):同一层中的模块根据依赖关系能够继续分级

分层与分级的意义

模块间的依赖关系决定了初始化的前后顺序;被依赖的模块必须先初始化(底层先于上层初始化)。如:硬件层模块先于系统层模块初始化,框架层模块先于应用层模块初始化。

系统架构示例

设计时需要考虑的问题:如何在代码中定义模块?如何定义层级关系(依赖关系)?如何确定模块的初始化顺序?

模块的定义

typedef enum {
MODULE_MODULE, // for module management
MODULE_INTERRUPT, // for interrupt management
MODULE_DEVICE, // for device management
MODULE_CLOCK, // for clock management
MODULE_CONSOLE, // for device of console
MODULE_CTRLC, // for handling Ctrl+C on Linux/Cygwin
MODULE_FLASH, // for device of flash
MODULE_TIMER, // for timer management
MODULE_TASK, // for task
MODULE_SYNC, // for task sync object management
MODULE_SEMAPHORE, // for semaphore management
MODULE_MUTEX, // for mutex management
MODULE_QUEUE, // for queue management
MODULE_HEAP, // for heap management
MODULE_MPOOL, // for memory pool management

MODULE_TESTAPP, // for Test Application

// !!! NOTE: please always put the MODULE_COUNT and MODULE_LAST at the
// end of this enum
MODULE_COUNT,
MODULE_LAST = (MODULE_COUNT - 1)
} module_t;

模块的描述及组织方式

typedef struct {
dll_node_t node_; //链表节点
const char *p_name_; //模块名
module_callback_t callback_; //注册回调函数
bool is_registered_; //注册标记
} module_init_t;

层级关系的定义

typedef enum {
LEVEL_FIRST,
CPU_LEVEL = LEVEL_FIRST,
PERIPHERALS_LEVEL,
DRIVER_LEVEL,
OS_LEVEL,

// for platform layer
PLATFORM_LEVEL0,
PLATFORM_LEVEL1,
PLATFORM_LEVEL2,
PLATFORM_LEVEL3,
PLATFORM_LEVEL4,
PLATFORM_LEVEL5,
PLATFORM_LEVEL6,
PLATFORM_LEVEL7,

// for framework layer
FRAMEWORK_LEVEL0,
FRAMEWORK_LEVEL1,
FRAMEWORK_LEVEL2,
FRAMEWORK_LEVEL3,
FRAMEWORK_LEVEL4,
FRAMEWORK_LEVEL5,
FRAMEWORK_LEVEL6,
FRAMEWORK_LEVEL7,

// for application layer
APPLICATION_LEVEL0,
APPLICATION_LEVEL1,
APPLICATION_LEVEL2,
APPLICATION_LEVEL3,
APPLICATION_LEVEL4,
APPLICATION_LEVEL5,
APPLICATION_LEVEL6,
APPLICATION_LEVEL7,

// LEVEL_COUNT and LEVEL_LAST must be put at the end of this enum
LEVEL_COUNT,
LEVEL_LAST = (LEVEL_COUNT - 1)
} init_level_t;

状态设计

typedef enum {
STATE_INITIALIZING,
STATE_UP,
STATE_DOWN,
STATE_DESTROYING
} system_state_t;

模块的初始化

模块的销毁

实现要点

每一个模块对应一个ID和一个结构体变量module_init_t

模块需要注册后才能被初始化module_register

模块提供一个回调函数module_callback_t用于接受事件。

所有的模块根据层级关系组织于不同链表中

  • 同一个链表中的模块没有依赖关系
  • 整个系统从最底层(最上层)的模块开始进行初始化(销毁)

小结

  • 模块设计是要遵循强内聚弱耦合的原则
  • 模块之间可以相互依赖,并进行模块层级的划分
  • 模块管理是为了系统中各个模块的有序启动和停止
  • 模块设计时需要考虑资源的分配和释放问题