stm32开发之threadx+modulex+filex+shell组件(实现命令行动态加载程序)

前言

  1. 前几篇博客基本上已经将filex、levelx、threadx、modulex、shell 组件大概都记录了一遍.
  2. 本篇博客做个综合实际案例记录.

实现效果

在这里插入图片描述

代码程序

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

詩不诉卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值