硬汉嵌入式论坛

 找回密码
 立即注册
查看: 515|回复: 2
收起左侧

[RTOS] ThreadX单片机动态APP加载,模组APP接管模组管理器串口

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 2023-11-7 14:56:00 | 显示全部楼层 |阅读模式
本帖最后由 冬菇小雪 于 2023-11-7 15:06 编辑

ThreadX的动态APP加载玩法详见硬汉哥的视频教程:
第4期ThreadX视频教程:单片机动态APP加载玩法,像手机电脑一样加载卸载多个应用软件(2022-05-01)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112203&fromuid=59441
(出处: 硬汉嵌入式论坛)


参考硬汉哥的教程完成了ThreadX Module的移植,模组APP调用内核注册的API实现一些基本功能是没有问题的(LED闪烁、串口打印等),但我希望APP和内核能够共用某一硬件外设(比如串口),且模组启动后设备对该外设采取完全不同的响应模式(比如采用不同的串口协议)。再次强调一下背景,单片机的所有外设均由内核程序完成初始化和管理(HAL库),为了尽可能降低APP的容量,禁止其直接操作单片机寄存器,所有功能必须通过调用内核API完成。
很显然,如果只使用模组APP--------------->API(本质是消息队列)--------------->内核程序单方向的数据流向是无法实现上述功能的,需要实现外设接收到数据后,由内核通知模组APP进行处理的途径。

方案非常简单,在内核注册一个串口接收数据重定向的API,该API可以修改接收数据的缓存地址,如果有需要也可以将模组APP的串口CLI线程ID一并告知内核。
模组APP启动后调用上述API,将自身串口CLI线程的TX_THREAD和数据接收缓存的地址作为参数传递给内核,之后,内核接收到串口数据后将其转交至模组APP而非自身的处理线程即可。
由于模组APP的使用的线程也是内核帮忙创建的,所以只要知道线程ID,内核也能对该线程执行各种操作。

内核中的串口DMA空闲中断回调,实际使用的数据处理柄是可替换的
串口回调.png
内核中使用的数据处理句柄:
内核串口处理句柄.png
串口功能相关的API注册列表,倒数第二个是串口接收重定向:
串口API.png
重定向完成后接收到的数据会复制到新的缓存地址,并以线程唤醒的形式通知模组APP处理:
重定向后的串口处理句柄.png
模组APP中的串口数据处理线程,仅作测试使用:
模块串口处理线程.png
实际效果,模组加载前是一个简单的串口命令行服务,模组加载后执行简单的接收数据打印:
调试记录.png

另外为了能够卸载模组,额外添加了发送"__"将重置串口接收处理句柄的协议。尝试过注册一个卸载当前模组APP的API供应用程序自己卸载自己,发现卸载不成功,查看了一下卸载流程发现需要释放模组申请的所有线程、消息队列等,而内核与模组也是通过专用的消息队列实现API调用功能的,推测是该线程无法被正确释放导致APP卸载不成功。



评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2023-11-7 16:32:36 | 显示全部楼层
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-8 08:03:22 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 05:12 , Processed in 0.173832 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表