CMSIS-RTOS2 线程栈空间分配规则

关于栈空间的分配和调用规则

文章参考:https://www.keil.com/pack/doc/CMSIS/RTOS2/html/config_rtx5.html#threadConfig_countstack

其本身分为静态栈和动态栈。

静态栈:

   osThreadAttr_t Thread_Attr = {

  NULL,   ///< name of the thread

  NULL,   ///< attribute bits

  NULL,    ///< memory for control block

  NULL,   ///< size of provided memory for control block

  (void *)(0XD3E70000), ///< memory for stack

  STACKSIZE_3K,   ///< size of stack

  osPriorityNormal,   ///< initial thread priority (default: osPriorityNormal)

  NULL,   ///< TrustZone module identifier

  NULL,  ///< reserved (must be 0) 

   };

   通过指定stack地址,以及stack大小,来手动分配栈空间。

 

动态栈:

动态栈分3种,默认分配,用户主动分配,全局分配。但三种情况都要求memory for stackNULL

可以在RTX_Config.h调整栈空间。

1)默认分配(os_thread_def_stack):

OS_THREAD_DEF_STACK_NUM 使用默认方式分配栈的线程数

OS_STACK_SIZE 每个使用默认方式分配栈的实际分配大小

默认栈总大小为:OS_THREAD_DEF_STACK_NUM * OS_STACK_SIZE

2)用户主动分配(os_thread_stack):

    全部使用用户主动分配的栈的总大小:OS_THREAD_USER_STACK_SIZE

3)全局分配(os_mem):

全部使用全局分配的栈的总大小不能超过:OS_DYNAMIC_MEM_SIZE

 

通过.map文件,可以查都三种栈的基地址,并且知道三个栈空间是相互独立的。

 

1. 默认分配

   OS_THREAD_OBJ_MEM  = 1

      OS_THREAD_DEF_STACK_NUM > 0,

   osThreadAttr_t NULL

或者Thread_Attrsize of stack0的时候,该线程的Stack会被安排到os_thread_def_stack

osThreadAttr_t Thread_Attr = {

  NULL,   ///< name of the thread

  NULL,   ///< attribute bits

  NULL,    ///< memory for control block

  NULL,   ///< size of provided memory for control block

  NULL, ///< memory for stack

  0,   ///< size of stack

  osPriorityNormal,   ///< initial thread priority (default: osPriorityNormal)

  NULL,   ///< TrustZone module identifier

  NULL,  ///< reserved (must be 0) 

   };

 

 

2. 用户主动分配

  OS_THREAD_OBJ_MEM  = 1

OS_THREAD_USER_STACK_SIZE > 0,

  Thread_Attrsize of stack大于0时,该线程的Stack会被安排到os_thread_stack

osThreadAttr_t Thread_Attr = {

  NULL,   ///< name of the thread

  NULL,   ///< attribute bits

  NULL,    ///< memory for control block

  NULL,   ///< size of provided memory for control block

  NULL, ///< memory for stack

  1024,   ///< size of stack

  osPriorityNormal,   ///< initial thread priority (default: osPriorityNormal)

  NULL,   ///< TrustZone module identifier

  NULL,  ///< reserved (must be 0) 

   };

  

3. 全局分配

  1)当OS_THREAD_OBJ_MEM  = 0

  2OS_THREAD_USER_STACK_SIZE = 0,

Thread_Attrsize of stack大于0时,该线程的Stack会被安排到os_mem

  3OS_THREAD_DEF_STACK_NUM = 0,

Thread_Attrsize of stack0的时候,该线程的Stack会被安排到os_mem

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值