一、任务堆栈的创建:
(1)为了方便定义任务堆栈,在OS_CPU.H中专门定义了一个数据类型OS_STK,即:
typedef unsigned int OS_STK;
(2)如何定义一个任务堆栈的栈区?
<1> 首先要指定堆栈的长度;
<2> 其次要定义一个指定长度类型为OS_STK的数组。
如:#define LED_STK_SIZE 64
OS_STK TASK_LED_STK[LED_STK_SIZE];
(3)如何把该数组与任务关联起来而使之成为该任务的任务堆栈?
在调用函数OSTaskCreate()来创建一个任务时,把数组的指针传递给其第三个形参ptos即可。
如:OSTaskCreate(
TaskLed0,//任务指针(任务函数的名字)
(void *)0,//传递给任务的参数
&TASK_LED_STK[LED_STK_SIZE-1],//任务堆栈栈顶地址
3//任务的优先级
);
函数原型为:OSTaskCreate(void(*task)(void*pd), void*pdata, OS_STK*ptos, INTU prio)。该函数包括4个参数:
task:是指向任务代码的指针;
pdata:是任务开始执行时,传递给任务的参数的指针;
ptos:是分配给任务的堆栈的栈顶指针;
prio是分配给任务的优先级。
此时,数组TASK_LED_STK[LED_STK_SIZE]即是任务TaskLed0的任务堆栈。
二、任务堆栈的作用:
(1)当任务运行时,它用来保存任务的一些局部变量(将CPU寄存器的值保存到RAM中);
(2)当任务挂起时,它将CPU寄存器的值压入堆栈,起到保存任务运行现场的作用;
(3)当任务恢复时,它将堆栈里的内容弹出来给CPU寄存器。
参考: 任哲 《嵌入式实时操作系统uC/OS-II原理及应用》
参考: 原子教程(战舰开发板)