和记娱乐


网站导航

联系我们

和记娱乐

联系人: 

电 话:021-64057486

公司网址:http://www.happy123456789.com

   址:成都市松江区漕河泾松江新兴产业园区研展路丰产支路55号B座803室

邮编:201165


通信科技

您的当前位置: 和记娱乐主页 > 通信科技 >

干货 嵌入式实时系统中局部变量和全局变量

发布日期:2019-12-08 07:41 来源:和记h88 发布人:和记娱乐 点击:

  全局变量具有全局作用域,适用于所有源文件。但在不包含全局变量定义的文件中,需使用extern关键字声明这个全局变量后,方可正常使用。

  静态全局变量也具有全局作用域。它与全局变量的区别是,它仅仅作用于定义它的文件,程序中其他文件不可用。

  局部变量只有局部作用域。只在函数执行期间存在,当函数调用结束后,变量将被撤销,其所占用内存被收回。

  静态局部变量只有局部作用域。它从初始化到函数运行结束一直存在,在整个程序运行期间一直有效。它与全局变量的区别在于,全局变量对所有函数可见,而静态局部变量只对自己的函数始终可见。

  MSP:它有OS内核、异常服务历程以及所有需要访问的应用程序代码访问。程序复位默认使用MSP。

  假设系统中有两个任务,Task1和Task2,Task1是当前正在运行的任务(由OSTCBCur指出),Task2处于挂起状态。

  Task2处于挂起状态,Task2的堆栈指针由TCB2的SP变量保存着。在Task2的堆栈底部,保存有两部分数据,一部分是CPU中断时自动保存到堆栈的寄存器变量(包括xPSR,PC,LR,R12,R0~R3),另一部分是uCOS额外保存的寄存器变量(R4~R11),这些寄存器保存了Task2挂起前的所有数据。

  CPU将xPSR,PC,LR,R12,R0~R3自动保存到当前堆栈,由于PSP是指向Task1的堆栈的,所以这些寄存器会自动保存到Task1的堆栈中。

  进入OS_CPU_PendSVHandler后,由于CPU只自动保存了部分寄存器值,uCOS需要将其余寄存器也保存下来,以便切回任务时能完整恢复现场。

  得到Task2的堆栈指针后,OS_CPU_PendSVHandler从其堆栈底部恢复R4~R11寄存器的值(这部分是先前由uCOS保存的),然后调整CPU的PSP指针指向Task2堆栈中先前CPU自动保存数据的地方,如下图所示。

  此时CPU的R4~R11寄存器已恢复为Task2挂起前的值,但R0~R3、R12、LR、PC、xPSR这些尚未恢复,后面这些寄存器将在中断返回时由CPU自动恢复。

  CPU从PSP堆栈中恢复xPSR,PC,LR,R12,R0~R3这些寄存器的值,由于PSP已指向了Task2的堆栈,所以这些寄存器的值被恢复为Task2堆栈中的值,即Task2任务挂起前的寄存器值。

  CPU退出Handler模式,切换到线程模式,重新使用PSP堆栈作为工作堆栈(此时PSP已指向Task2的堆栈),使用Task2的堆栈作为工作堆栈。

  对比任务切换前的状态,Task1与Task2的状态完全对调了,所以完成了Task1与Task2的切换。

      和记娱乐,和记h88,h88平台官网