硬汉嵌入式论坛

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

[ThreadX全家桶] 厉害了,ThreadX把动态应用加载和多核应用也开源了,这力度可以

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
发表于 2020-8-8 15:09:22 | 显示全部楼层 |阅读模式
官方这次升级直接把之前的6.0.1覆盖掉了,新制作了一个6.0.1版本。

早期基于ThreadX和Nucleus(ThreadX的前身)手机也很多,所以ThreadX这块的应用还是比较成熟的,可玩性居高。

动态应用加载文档:
ThreadX_Modules_Cortex-M7_IAR.pdf (1.53 MB, 下载次数: 837)
ThreadX_Modules_Cortex-M4_IAR.pdf (1.53 MB, 下载次数: 844)

已经包含在内核源码包里面:
threadx-6.0.1_rel.zip (21.39MB)


本次更新除了非常完善的各种核底层port文件,MDK的AC5,AC6,IAR和GCC全整上了。
1.png

最重要的还是加入了动态应用加载源文件和port文件:
5.png
多核方面支持的内核,支持AC5和GCC,这个的AC5貌似要在ARM Development Studio操作A核。
2.png







评分

参与人数 2金币 +40 收起 理由
xode + 20 很给力!
missfox + 20 很给力!

查看全部评分

回复

使用道具 举报

25

主题

99

回帖

179

积分

初级会员

积分
179
发表于 2020-8-8 15:23:30 | 显示全部楼层
在哪里啊???
回复

使用道具 举报

25

主题

99

回帖

179

积分

初级会员

积分
179
发表于 2020-8-8 15:34:16 | 显示全部楼层
有的玩了,国产的这种APP跟系统分离的还在各种收费。
回复

使用道具 举报

2

主题

3

回帖

9

积分

新手上路

积分
9
发表于 2020-8-8 16:33:50 | 显示全部楼层
板子到了,坐等教程
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-8-8 16:34:34 | 显示全部楼层
xujun 发表于 2020-8-8 15:23
在哪里啊???

专门更新到这个帖子里面了
回复

使用道具 举报

18

主题

285

回帖

339

积分

高级会员

积分
339
发表于 2020-8-8 16:52:10 | 显示全部楼层
我去,这个是不是类似手机上的可以打开某个应用程序(module1),后再关闭它,再打开另一个(module2)呢?是的话这样就类似进程了,打开或关闭某个进程,如果某个进程死了我关闭它再打开它就好了。这样的话就完全和大型操作系统一样了,以后只要写app就可以了mo-[偷笑]
回复

使用道具 举报

2

主题

55

回帖

61

积分

初级会员

积分
61
发表于 2020-8-8 18:15:48 | 显示全部楼层
微软这是要一统江湖啊
回复

使用道具 举报

1

主题

21

回帖

24

积分

新手上路

积分
24
发表于 2020-8-8 19:09:36 | 显示全部楼层
动态应用加载为什么只能IAR不能MDK,巧合的是RTT的动态加载也是这样。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-8-8 19:56:05 | 显示全部楼层
ecsihust 发表于 2020-8-8 19:09
动态应用加载为什么只能IAR不能MDK,巧合的是RTT的动态加载也是这样。


必须可以MDK啊

QQ截图20200808195606.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-8-8 19:56:45 | 显示全部楼层
木兰花 发表于 2020-8-8 16:52
我去,这个是不是类似手机上的可以打开某个应用程序(module1),后再关闭它,再打开另一个(module2)呢? ...

是的,APP编程。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-8-8 21:26:13 | 显示全部楼层
threadx 咋一个c文件里面就一个函数  这啥风格 这是?》!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-8-8 21:32:24 | 显示全部楼层
unsv29 发表于 2020-8-8 21:26
threadx 咋一个c文件里面就一个函数  这啥风格 这是?》!!!

将这些文件都添加到工程里面后,会发现查找函数非常方便。
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2020-8-8 23:24:19 | 显示全部楼层
谁有空搞个动态加载bin的mdk工程?
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2020-8-9 09:55:59 | 显示全部楼层
代码不规范,亲人两行泪!
回复

使用道具 举报

0

主题

11

回帖

11

积分

新手上路

积分
11
发表于 2020-8-10 17:45:34 | 显示全部楼层
非常强大!有得玩了!
回复

使用道具 举报

39

主题

928

回帖

1050

积分

至尊会员

积分
1050
发表于 2020-8-10 18:18:56 | 显示全部楼层
动态应用加载有机会研究一下
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-8-10 20:00:28 | 显示全部楼层
这个动态加载,非常具备可玩性。谢谢硬汉大哥的分享。
回复

使用道具 举报

16

主题

87

回帖

135

积分

初级会员

积分
135
发表于 2020-8-14 15:35:58 | 显示全部楼层

反而不支持GCC。 这是什么鬼!
不知道后续Module是否会支持GCC。这样可以吧Module开发给客户了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
 楼主| 发表于 2020-8-14 16:11:12 | 显示全部楼层
gpfrank 发表于 2020-8-14 15:35
反而不支持GCC。 这是什么鬼!
不知道后续Module是否会支持GCC。这样可以吧Module开发给客户了。

期待GCC也整上,这样MDK ,IAR和GCC三大平台齐聚,做教程也舒服。
回复

使用道具 举报

0

主题

57

回帖

57

积分

初级会员

积分
57
发表于 2020-8-17 11:20:57 | 显示全部楼层
xujun 发表于 2020-8-8 15:34
有的玩了,国产的这种APP跟系统分离的还在各种收费。

rt-thread免费呀
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-12-11 15:36:54 | 显示全部楼层
大家知道 ThreadX 的动态模块是怎么编译出来的吗?
我看 module load 过程中并没有做 relocation 之类的操作,如果没有和os 一起编译,symbol 是怎么对的上的呢?
回复

使用道具 举报

3

主题

335

回帖

344

积分

高级会员

积分
344
发表于 2020-12-11 22:40:13 | 显示全部楼层
别抱多大期待,这种特性通常都是雷声大雨点小;或者官方也只是说着无心,听着有意。
回复

使用道具 举报

19

主题

371

回帖

428

积分

高级会员

积分
428
发表于 2020-12-12 11:42:34 | 显示全部楼层
一个C文件只有一个函数的风格,比较适合源码储存在网络中心数据库(有代码版本管理系统),多人通过网络协作的开发方式,GNU的C库好像也是这个样子
回复

使用道具 举报

5

主题

28

回帖

43

积分

新手上路

积分
43
发表于 2020-12-17 16:05:51 | 显示全部楼层
南国时代 发表于 2020-12-11 15:36
大家知道 ThreadX 的动态模块是怎么编译出来的吗?
我看 module load 过程中并没有做 relocation 之类的操 ...

如果使用kernel的api,一般都是使用指针传递给module的一个函数指针结构体,但是threadx我还没看过。。。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2020-12-20 22:58:11 | 显示全部楼层
wkler 发表于 2020-12-17 16:05
如果使用kernel的api,一般都是使用指针传递给module的一个函数指针结构体,但是threadx我还没看过。。。

动态地址运行
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-11-24 17:11:18 | 显示全部楼层
这个系统的动态编译的原理是啥啊,怎么实现的??
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2021-11-24 18:36:11 | 显示全部楼层
这样就可以从外置存储器比如SD卡拷贝bin文件运行了吗?
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2021-11-24 20:05:55 | 显示全部楼层
Dingtalk_20211124200448.png

这里面没有MDK的工程啊? 是不是漏掉了?
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2022-1-18 18:33:48 | 显示全部楼层
请教一下,这个动态应用加载是加载类似elf格式的文件吗?MODULES跟CPU架构有关系是能理解,看图片里为什么MODULES跟具体的芯片还有关系呢?
回复

使用道具 举报

2

主题

75

回帖

81

积分

初级会员

积分
81
发表于 2022-1-20 09:53:03 | 显示全部楼层
lxy555 发表于 2022-1-18 18:33
请教一下,这个动态应用加载是加载类似elf格式的文件吗?MODULES跟CPU架构有关系是能理解,看图片里为什么M ...

不是的,是BIN文件,类似普通Cortex-M跑上来是中断向量表,这个模块的最开始是一个特定的数据,含有模块的一些配置信息。
没有和具体IC型号有关系。
回复

使用道具 举报

2

主题

75

回帖

81

积分

初级会员

积分
81
发表于 2022-1-20 09:54:21 | 显示全部楼层
模块里,C库好像用不起来?编译器基本都没有提供位置不相关环境下的库,memset,printf等等都要自己实现,很麻烦。
看来用起来方便还是要按照固定地址编译。
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-1-21 09:19:35 | 显示全部楼层
eggplant886 发表于 2022-1-20 09:54
模块里,C库好像用不起来?编译器基本都没有提供位置不相关环境下的库,memset,printf等等都要自己实现,很 ...

动态模块可以stmcubeide单独编译的,ST有提供动态应用模块的例程。如果使用threadx源文件提供的动态模块例子就要自己实现printf和menset。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-1-24 11:18:28 | 显示全部楼层
feelingcode 发表于 2022-1-21 09:19
动态模块可以stmcubeide单独编译的,ST有提供动态应用模块的例程。如果使用threadx源文件提供的动态模块 ...

printf 是如何实现的?它是个可变参数的函数,参数多的时候会通过栈传参数,以前想自己实现但还没想到好的方法,因为从代码看我觉得发起 svc 系统调用后栈就切换了。
把要输出的最终字符串用 sprintf 补齐,再把这单个字符串打印出来倒是可以。
像这种变参或者参数特别多的函数如何实现一个模块应用封装,能否把官方实现的例子发一下?
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-1-24 15:11:55 | 显示全部楼层
本帖最后由 luguan1997 于 2022-1-24 16:06 编辑
eggplant886 发表于 2022-1-20 09:54
模块里,C库好像用不起来?编译器基本都没有提供位置不相关环境下的库,memset,printf等等都要自己实现,很 ...

c 库应该是静态的原因所以动态模块没法用吧,动态模块代码要地址无关的选项去编译。
memcpy snprintf 这类函数的 .c 可以 github 上搜下 newlibc 的 c 实现,放到模块里一起编译就行,有些宏定义要处理。
动态加载 rtthread 也实现了,是用 elf 格式的加载,程序里段更多,源代码里 kservice.c 也把常用的 c 库函数实现了一遍,罗列得很精炼。不过它的动态加载目前我没看到能以内存硬件保护的方式进行。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-1-24 16:35:40 | 显示全部楼层
luguan1997 发表于 2022-1-24 11:18
printf 是如何实现的?它是个可变参数的函数,参数多的时候会通过栈传参数,以前想自己实现但还没想到好 ...

我好像明白了,是不是这样就可以传递多个参数了,从模块到内核,gcc 下面,是不是可以这么实现
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. int master_request(int n, va_list args)
  5. {
  6.     int ret;
  7.     for (int i = 0; i < n; i++)
  8.     {
  9.         ret += va_arg(args, int);
  10.     }
  11.     return ret;
  12. }
  13. int module_request(int n, ...)
  14. {
  15.     va_list args;
  16.     int ret;
  17.     va_start(args, n);
  18.     ret = master_request(n, args);//这里就只有两个参数了,就可以像普通函数调用一样封装了
  19.     va_end(args);
  20.     return ret;
  21. }

  22. int main()
  23. {
  24.     int a = module_request(4, 11, 22, 33, 44);
  25.     printf("%d", a);
  26.     return 0;
  27. }
复制代码

这样也不用在模块里去实现 print 这种,直接把栈当作一个指针参数传进去了
回复

使用道具 举报

2

主题

75

回帖

81

积分

初级会员

积分
81
发表于 2022-1-24 22:37:47 | 显示全部楼层
feelingcode 发表于 2022-1-21 09:19
动态模块可以stmcubeide单独编译的,ST有提供动态应用模块的例程。如果使用threadx源文件提供的动态模块 ...

感谢提醒,之前看到过ST提供的库,但没有仔细去看。
回复

使用道具 举报

2

主题

75

回帖

81

积分

初级会员

积分
81
发表于 2022-1-24 22:39:57 | 显示全部楼层
luguan1997 发表于 2022-1-24 16:35
我好像明白了,是不是这样就可以传递多个参数了,从模块到内核,gcc 下面,是不是可以这么实现

这样也 ...

是这样,第一个参数里获得剩余参数的名称,然后通过栈去访问。主要是处理各种格式比较麻烦。有线程库就比较方便。
C库看编译选项,厂家提供了位置不相关的编译版本才能和动态库链接。和静态库没有关系。
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-1-25 19:32:47 | 显示全部楼层
本帖最后由 luguan1997 于 2022-1-28 11:30 编辑

我看了下 stm32cubeide 的 Tx_Module 的例子,这个工程可以直接链接 libc。
我目前用的是 arm-none-eabi-gcc 9.3.1, 只讨论 gcc。
我发现它编译和链接都用的是 gcc,而 threadx port 里面的 bat 用的是 ld,ld 只链接当前指定的 .o 这些,不会自动链接编译器带的库。之前我尝试就会报 undefined symbol:memcpy 之类,把 ld 也改成 gcc 就可以。现在就是 c 库用的编译器自带的,应该是没用 -fPIC 之类的编译选项得到的;而模块代码是加了这些选项得到的。 至于两个直接连接起来会不会有问题,这两者间二进制调用规则有点差异,比如模块内部会拿寄存器 r9 有特殊用途,但是即便两者涉及切换过程,寄存器也能保护住,应该不会被破坏(内核代码里用了 r9,用之前也肯定会压栈再出栈 )。但是有一点可以确定,如果链接的库用到了带绝对地址的库内部的数据段,那么程序必然会有问题。但用 memcpy 这种似乎没bug??这么做可以偷懒,只是代码不能复用增大点空间。
能否链接 c 库官方回答 https://github.com/azure-rtos/threadx/issues/101

个人感觉官方的例子有点不足就是 模块编译不会自动删去没用的段。比如我应用代码添加了很多没用到的函数,它依然会放进去,导致模块尺寸偏大。加"-ffunction-sections -fdata-sections"编译,用"--gc-sections" “-e __txm_module_preamble” 链接就行了
回复

使用道具 举报

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2022-1-27 10:01:51 | 显示全部楼层
luguan1997 发表于 2022-1-24 16:35
我好像明白了,是不是这样就可以传递多个参数了,从模块到内核,gcc 下面,是不是可以这么实现

这样也 ...

#include "txm_module.h"
#include "log.h"
#include "printf.h"

extern ALIGN_TYPE (*_txm_module_kernel_call_dispatcher)(ULONG type, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param3);

int printk(const char *fmt, ...);

UINT logRegister(Log *log)
{
UINT return_value;

    /* Call module manager dispatcher.  */
    return_value = (UINT) (_txm_module_kernel_call_dispatcher)(TXM_MODULE_EXTENSION_LOG_REG_CALL, (ALIGN_TYPE) log, 0,0);

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

UINT logWrite(Log *log, LogLevel level, char *fmt,...)
{
UINT return_value;

        char  string[200 + 1]; /* 特别注意,如果printf的变量较多,注意此局部变量的大小是否够用 */
        va_list   v_args;

        va_start(v_args, fmt);
   (void)vsnprintf((char       *)&string[0],
                                   (size_t      ) sizeof(string),
                                   (char const *) fmt,
                                                                  v_args);
        va_end(v_args);

    /* Call module manager dispatcher.  */
    return_value = (UINT) (_txm_module_kernel_call_dispatcher)(TXM_MODULE_EXTENSION_LOG_WRITE_CALL, (ALIGN_TYPE) log, (ALIGN_TYPE) level, (ALIGN_TYPE) string);

    /* Return value to the caller.  */
    return(return_value);
}
通过模块管理器自定义一个打印接口函数
回复

使用道具 举报

2

主题

21

回帖

27

积分

新手上路

积分
27
发表于 2022-1-27 11:17:34 | 显示全部楼层
你这样做是在模块里就调用 vsnprintf 把最终的字符串生成,模块发起内核的调用直接就传递一个字符串指针就可以了,应该没问题。
我是在内核用的 vsnprintf,模块传递参数时所有变量通过栈传进去。这样模块没有链接 c 库,可能会更小一点??
临时是这么写的,简单测试过没什么问题:
  1. //模块的应用代码
  2. #define TXM_MODULE
  3. #include "txm_module.h"
  4. typedef __builtin_va_list       __gnuc_va_list;
  5. typedef __gnuc_va_list          va_list;
  6. #define va_start(v,l)           __builtin_va_start(v,l)
  7. #define va_end(v)               __builtin_va_end(v)
  8. #define va_arg(v,l)             __builtin_va_arg(v,l)
  9. /*  printf 在模块里 */
  10. void kprintf(const char *fmt, ...)
  11. {
  12.     va_list args;
  13.     va_start(args, fmt);
  14.     txm_module_application_request((ULONG)TXM_APPLICATION_REQUEST_KPRINTF, (ULONG)fmt, (ULONG)&args, (ULONG)0);
  15.     va_end(args);
  16. }
复制代码
  1. //txm_module_manager_application_request.c
  2. UINT  _txm_module_manager_application_request(ULONG request_id, ALIGN_TYPE param_1, ALIGN_TYPE param_2, ALIGN_TYPE param_3)
  3. {

  4.     if(request_id == TXM_APPLICATION_REQUEST_KPRINTF)
  5.     {
  6.         CHAR kprintf_buf[150];
  7.         CHAR *temp;
  8.         vsnprintf((char *)&kprintf_buf[0],
  9.                     sizeof(kprintf_buf) - 1,
  10.                     (const char *)param_1,
  11.                     *(va_list*)param_2);
  12.         temp = &kprintf_buf[0];
  13.       
  14.         while (*temp)
  15.         {
  16.             if (*temp == '\n')
  17.                 usart_send('\r');
  18.             usart_send(*temp++);
  19.         }

  20.         return TX_SUCCESS;
  21.     }
  22.     /* By default, simply return the status of not available.  */
  23.     return(TX_NOT_AVAILABLE);
  24. }
复制代码

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 11:11 , Processed in 0.326787 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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