任务堆栈基础知识

  所谓堆栈,就是在存储器中按数据“后进先出(Last In First Out,LIFO)”的原则组织的连续存储空间。每个任务都有自己的堆栈,任务堆栈是任务的重要组成部分,其作用主要表现在以下两点:

  1. 当任务切换或响应中断时,用来保存CPU寄存器中的内容,当任务挂起的时候,将CPU寄存器的内容压入堆栈,恢复的时候再弹出来给CPU寄存器。
  2. 当任务运行时,它用来保存一些局部变量

  关于任务堆栈在操作系统代码中的定义如程序2.4所示。

/* 任务堆栈的定义 */
#define TASK_STK_SIZE 512
typedef uint32_t  OS_STK;
OS_STK TaskStk[OS_MAX_TASKS][TASK_STK_SIZE];
  1. Task_STK_SIZE是每个任务堆栈的大小,这里设置为512,根据具体的情况做移植时,可修改这个值。
  2. OS_STK是利用typedef重定义的堆栈数据类型
  3. 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个这样的堆栈。需要注意的是用户堆栈可以由用户自己定义,并非要采用二维数组的形式。

  根据任务堆栈增长方式的不同,任务堆栈又可以划分为以下两种:

  1. 地址向下增长(PC)
  2. 地址向上增长

 

posted @ 2013-03-12 22:49  此岸幸福  阅读(3538)  评论(0)    收藏  举报