一个程序有4个任务,堆栈分配如下:
有个函数被多个任务调用
void Led_Disp()
{
uint16_t checksum = 0;
uint16_t i,length;
uint8_t temp[200];
…….
}
TaskStart 任务调用Led_Disp()函数时,在KEIL MDK仿真调试可以看到Led_Disp()内的局部变量temp[200]分配的起始地址是0X1000 1E64,在TaskStart任务栈内。
TaskEthernet任务调用Led_Disp()函数时,在KEIL MDK仿真调试可以看到Led_Disp()内的局部变量temp[200]分配的起始地址是0X1000 2ED4,在TaskEthernet任务栈内。
Led_Disp()内的一部分局部变量存在CPU寄存器中。在任务切换时,会保存CPU寄存器的值,因为CPU寄存器的值会被其它任务使用。Led_Disp()函数局部变量temp[200]使用的内存区域不用保存,因为其它的任务不会使用这部分区域。其它任务调用Led_Disp()需要给temp[200]分配内存时,会在自己的任务堆栈内重新分配。
在执行每个任务时,堆栈寄存器SP指向当前任务堆栈,当任务调用函数时,函数的局部变量在SP当前指向的内存区域分配。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持以下吧