//
更多原创“uC/OS-II学习笔记之:系列”基础及嵌入式相关知识详解,请访问可乐虎博客:
相信不会让您失望!!
//
一、任务堆栈的创建:
(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//任务的优先级
);
此时,数组TASK_LED_STK[LED_STK_SIZE]即是任务TaskLed0的任务堆栈。
二、任务堆栈的作用:
(1)当任务运行时,它用来保存任务的一些局部变量(将CPU寄存器的值保存到RAM中);
(2)当任务挂起时,它将CPU寄存器的值压入堆栈,起到保存任务运行现场的作用;
(3)当任务恢复时,它将堆栈里的内容弹出来给CPU寄存器。
参: 任哲 《嵌入式实时操作系统uC/OS-II原理及应用》
参: 卢有亮 《嵌入式实时操作系统uC/OS原理与实践》