硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX内核移植中__RAM_segment_used_end__的作用

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-6-6 09:03:23 | 显示全部楼层 |阅读模式

__RAM_segment_used_end__的含义就是当前已经使用RAM区的末尾地址。

Embedded Studio编译的时候会自动的生成这个东西:

  1.   __RAM_segment_used_end__ = ALIGN(__stack_end__ , 8) + SIZEOF(.stack_process);
  2.   __RAM_segment_used_size__ = __RAM_segment_used_end__ - __RAM_segment_start__;
复制代码


IAR的移植是采用的ThreadX提供的案例,里面搞了个这种东东:

  1. __tx_free_memory_start
复制代码


MDK的话,可以直接使用MDK的启动文件里面定义好的__initial_sp。

我简单改造了下:

  1.     .global     __initial_sp   

  2. __RAM_segment_used_end__ = __initial_sp

复制代码


设置这个东西有什么用呢?

ThreadX为了让用户可以把这部分没有利用的RAM区也用起来,可以通过这种方式,将其传递到下面这个函数里面

void  tx_application_define(void *first_unused_memory)


这个形参first_unused_memory就是前面设置的值,用户可以在这个基础上做动态内存分配。




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-6 10:13:47 | 显示全部楼层
更新完毕。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-6-6 10:43:20 | 显示全部楼层

貌似比较深奥啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-6 10:53:28 | 显示全部楼层
hpdell 发表于 2020-6-6 10:43
貌似比较深奥啊

ThreadX就是整了个将闲置的RAM空间利用起来的功能,可以用来做动态内存分配什么的。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-6-6 11:03:13 | 显示全部楼层
SEGGER Embedded Studio软件创建STM32F407工程时,默认使用的RAM:0x10000000, 0x10000,这个感觉是个BUG啊;应该把RAM和RAM2的对调一下才对
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-6 11:41:09 | 显示全部楼层
yklstudent 发表于 2020-6-6 11:03
SEGGER Embedded Studio软件创建STM32F407工程时,默认使用的RAM:0x10000000, 0x10000,这个感觉是个BUG啊 ...

是的,CCM区有坑,不支持DMA。
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-6-6 11:45:25 | 显示全部楼层
eric2013 发表于 2020-6-6 10:53
ThreadX就是整了个将闲置的RAM空间利用起来的功能,可以用来做动态内存分配什么的。

好哇,期待大神的作品啊, 另外请问下, mdk 的移植,是必须得 使用 mdk v5.30 及以上版本吗 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-6 14:27:54 | 显示全部楼层
hpdell 发表于 2020-6-6 11:45
好哇,期待大神的作品啊, 另外请问下, mdk 的移植,是必须得 使用 mdk v5.30 及以上版本吗 ?

对,必须得用V5.30及其以上。
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2020-6-6 15:37:26 | 显示全部楼层
eric2013 发表于 2020-6-6 14:27
对,必须得用V5.30及其以上。

我用MDK5.29弄了一个rt1052的工程,在sdram里面跑起来了,xip启动有点问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-6 15:43:15 | 显示全部楼层
爱喝柠檬水 发表于 2020-6-6 15:37
我用MDK5.29弄了一个rt1052的工程,在sdram里面跑起来了,xip启动有点问题

推荐用5.30,处理GCC更方便些。
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2020-6-6 16:16:10 | 显示全部楼层
eric2013 发表于 2020-6-6 15:43
推荐用5.30,处理GCC更方便些。

谢谢,硬汉老师是不是也会整一套rt系列的移植出来呢,学习学习!
回复

使用道具 举报

609

主题

3047

回帖

4894

积分

至尊会员

积分
4894
发表于 2020-6-6 16:30:34 | 显示全部楼层
eric2013 发表于 2020-6-6 14:27
对,必须得用V5.30及其以上。

原来如此啊,难怪我用 mdk v5.29 始终都没有成功,不是提示这个错误就是提示那个错误,搞得头晕,后来放弃

回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2020-6-23 00:08:54 | 显示全部楼层
这两天研究了一下,沿着楼主的足迹走了一遍。感觉这东西还很粗糙,不像是微软的东西。
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2020-6-23 00:11:45 | 显示全部楼层
这两天沿着楼主的路走了一遍,遍布荆棘。ThreadX要走的路还很远。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-6-23 00:13:24 | 显示全部楼层
migsoft 发表于 2020-6-23 00:08
这两天研究了一下,沿着楼主的足迹走了一遍。感觉这东西还很粗糙,不像是微软的东西。

port代码就是这个样子的,因为ThreadX之前走的是收费的定制路线。并不是供大家免费下载参观的port代码,并把各种奇葩问题都帮大家捋一遍。

等你体会到精髓了,就知道牛X了。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-6-23 08:49:15 | 显示全部楼层
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2020-6-24 09:27:27 | 显示全部楼层
IAR的例程中ICF文件应该改一下,以确保这个section是分配到最后的。当然如果thread的栈都是静态的,这也没啥意义。只是严谨。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2020-9-8 21:01:53 | 显示全部楼层
我用MDK,移植threadx到stm32f407,遇到这个错误
  .global     __initial_sp
__RAM_segment_used_end__ = __initial_sp
..\OBJ\Template.axf: Error: L6218E: Undefined symbol __initial_sp (referred from tx_initialize_low_level.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.
"..\OBJ\Template.axf" - 1 Error(s), 0 Warning(s).
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-9-9 02:04:32 | 显示全部楼层
liujia21 发表于 2020-9-8 21:01
我用MDK,移植threadx到stm32f407,遇到这个错误
  .global     __initial_sp
__RAM_segment_used_end__ = ...

方便的话,看教程移植章节,M内核基本都是一样的

ThreadX内核教程更新记录帖,前7章已发布(2020-09-07)
http://www.armbbs.cn/forum.php?m ... 9514&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2021-1-4 19:59:47 | 显示全部楼层
eric2013 发表于 2020-9-9 02:04
方便的话,看教程移植章节,M内核基本都是一样的

ThreadX内核教程更新记录帖,前7章已发布(2020-09-0 ...

楼主确认过SES生成的__RAM_segment_used_end__是否可以正常使用吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-5 08:40:36 | 显示全部楼层
yklstudent 发表于 2021-1-4 19:59
楼主确认过SES生成的__RAM_segment_used_end__是否可以正常使用吗?

可以使用的。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2021-1-5 23:15:45 | 显示全部楼层

我看KEIL下是可以正常使用的,但是SES下是不正常的,你V5和V7下都确认过了,也是有问题的,硬汉确认下呗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-6 08:51:58 | 显示全部楼层
yklstudent 发表于 2021-1-5 23:15
我看KEIL下是可以正常使用的,但是SES下是不正常的,你V5和V7下都确认过了,也是有问题的,硬汉确认下呗

好的,今晚我就测试下。
回复

使用道具 举报

6

主题

57

回帖

75

积分

初级会员

积分
75
发表于 2022-5-23 15:37:19 | 显示全部楼层
使用这个__RAM_segment_used_end__作为first_unused_memory以后是不是还得调用tx_byte_pool_create(&tx_app_byte_pool, "Tx App memory pool", first_unused_memory, TX_APP_MEM_POOL_SIZE)函数新建一个内存池?有没有什么方法可以自动算出TX_APP_MEM_POOL_SIZE。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-5-24 02:01:01 | 显示全部楼层
sl3340 发表于 2022-5-23 15:37
使用这个__RAM_segment_used_end__作为first_unused_memory以后是不是还得调用tx_byte_pool_create(&tx_app ...

如果你是静态使用,那么不需要创建内存池的。

这个就是_RAM_segment_used_size__ = __RAM_segment_used_end__ - __RAM_segment_start__;
回复

使用道具 举报

6

主题

57

回帖

75

积分

初级会员

积分
75
发表于 2022-5-24 09:53:41 | 显示全部楼层
eric2013 发表于 2022-5-24 02:01
如果你是静态使用,那么不需要创建内存池的。

这个就是_RAM_segment_used_size__ = __RAM_segment_use ...

棒,这样就不用去设置具体的内存池的大小了,keil里面传递出来的first_unused_memory好像是|Image$$RW_IRAM1$$ZI$$Limit|,但是不知道这个对应的_RAM_segment_used_size__ 是啥
回复

使用道具 举报

6

主题

57

回帖

75

积分

初级会员

积分
75
发表于 2022-5-24 16:03:27 | 显示全部楼层
楼主帮忙看看咧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2022-5-25 02:20:15 | 显示全部楼层
sl3340 发表于 2022-5-24 09:53
棒,这样就不用去设置具体的内存池的大小了,keil里面传递出来的first_unused_memory好像是|Image$$RW_IR ...

二楼

MDK获取未使用RAM空间首地址方法
https://www.armbbs.cn/forum.php? ... 1353&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

6

主题

57

回帖

75

积分

初级会员

积分
75
发表于 2022-5-30 11:03:55 | 显示全部楼层
eric2013 发表于 2022-5-25 02:20
二楼

MDK获取未使用RAM空间首地址方法

感谢指导
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-3-26 08:54:12 | 显示全部楼层
硬汉哥,看到你这个帖子,继续说我上一个回复的,cubemx生成的工程的启动文件并没有把Image$$RW_IRAM1$$ZI$$Limit替换为__initial_sp,Image$$RW_IRAM1$$ZI$$Limit本来就是剩下的RAM空间吧,不替换是不是也可以呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2024-3-26 10:46:56 | 显示全部楼层
鄢一安 发表于 2024-3-26 08:54
硬汉哥,看到你这个帖子,继续说我上一个回复的,cubemx生成的工程的启动文件并没有把Image$$RW_IRAM1$$ZI$ ...

这个的作用是把剩余RAM空间给ThreadX动态内存使用,如果你用不到,不用管
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 15:21 , Processed in 0.408647 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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