什么是任务栈?

  • Post author:
  • Post category:其他

在一个裸机系统中,如果有全局变量,有子函数调用,有中断发生。那么系统在运行的时候,全局变量放在哪里,子函数调用时,局部变量放在哪里,中断发生时,函数返回地址发哪里。如果只是单纯的裸机编程,它们放哪里我们不用管,但是如果要写一个 RTOS,这些种种环境参数,我们必须弄清楚他们是如何存储的。在裸机系统中,他们统统放在一个叫栈的地方,栈是单片机 RAM 里面一段连续的内存空间,栈的大小由启动文件里面的代码配置,具体见如下代码 ,最后由 C 库函数_main 进行初始化。它们在 RAM 空间里面的大概分布具见。

Stack_Size      EQU      0x00000400

                AREA     STACK, NOINIT, READWRITE, ALIGN=3
__stack_limit
Stack_Mem       SPACE    Stack_Size
__initial_sp

但是,在多任务系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组。这些一个个的任务栈也是存在于 RAM 中,能够使用的最大的栈也是由上述代码中的Stack_Size 决定。只是多任务系统中任务的栈就是在统一的一个栈空间里面分配好一个个独立的空间,每个任务只能使各自的空间,而裸机系统中需要使用栈的时候则可以天马行空,随便在栈里面找个空闲的空间使用,大概的区别具体见。

在多任务系统中,有多少个任务就需要定义多少个任务栈。

#define  TASK1_STK_SIZE
#define  TASK2_STK_SIZE

static  CPU_STK  Task1Stk[TASK1_STK_SIZE];
static  CPU_STK  Task2Stk[TASK2_STK_SIZE];

(1)任务栈的大小由宏定义控制,在 μC/OS-III 中,空闲任务的栈最小应该大于 128,那么我们这里的任务的栈也暂且配置为 128。
(2)任务栈其实就是一个预先定义好的全局数据,数据类型为 CPU_STK。 在 μC/OS-III 中,凡是涉及数据类型的地方μC/OS-III 都会将标准的 C 数据类型用 typedef重新取一个类型名,命名方式则采用见名之义的方式命名且统统大写。凡是与 CPU 类型相关的数据类型则统一在 cpu.h 中定义,与 OS 相关的数据类型则在 os_type.h 定义。CPU_STK就是与 CPU 相关的数据类型,则在 cpu.h 中定义,具体见如下代码。

#ifndef CPU_H
#define CPU_H

typedefunsigned short        CPU_INT16U;
typedefunsigned int          CPU_INT32U;
typedefunsigned char         CPU_INT08U;

typedef CPU_INT32U  CPU_ADDR;

/* 栈数据类型重定义 */
typedef CPU_INT32U           CPU_STK;
typedef CPU_ADDR             CPU_STK_SIZE;

typedef volatile CPU_INT32U  CPU_REG32;

#endif /* CPU_H */

版权声明:本文为weixin_43700750原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。