硬汉嵌入式论坛

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

[ThreadX视频教程] 第4期ThreadX视频教程:单片机动态APP加载玩法,像手机电脑一样加载卸载多个应用软件(2022-05-01)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
发表于 2022-5-1 05:56:10 | 显示全部楼层 |阅读模式
单片机动态APP加载玩法就跟安卓应用似的,可以从SD卡,NAND,NOR,  eMMC等各种地方加载应用程序到支持执行程序的SRAM,SDRAM,QSPI Flash,内部Flash等空间执行。

而且支持MPU的话,可以隔离APP,APP死机了系统都不会挂掉。

本期视频教程将基础玩法给大家做个说明,下次视频教程来期高级玩法。

视频:

https://www.bilibili.com/video/BV1hS4y1w75u



本次视频主要分为以下几个内容:
1、应用场景和优缺点
(1) 仅需更新部分程序,协议或者功能时,可以使用动态APP,代码更新量很小。
(2) 芯片内部资源不足时,可以需要什么功能时,加载什么功能APP即可。
(3) 根据用户在主程序里面注册的一批API,实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机电脑安装APP差不多。
(4) 硬件资源需求跟大家独立使用ThreadX实现相应功能是一样的,没有额外的资源需求。

2、动态APP玩法和BOOT + APP加载玩法区别。
最大区别是BOOT程序跳转到APP后,BOOT就不再用到了,而动态APP玩法所有程序都是在运行中,APP可以调用主程序的各种API。

3、实现原理:
通过程序代码给大家介绍下原理。
(1) 主程序中动态加载管理器实现原理,只要资源够,可以加载无限个APP。
(2) 动态APP工程设计。
(3) 动态APP调用主程序API的方法。

4、实战说明:
创建了一个主程序,两个动态加载的APP程序。
image.png

例子下载:
链接:https://pan.baidu.com/s/1I6JJwKWKXHy0wR1QWeqcKw  提取码:ksek

参考资料:
官方文档:
https://docs.microsoft.com/zh-cn ... dx-modules/chapter1

MDK的C库启动过程和初始化,即__main函数的执行全过程
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111658

Tag_ABI_PCS_RO_data, Tag_ABI_PCS_RW_data的作用
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112196


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-1 06:37:51 | 显示全部楼层
更新完毕。
回复

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 2022-5-1 09:01:33 | 显示全部楼层
硬汉,劳动节快乐!辛苦。
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2022-5-1 13:34:51 | 显示全部楼层
能运行多少个程序还是要看内部存储大小吧,运行时复制到内部闪存或者SRAM再运行吗
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2022-5-1 21:23:25 | 显示全部楼层
要是能做成任意RTOS通用那就腻害了。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2022-5-1 21:42:35 | 显示全部楼层
硬汉大哥辛苦! 非常给力
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2022-5-2 11:46:23 | 显示全部楼层
硬汉大哥,这个动态APP,必须是一个APP线程吗?  不可以是一个大函数,供主程序调用吗?谢谢!
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-5-2 15:41:35 | 显示全部楼层
morning_enr6U 发表于 2022-5-2 11:46
硬汉大哥,这个动态APP,必须是一个APP线程吗?  不可以是一个大函数,供主程序调用吗?谢谢!

app程序里面可以创建多个任务的,把函数指针给出来,作为函数库使用理论上没问题。
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-5-2 15:47:57 | 显示全部楼层
视频提到的三个参数不够问题可以参考官方实现

txm_block_pool_create.c 的文件

UINT _txe_block_pool_create(TX_BLOCK_POOL *pool_ptr, CHAR *name_ptr, ULONG block_size, VOID *pool_start, ULONG pool_size, UINT pool_control_block_size)
{

UINT return_value;
ALIGN_TYPE extra_parameters[4];

    extra_parameters[0] = (ALIGN_TYPE) block_size;
    extra_parameters[1] = (ALIGN_TYPE) pool_start;
    extra_parameters[2] = (ALIGN_TYPE) pool_size;
    extra_parameters[3] = (ALIGN_TYPE) pool_control_block_size;

    /* Call module manager dispatcher.  */
    return_value = (UINT) (_txm_module_kernel_call_dispatcher)(TXM_BLOCK_POOL_CREATE_CALL, (ALIGN_TYPE) pool_ptr, (ALIGN_TYPE) name_ptr, (ALIGN_TYPE) extra_parameters);

    /* Return value to the caller.  */
    return(return_value);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-3 07:52:51 | 显示全部楼层
feelingcode 发表于 2022-5-2 15:47
视频提到的三个参数不够问题可以参考官方实现

txm_block_pool_create.c 的文件

好办法。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-3 07:53:55 | 显示全部楼层
morning_enr6U 发表于 2022-5-2 11:46
硬汉大哥,这个动态APP,必须是一个APP线程吗?  不可以是一个大函数,供主程序调用吗?谢谢!

可以的,他本身就是通过动态管理器创建的start函数创建的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-3 07:54:34 | 显示全部楼层
dodo55 发表于 2022-5-1 21:23
要是能做成任意RTOS通用那就腻害了。

动态app是基于threadx实现的,改成其它os的,还是有点难度的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-3 07:55:01 | 显示全部楼层
lovelessing... 发表于 2022-5-1 13:34
能运行多少个程序还是要看内部存储大小吧,运行时复制到内部闪存或者SRAM再运行吗

对,是这样的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-3 07:55:15 | 显示全部楼层
soyshell 发表于 2022-5-1 09:01
硬汉,劳动节快乐!辛苦。

回复

使用道具 举报

36

主题

249

回帖

357

积分

高级会员

积分
357
发表于 2022-5-3 08:20:30 | 显示全部楼层
版主辛苦。期待下期高级玩法
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2022-5-3 10:05:05 | 显示全部楼层
feelingcode 发表于 2022-5-2 15:47
视频提到的三个参数不够问题可以参考官方实现

txm_block_pool_create.c 的文件

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-5-11 09:52:22 | 显示全部楼层
threadX的动态APP是如何实现调用主程序里的API的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-5-11 09:57:37 | 显示全部楼层
tree 发表于 2022-5-11 09:52
threadX的动态APP是如何实现调用主程序里的API的?

视频里面展示了。
回复

使用道具 举报

24

主题

70

回帖

142

积分

初级会员

积分
142
发表于 2022-6-28 15:51:38 | 显示全部楼层
@eric2013,主程序线程和APP线程是如何调度的?
假设有如下线程优先级:
    线程1 (主程序中)      优先级13
    线程2 (主程序中)      优先级16
   APP 的优先级  14
   线程3   (APP中)         优先级   15
   线程4   (APP中)        优先级   16
   线程5   (APP中)        优先级   17
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-6-28 16:17:00 | 显示全部楼层
utyang 发表于 2022-6-28 15:51
@eric2013,主程序线程和APP线程是如何调度的?
假设有如下线程优先级:
    线程1 (主程序中)      优 ...

跟你不使用APP是一样的。任务上的调度没变。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
发表于 2022-6-29 09:53:26 来自手机 | 显示全部楼层
会不会后期考虑出一个iar的版本呢?
回复

使用道具 举报

24

主题

70

回帖

142

积分

初级会员

积分
142
发表于 2022-6-29 11:20:44 | 显示全部楼层
eric2013 发表于 2022-6-28 16:17
跟你不使用APP是一样的。任务上的调度没变。

还有个问题:APP如何访问硬件,是不是只能通过注册的API函数?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-6-29 16:03:19 | 显示全部楼层
utyang 发表于 2022-6-29 11:20
还有个问题:APP如何访问硬件,是不是只能通过注册的API函数?

推荐注册方式访问。

直接访问也是可以的
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-7-19 17:02:25 | 显示全部楼层

threadX的动态APP是如何实现调用主程序里的API的?我查看了申请内存的_txm_module_object_allocate函数发现它通过调用return_value = (UINT) (_txm_module_kernel_call_dispatcher)(TXM_MODULE_OBJECT_ALLOCATE_CALL, (ALIGN_TYPE) object_ptr, (ALIGN_TYPE) object_size, 0)实现;但是没有在动态加载的模块程序中找到_txm_module_kernel_call_dispatcher的定义,只是大概知道它应该调用常驻程序_txm_module_manager_kernel_dispatch实现的,但是中间的过程不太清楚
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-7-21 10:14:12 | 显示全部楼层
tree5124 发表于 2022-7-19 17:02
threadX的动态APP是如何实现调用主程序里的API的?我查看了申请内存的_txm_module_object_allocate函数发 ...

main函数里面要把函数注册好,然后app要调用那个,其实就是个消息处理,根据ID号来识别。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

天宇

积分
24
发表于 2022-9-25 16:24:42 | 显示全部楼层
大神有没有试过IAR如何设计地址无关程序呢?还要主程序和APP程序可以分别使用不同的编译器吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2022-9-26 02:13:52 | 显示全部楼层
cty25 发表于 2022-9-25 16:24
大神有没有试过IAR如何设计地址无关程序呢?还要主程序和APP程序可以分别使用不同的编译器吗?

IAR他们也提供方案了,我没整,后面我搞下。
回复

使用道具 举报

19

主题

233

回帖

290

积分

高级会员

积分
290
发表于 2023-6-26 17:31:56 | 显示全部楼层
视频中,动态加载模块线程的堆栈统计出错了,我自己移植后发现也是这种效果

视频最后演示的截图

视频最后演示的截图

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106590
QQ
 楼主| 发表于 2023-6-27 08:51:50 | 显示全部楼层
tovinz 发表于 2023-6-26 17:31
视频中,动态加载模块线程的堆栈统计出错了,我自己移植后发现也是这种效果

ThreadX的统计方式问题,不加动态APP,统计也有这个问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 03:43 , Processed in 0.277584 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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