eric2013 发表于 2020-6-6 09:03:23

ThreadX内核移植中__RAM_segment_used_end__的作用


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

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

__RAM_segment_used_end__ = ALIGN(__stack_end__ , 8) + SIZEOF(.stack_process);
__RAM_segment_used_size__ = __RAM_segment_used_end__ - __RAM_segment_start__;

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

__tx_free_memory_start

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

我简单改造了下:

    .global   __initial_sp   

__RAM_segment_used_end__ = __initial_sp



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

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

voidtx_application_define(void *first_unused_memory)


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




eric2013 发表于 2020-6-6 10:13:47

更新完毕。

hpdell 发表于 2020-6-6 10:43:20

eric2013 发表于 2020-6-6 10:13
更新完毕。

貌似比较深奥啊

eric2013 发表于 2020-6-6 10:53:28

hpdell 发表于 2020-6-6 10:43
貌似比较深奥啊

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

yklstudent 发表于 2020-6-6 11:03:13

SEGGER Embedded Studio软件创建STM32F407工程时,默认使用的RAM:0x10000000, 0x10000,这个感觉是个BUG啊;应该把RAM和RAM2的对调一下才对

eric2013 发表于 2020-6-6 11:41:09

yklstudent 发表于 2020-6-6 11:03
SEGGER Embedded Studio软件创建STM32F407工程时,默认使用的RAM:0x10000000, 0x10000,这个感觉是个BUG啊 ...

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

hpdell 发表于 2020-6-6 11:45:25

eric2013 发表于 2020-6-6 10:53
ThreadX就是整了个将闲置的RAM空间利用起来的功能,可以用来做动态内存分配什么的。

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

eric2013 发表于 2020-6-6 14:27:54

hpdell 发表于 2020-6-6 11:45
好哇,期待大神的作品啊, 另外请问下, mdk 的移植,是必须得 使用 mdk v5.30 及以上版本吗 ?

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

爱喝柠檬水 发表于 2020-6-6 15:37:26

eric2013 发表于 2020-6-6 14:27
对,必须得用V5.30及其以上。

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

eric2013 发表于 2020-6-6 15:43:15

爱喝柠檬水 发表于 2020-6-6 15:37
我用MDK5.29弄了一个rt1052的工程,在sdram里面跑起来了,xip启动有点问题

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

爱喝柠檬水 发表于 2020-6-6 16:16:10

eric2013 发表于 2020-6-6 15:43
推荐用5.30,处理GCC更方便些。

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

hpdell 发表于 2020-6-6 16:30:34

eric2013 发表于 2020-6-6 14:27
对,必须得用V5.30及其以上。

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

:lol

migsoft 发表于 2020-6-23 00:08:54

这两天研究了一下,沿着楼主的足迹走了一遍。感觉这东西还很粗糙,不像是微软的东西。

migsoft 发表于 2020-6-23 00:11:45

这两天沿着楼主的路走了一遍,遍布荆棘。ThreadX要走的路还很远。

eric2013 发表于 2020-6-23 00:13:24

migsoft 发表于 2020-6-23 00:08
这两天研究了一下,沿着楼主的足迹走了一遍。感觉这东西还很粗糙,不像是微软的东西。
port代码就是这个样子的,因为ThreadX之前走的是收费的定制路线。并不是供大家免费下载参观的port代码,并把各种奇葩问题都帮大家捋一遍。

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

morning_enr6U 发表于 2020-6-23 08:49:15

{:8:}

migsoft 发表于 2020-6-24 09:27:27

IAR的例程中ICF文件应该改一下,以确保这个section是分配到最后的。当然如果thread的栈都是静态的,这也没啥意义。只是严谨。

liujia21 发表于 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).

eric2013 发表于 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?mod=viewthread&tid=99514&fromuid=58
(出处: 硬汉嵌入式论坛)

yklstudent 发表于 2021-1-4 19:59:47

eric2013 发表于 2020-9-9 02:04
方便的话,看教程移植章节,M内核基本都是一样的

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

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

eric2013 发表于 2021-1-5 08:40:36

yklstudent 发表于 2021-1-4 19:59
楼主确认过SES生成的__RAM_segment_used_end__是否可以正常使用吗?

可以使用的。

yklstudent 发表于 2021-1-5 23:15:45

eric2013 发表于 2021-1-5 08:40
可以使用的。

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

eric2013 发表于 2021-1-6 08:51:58

yklstudent 发表于 2021-1-5 23:15
我看KEIL下是可以正常使用的,但是SES下是不正常的,你V5和V7下都确认过了,也是有问题的,硬汉确认下呗

好的,今晚我就测试下。

sl3340 发表于 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。

eric2013 发表于 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__;

sl3340 发表于 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__ 是啥

sl3340 发表于 2022-5-24 16:03:27

楼主帮忙看看咧

eric2013 发表于 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?mod=viewthread&tid=111353&fromuid=58
(出处: 硬汉嵌入式论坛)

sl3340 发表于 2022-5-30 11:03:55

eric2013 发表于 2022-5-25 02:20
二楼

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


感谢指导{:8:}

鄢一安 发表于 2024-3-26 08:54:12

硬汉哥,看到你这个帖子,继续说我上一个回复的,cubemx生成的工程的启动文件并没有把Image$$RW_IRAM1$$ZI$$Limit替换为__initial_sp,Image$$RW_IRAM1$$ZI$$Limit本来就是剩下的RAM空间吧,不替换是不是也可以呢

eric2013 发表于 2024-3-26 10:46:56

鄢一安 发表于 2024-3-26 08:54
硬汉哥,看到你这个帖子,继续说我上一个回复的,cubemx生成的工程的启动文件并没有把Image$$RW_IRAM1$$ZI$ ...

这个的作用是把剩余RAM空间给ThreadX动态内存使用,如果你用不到,不用管
页: [1]
查看完整版本: ThreadX内核移植中__RAM_segment_used_end__的作用