关于栈空间的分配和调用规则
文章参考: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 stack为NULL。
可以在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_Attr的size of stack为0的时候,该线程的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_Attr的size 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,
2)OS_THREAD_USER_STACK_SIZE = 0,
且Thread_Attr的size of stack大于0时,该线程的Stack会被安排到os_mem。
3)OS_THREAD_DEF_STACK_NUM = 0,
且Thread_Attr的size of stack为0的时候,该线程的Stack会被安排到os_mem。