前言
- 前几篇博客基本上已经将filex、levelx、threadx、modulex、shell 组件大概都记录了一遍.
- 本篇博客做个综合实际案例记录.
实现效果
代码程序
Modulex组件
源文件
/*
* Copyright (c) 2024-2024,shchl
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-4-19 shchl first version
*/
#include "includes.h"
#if 1
#define MODULE_DATA_SIZE (20*1024) /* 供动态APP使用 */
#define OBJECT_MEM_SIZE (20*1024) /* 供动态APP的动态内存管理申请使用 */
/*
*******************************************************************************************************
* 外部引入变量
*******************************************************************************************************
*/
/*
*******************************************************************************************************
* 变量
*******************************************************************************************************
*/
TX_QUEUE ResidentQueue; /* 消息队列,用于主程序和动态APP通信 */
uint32_t MessageQueuesBuf[100];
/*
*********************************************************************************************************
* 静态全局变量
*********************************************************************************************************
*/
static ULONG memory_faults = 0;
static UCHAR *module_data_area;
static UCHAR *object_memory;
/*
*********************************************************************************************************
* 函数声明
*********************************************************************************************************
*/
static VOID module_fault_handler(TX_THREAD *thread, TXM_MODULE_INSTANCE *module);
/*
*********************************************************************************************************
* 外部函数
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* 函 数 名: module_application_define
* 功能说明: 创建 模块管理任务线程
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
int module_application_define(void) {
UINT status;
/*模块 分配内存空间(使用全局数组的方式)*/
static UCHAR obj_mem[OBJECT_MEM_SIZE];
static UCHAR data_area[MODULE_DATA_SIZE];
/*使用 动态内存分配的方式*/
// object_memory = app_malloc(OBJECT_MEM_SIZE);
// module_data_area = app_malloc(MODULE_DATA_SIZE);
object_memory = obj_mem;
module_data_area = data_area;
/* 创建常驻消息队列 */
if (tx_queue_create(&ResidentQueue, "Resident Queue",
TX_1_ULONG, MessageQueuesBuf,
16 * sizeof(ULONG)) != TX_SUCCESS) {
Error_Handler();
}
/* 初始化动态加载管理器,主要是给动态APP的数据空间使用 */
status = txm_module_manager_initialize((VOID *) module_data_area, MODULE_DATA_SIZE);
if (status != TX_SUCCESS) {
Error_Handler();
}
/* 供动态APP使用的对象内存池,主要各种控制块申请 */
status = txm_module_manager_object_pool_create(object_memory, OBJECT_MEM_SIZE);
if (status != TX_SUCCESS) {
Error_Handler();
}
/* 注册faults管理 */
status = txm_module_manager_memory_fault_notify(module_fault_handler);
if (status != TX_SUCCESS) {
Error_Handler();
}
return TX_SUCCESS;
}
TX_THREAD_EXPORT_LV1(module_application_define); /*首先创建模块应用*/
/*
*********************************************************************************************************
* 函 数 名: module_fault_handler
* 功能说明: 监测faults
* 形 参: ---
* 返 回 值: 无
*********************************************************************************************************
*/
static VOID module_fault_handler(TX_THREAD *thread, TXM_MODULE_INSTANCE *module) {
tx_log("module_fault_handler: thread[%s],module[%s]\r\n", thread->tx_thread_name, module->txm_module_instance_name);
/* 统计错误消息 */
memory_faults++;
}
#endif
Modulex 调用的api接口(对modulex提供的函数进行封装)
头文件
/*
* Copyright (c) 2024-2024,shchl
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-4-19 shchl first version
*/
#ifndef STM32_PROJECT_APP_MODULE_API_H
#define STM32_PROJECT_APP_MODULE_API_H
#include "txm_module.h"
/**
* @brief 模块信息结构体
*/
typedef struct module_info_struct {
#define MODULE_NAME_LEN 32
char module_name[MODULE_NAME_LEN]; /*模块名*/
uint32_t load_addr; /*加载地址地址(适用于flash方式,定位bin数据)*/
TXM_MODULE_INSTANCE instance; /* 模块实例 */
} module_info;
UINT app_txm_module_read(module_info *info, void (*info_out_handle)(TXM_MODULE_INSTANCE *instance, ULONG prop));
UINT app_txm_module_start(module_info *info);
UINT app_txm_module_stop(module_info *info);
UINT app_txm_module_unload(module_info *info);
UINT app_txm_module_fx_load(module_info *info, FX_MEDIA *media_ptr, CHAR *file_name);
UINT app_txm_module_file_load(module_info *info, CHAR *file_name, void (*bin_data_handle)(uint8_t *data, uint16_t len));
#endif //STM32_PROJECT_AP