月度归档:2018年01月

UCOS中函数局部变量的地址分配

一个程序有4个任务,堆栈分配如下:

image

有个函数被多个任务调用

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当前指向的内存区域分配。