第 1 章:概述

ThreadX 模块组件为应用程序提供了一种基础结构,用于动态地加载独立于应用程序常驻部分构建的模块。 在应用程序代码大小超过可用内存的情况下,此功能尤其有用。 当部署核心映像后需要添加新功能时,它也可以提供帮助。 此外,在需要部分固件更新时,可以使用动态加载模块。

根据模块报头中指定的属性,已加载模块的内存保护是可选的。 指定内存保护时,会配置处理器的内存管理硬件,以便仅允许模块的所有线程访问模块的代码和数据内存。 任何无关的内存访问或执行都将导致内存错误,并将终止有问题的模块线程。 如果应用程序注册了内存错误通知回调,则还将调用此回调来通知应用程序出现内存错误。 请注意,同一模块中存在的线程将彼此共享资源。 这意味着单个模块中的多个线程可以访问相同的内存和其他资源,而不会受到内存保护机制的干扰。

ThreadX 模块组件依赖应用程序提供可在其中加载模块的内存区域。 每个模块的指令区域可能会就地执行,或将其复制到 RAM 模块内存区域中进行执行。 在所有情况下,都将从模块内存区域中分配模块数据内存要求。

不限制可同时加载的模块数量(除了可用的内存量以外),而常驻模块管理器代码只能有一个副本。 图 1 说明了模块管理器与模块本身之间的关系。

模块和模块管理器关系

图 1 模块和模块管理器

每个模块都必须有其自己的内存区域,这是定义的应用程序的责任。 模块和模块管理器利用相对于模块请求的 ThreadX 服务的预定义请求 ID 通过软件调度函数进行交互。 此外,此模块还需要提供单个线程入口点以及所需的堆栈大小、优先级、模块 ID、回调线程堆栈大小/优先级等。此信息定义在每个模块的报头中。

模块管理器负责创建初始模块线程并开始其执行。 模块的初始线程开始执行后,模块管理器负责处理模块发出的所有 ThreadX API 请求。 模块对 ThreadX API 具有完全访问权限,包括可以在模块中创建其他线程。

模块源代码命名约定非常简单:所有模块管理器源文件都命名为 txm_module_manager,所有与模块专门关联的文件将省略该名称的“manager”部分。 主要 include 文件 txm_module.h 通过管理器和模块源代码分享。