有关动态线程创建的问题

发表在 内核学习营2019-6-13 22:15 [复制链接] 3 150

我先说一下我的理解,静态线程创建的时候,使用rt_thread_init()函数,其中的栈大小自己定义,然后编译器分配空间。) F8 I( U/ `/ Y7 t
动态线程创建时,首先要给RTT分配一个堆空间,然后调用rt_thread_create()函数,其中栈的空间是从最初分配给RTT的堆空间里分配的。4 y: L- W  }: ]* y! O, ]' q7 x* K
可是我在野火的stm32f103指南者+RTT例程的SDIO-FATFS里发现了一个问题,他在创建动态线程的时候,定义的空间大于一开始分配的堆的空间。
- X5 A8 g! J8 U9 ]" H MIC2}C%8D0AKJ[_MLQR4C~9.jpg 这是程序最开始分配堆空间的地方。
9 q8 ^) Q) t( [2 N2 [' [) t TRO8`97}[C4F9YAD5T]8C]6.jpg 这是程序里创建动态线程的地方。
, k! o: F& O+ d% f  ?) R0 t我想问下大家,我哪里理解错了。希望能指正一下。
$ s0 M) W5 y, f5 X" M" }2 i0 c# w4 Z' M* H- b
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-6-13 22:54:05 | 显示全部楼层
#define STM32_SRAM_SIZE        (128)2 l; j% F) A! |( g1 C9 m' l/ ^7 g# L
#define STM32_SRAM_END         (0x20000000 + STM32_SRAM_SIZE * 1024)
3 }7 n9 }  ]1 q. ~4 j, g6 |  t' Y  o( _
#define STM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
+ r+ }3 u  O8 A  l1 o0 o#define STM32_FLASH_SIZE             (1024 * 1024)  _. W" N1 N1 C2 o
#define STM32_FLASH_END_ADDRESS      ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))
8 \+ `2 J$ }; Q: R; p4 K
! O# S8 X# x# u- o#ifdef __CC_ARM% G; ~; [( j" e* ~; Q: x, {
extern int Image$$RW_IRAM1$$ZI$$Limit;7 B6 w' B) m) G5 |$ s
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
. \5 w9 C$ d  W#elif __ICCARM__
; _1 _0 c6 b# n2 D. I' G) V#pragma section="CSTACK"
; f5 L' A; |% C# F5 f, j6 B+ q#define HEAP_BEGIN      (__segment_end("CSTACK"))5 e9 b7 G: n+ y; F: ~; ?
#else# y! u; W- A7 z$ q
extern int __bss_end;; r+ U2 V% U  N
#define HEAP_BEGIN      ((void *)&__bss_end)! a# g# e% P; w3 R
#endif
1 l: s$ O5 F- Y/ i
, H, N8 p; H8 i. G1 F  O#define HEAP_END        STM32_SRAM_END
2 A4 t; [5 P/ {- Q, W这是官方stm32f407里关于动态堆的定义,把没用到的RAM全部分给了堆,明天我在板子上实际跑一下,看这个任务是否创建成功
使用道具 举报 回复
发表于 2019-6-14 14:40:01 | 显示全部楼层
看 drv_common.c rt_hw_board_init 函数怎么初始化的2 Y8 y9 G1 _9 G% c6 v7 Z& Q" v

$ `! t1 U! E  B/ R- i
  1.     /* Heap initialization */
    3 r/ l6 t0 @) ?) p- @
  2. #if defined(RT_USING_HEAP): D8 S! _- i) y; {$ T
  3.     rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);# D6 h4 o' m6 M, _* a
  4. #endif
复制代码
使用道具 举报 回复
发表于 2019-6-15 10:15:40 | 显示全部楼层
不同的bsp对堆初始化时的取点(HEAP_BEGIN, HEAP_END)方法, 会有不同
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

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