任务堆栈基础知识
所谓堆栈,就是在存储器中按数据“后进先出(Last In First Out,LIFO)”的原则组织的连续存储空间。每个任务都有自己的堆栈,任务堆栈是任务的重要组成部分,其作用主要表现在以下两点:
- 当任务切换或响应中断时,用来保存CPU寄存器中的内容,当任务挂起的时候,将CPU寄存器的内容压入堆栈,恢复的时候再弹出来给CPU寄存器。
- 当任务运行时,它用来保存一些局部变量
关于任务堆栈在操作系统代码中的定义如程序2.4所示。
/* 任务堆栈的定义 */ #define TASK_STK_SIZE 512 typedef uint32_t OS_STK; OS_STK TaskStk[OS_MAX_TASKS][TASK_STK_SIZE];
- Task_STK_SIZE是每个任务堆栈的大小,这里设置为512,根据具体的情况做移植时,可修改这个值。
- OS_STK是利用typedef重定义的堆栈数据类型
- OS_MAX_TASKS是用户任务的数量
很明显这里我们定义了最多用户任务个堆栈,而统计任务和空闲任务的堆栈是单独定义的,分别是OSTaskStatStk和OSTaskIdleStk。堆栈的数据类型OS_STK是32位的(4Byte),所以执行一次压桟操作,就要压进去4个Byte;执行一次退栈操作,就弹出4个Byte;而堆栈的大小就是TASK_STK_SIZE个OS_STK而非TASK_STK_SIZE。所以这里我们定义的堆栈的大小为TASK_STK_SIZE*sizeof(OS_STK)=512*4=2048字节;
TaskStk就是我们定义的堆栈,这里以数组的形式定义的,每个堆栈的尺寸是512个Byte,而一共定义了OS_MAX_TASK个这样的堆栈。需要注意的是用户堆栈可以由用户自己定义,并非要采用二维数组的形式。
根据任务堆栈增长方式的不同,任务堆栈又可以划分为以下两种:
- 地址向下增长(PC)
- 地址向上增长

浙公网安备 33010602011771号