有关动态线程创建的问题

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

我先说一下我的理解,静态线程创建的时候,使用rt_thread_init()函数,其中的栈大小自己定义,然后编译器分配空间。$ J; k! G4 L. `5 B. C1 z  F
动态线程创建时,首先要给RTT分配一个堆空间,然后调用rt_thread_create()函数,其中栈的空间是从最初分配给RTT的堆空间里分配的。
6 q+ f1 |# R+ [% H# N可是我在野火的stm32f103指南者+RTT例程的SDIO-FATFS里发现了一个问题,他在创建动态线程的时候,定义的空间大于一开始分配的堆的空间。/ K; X, a  m# w- x: T- Y
MIC2}C%8D0AKJ[_MLQR4C~9.jpg 这是程序最开始分配堆空间的地方。1 X) e/ C: O* \: H" M
TRO8`97}[C4F9YAD5T]8C]6.jpg 这是程序里创建动态线程的地方。
9 K! P) y% u# d) ]我想问下大家,我哪里理解错了。希望能指正一下。
8 Q% p  v' N) T- T8 U; u& j
* q9 |3 [4 k/ V. }2 H4 n  h
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-6-13 22:54:05 | 显示全部楼层
#define STM32_SRAM_SIZE        (128)# D: H. S% Y* ]& h9 e- m
#define STM32_SRAM_END         (0x20000000 + STM32_SRAM_SIZE * 1024)
4 q9 p/ j+ f5 k7 e+ ]7 v
6 m2 [( M3 z& A#define STM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
7 }3 `' l8 ~' i$ O7 y! ]4 v" Z#define STM32_FLASH_SIZE             (1024 * 1024)) x: w  }% ?/ F# c9 W; ?+ O. J- N
#define STM32_FLASH_END_ADDRESS      ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)): W! ?% I, y+ E; ^
1 P2 y$ O& `7 G: s0 Z; V" A. w
#ifdef __CC_ARM
; x7 ]& o" U# W3 Oextern int Image$$RW_IRAM1$$ZI$$Limit;
1 r+ g7 ~9 l$ z7 ?! O7 r- ]#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
" T" D4 y$ b; a& h+ a0 g#elif __ICCARM__
) w3 a) s# s$ U3 q3 H- e; A#pragma section="CSTACK"! V6 u' I- y! f  r
#define HEAP_BEGIN      (__segment_end("CSTACK"))6 {+ p* v$ `% M6 v
#else& B/ x6 r6 d7 O7 H
extern int __bss_end;8 u6 u* S% K( a! E0 k% _
#define HEAP_BEGIN      ((void *)&__bss_end)3 S5 Y: d8 E  T: P8 M
#endif* e9 x: E+ C6 O1 r9 o7 `5 G( U; v

' X- E( Q7 G# E( L& F: W2 p#define HEAP_END        STM32_SRAM_END% Y* T, N- s/ I3 G% H
这是官方stm32f407里关于动态堆的定义,把没用到的RAM全部分给了堆,明天我在板子上实际跑一下,看这个任务是否创建成功
使用道具 举报 回复
发表于 2019-6-14 14:40:01 | 显示全部楼层
看 drv_common.c rt_hw_board_init 函数怎么初始化的
( I  F8 {3 p# k5 Y
" X1 _4 Q# Q& I' f8 w" Q% l6 Q# X
  1.     /* Heap initialization */& Y3 Q! N3 {/ ^
  2. #if defined(RT_USING_HEAP)$ w7 a% B# w7 m) L, i
  3.     rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);- v! X# B# V9 g- U$ R! L; E
  4. #endif
复制代码
使用道具 举报 回复
发表于 2019-6-15 10:15:40 | 显示全部楼层
不同的bsp对堆初始化时的取点(HEAP_BEGIN, HEAP_END)方法, 会有不同
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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