UCOS---上下文切换(Context Switching)

当 UCOS 决定运行另一个任务时,则需要保存当前任务的上下文,其中主要包括 CPU 相关寄存器,以及当前的任务的栈,并恢复新任务的上下文和重新开始执行任务。这个过程称为上下文切换。

上下文切换增加了内存开销。CPU 的寄存器越多,内存开销越大。执行上下文切换的时间也主要是 CPU 寄存器的保存与恢复。

本文我们主要借助于一个虚构的 CPU 来讨论上下文切换的一般过程。此虚构 CPU 包含 16 个整数寄存器 (R0 - R15),一个独立的 ISR 栈指针、一个独立的状态寄存器。每个寄存器均为 32 位,并且每个寄存器都能存储地址或数据。程序计数器(指令指针寄存器)是 R15,且有两个独立的栈指针 R14 和 R14',其中 R14 表示任务栈指针(task stack pointer TSP),R14' 表示 ISR 栈指针(ISR stack pointer ISP)。当响应一个中断时,CPU 自动切换到 ISP。注意在 ISR 中是可以访问任务栈的(例如:在 ISR 中可以先任务栈中 push 和 pop 元素),中断栈也是可以从任务中访问的。

虚构 CPU

在 UCOS 中,栈的当前帧总是看起像中断刚刚发生的,处理器所有的寄存器都保存于此。任务一旦创建就处于继续状态,显然当前任务的上下文是有软件进行预初始化的。

任务栈指针指向存在任务栈中的最后一个寄存器。PC(program counter) 指针 和 SR(status register)最早保存到栈中的。实际上,在响应中断处理程序时, CPU 自动保存 PC 和 SR 到任务栈中,然后在中断处理程序中保存剩余的寄存器。需要注意的是, SP(stack pointer 或
R14)实际并不是保存在任务栈中,而是保存在任务的 TCB 中。

中断栈指针指向的中断栈的栈顶,是一个不同于任务栈的内存区域。当一个 ISR 执行时,处理器用 R14' 作为 ISR 调用的函数栈。

一个就绪任务的CPU寄存器的入栈顺序

UCOS 中一共存在两种类型的上下文切换:一是从任务中切换,二是从 ISR 中切换。任务级别切换是通过 OSCtxSw() 实现,其实际上是通过调用宏函数 OS_TASK_SW() 完成。ISR上下文切换是 OSIntCtxSw() 实现,此函数是汇编函数,在 os_cpu_a.asm 中。

1 OSCtxSw()

在任务级调度(OSSched())时 OSCtxSw() 将被调用用于切换当前任务到一个高优先级的任务。下图是调用 OSCtxSw() 之前 UCOS 的变量和数据结构状态。

OSCtxSw() 调用之前

(1) OSTCBCurPtr 指针指向当前正在执行的任务,且此任务调用 OSSched()。
(2)OSSched() 找到即将运行的新任务,并将 OSTCBHighRdyPtr 指向其 OS_TCB。
(3)OSTCBHighRdyPtr->StkPtr 指针指向新任务的任务栈
(4)当 UCOS 创建或挂起一个任务时,总是会保留中断发生时的这个栈帧,多有的 CPU 寄存器保存于此,这保留了任务重新开始执行时应有状态。
(5)OSSChed() 调用后,TSP 所指向的位置,依赖于如何调用 OSCtxSw() ,TSP 可以指向 OSCtxSw() 的返回地址。

下图表达了 UCOS 调用 OSCtxSw() 执行任务上下文切换的过程。

OSCtxSw()上下文切换过程

(1)OSCtxSw() 首先保存当前任务的 SR 和 PC 到任务栈中,保存顺序依赖于 CPU 在中断发生时对于栈帧的要求。这里,假设先保存 SR,再保存 PC,然后保存剩余寄存器。
(2)OSCtxSw() 保存寄存器栈指针到 TCB 的 StkPtr 中,开始上下文切换。简言之, OSTCBCurPtr->StkPtr = R14。
(3)OSCtxSw() 然后加载待执行任务的任务栈指针到 R14 中,即 R14 = OSTCBHighRdyPtr->StkPtr。
(4)最后, OSCtxSw() 恢复 CPU 的寄存器为新任务栈中的寄存器帧。SR 和 PC 通常时 CPU 在退出 ISR 时自动完成加载。

2 OSIntCtxSw()

OSIntCtxSw()(参见 os_cpu_a.asm)在 ISR 级别的调度函数 OSIntExit() 中调用,用于切换到一个高优先级的就绪任务。下图是说明了 OSIntCtxSw() 调用前 UCOS 的变量和结构的状态。

调用 OSIntCtxSw() 之前的就内存状态

图中假设 UCOS 在 ISR开始时已经保存好了 CPU 寄存器(中断管理中将会详述)。由于这个原因,注意到 OSTCBCurPtr->StkPtr 的值是一个正在被挂起的任务任务栈指针(图中左边)。OSIntCtxSw() 不用承担保存被挂起任务(当前任务)的 CPU 寄存器的工作,因为这个已经在中断管理部分完成。

下图表示了 OSIntCtxSw() 完成一半的上下文切换,其工作正好是 OSCtxSw() 的一半。

OSIntCtxSw() 执行的工作

(1)OSIntCtxSw() 加载 CPU SP 寄存器为新任务的任务栈顶,即 R14=OSTCBHighRdyPtr->StkPtr。
(2)OSIntCtxSw() 然后恢复 CPU 寄存器的值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ucos-iii-tcpip.a是一个软件库,用于嵌入式系统中使用μC/OS-III操作系统和TCP/IP协议栈进行网络通信的开发。 ucos-iii-tcpip.a提供了一系列的接口和函数,帮助开发人员在嵌入式系统中实现TCP/IP网络通信功能。它包含了TCP/IP协议栈的实现以及与μC/OS-III操作系统的接口,使得开发人员可以简单地在嵌入式系统中实现TCP/IP网络通信功能。 使用ucos-iii-tcpip.a可以方便地创建网络任务,并通过接口函数来管理和控制网络通信。它提供了一些常用的网络协议,如TCP、UDP、IP等,并且支持网络连接、数据传输等基本的网络操作。此外,ucos-iii-tcpip.a还提供了一些高级功能,如网络管理、安全性、QoS等,以满足不同应用场景的需求。 通过使用ucos-iii-tcpip.a,嵌入式系统开发人员可以快速、简便地添加网络通信功能,提高系统的灵活性和可扩展性。它提供了一种可靠、高效的方式来实现嵌入式系统与外部设备之间的数据交换,使得嵌入式系统能够连接到互联网,实现远程控制、数据传输等功能。 总之,ucos-iii-tcpip.a是一款强大的软件库,它结合了μC/OS-III操作系统和TCP/IP协议栈,为嵌入式系统提供了完善的网络通信功能,帮助开发人员快速构建并实现网络连接和数据传输等功能,使得嵌入式系统能够更好地适应各种应用场景的需求。 ### 回答2: ucos-iii-tcpip.a是一个TCP/IP协议栈的静态库文件。uCos-III是一个开发嵌入式实时操作系统的工具。它提供了一种可靠的方法来构建实时系统,并可以方便地适应不同的硬件和应用需求。 ucos-iii-tcpip.a库是基于uCos-III实时操作系统的一个扩展库,用于支持TCP/IP协议栈的功能。TCP/IP协议栈是计算机网络通信的基础,它包括传输控制协议(TCP)和互联网协议(IP)。通过使用这个库,开发者可以轻松地在嵌入式系统中实现TCP/IP网络通信功能。 ucos-iii-tcpip.a库提供了一系列接口和函数,用于处理与TCP/IP协议相关的任务,如网络连接的建立和断开、数据传输的处理等。它还包含了各种网络协议的实现,如IP、TCP、UDP等,以及网络应用层协议的支持,如HTTP、FTP等。开发者可以通过调用这些函数和接口来完成各种网络通信任务。 使用ucos-iii-tcpip.a库可以极大地简化开发者在嵌入式系统中实现TCP/IP通信的工作量。它提供了一个高效可靠的通信框架,可以帮助开发者快速构建自己的网络应用。一旦完成了TCP/IP通信的底层实现,开发者可以更加专注于应用层的业务逻辑开发,而不需要过多关注网络通信的细节。 总结来说,ucos-iii-tcpip.a是一个用于嵌入式系统中支持TCP/IP协议栈的静态库文件,它提供了一系列接口和函数,帮助开发者实现TCP/IP网络通信功能。使用这个库可以简化开发工作,提高效率,同时为开发者提供了一个可靠的通信框架。 ### 回答3: ucos-iii-tcpip.a是一个软件库,主要用于嵌入式系统中实现TCP/IP网络协议栈。它基于Micrium公司开发的uC/OS-III实时操作系统,提供了一套完整的TCP/IP协议栈的实现。该软件库的目标是为嵌入式系统开发人员提供一个方便快捷且可靠的TCP/IP协议栈,使他们能够更容易地将网络功能集成到嵌入式应用中。 ucos-iii-tcpip.a具有多线程处理能力,能够同时处理多个网络连接和数据包,提供了 TCP、UDP、IP、ICMP等网络协议的实现。它支持IPv4和IPv6协议,可以实现IP地址的分配和路由功能,支持网络数据包的传输和接收,还提供了socket API接口供应用程序调用。 使用ucos-iii-tcpip.a,嵌入式系统开发人员可以方便地添加网络功能到他们的嵌入式应用中,无需从头开始开发TCP/IP协议栈,大大加快开发进度。在嵌入式系统中,网络功能往往是非常重要的,通过使用ucos-iii-tcpip.a,开发人员可以轻松实现远程控制、数据采集、与外部设备通信等功能。 总之,ucos-iii-tcpip.a是一个基于uC/OS-III实时操作系统的TCP/IP协议栈软件库,提供了完整的TCP/IP协议栈的实现,方便嵌入式系统开发人员快速添加网络功能到他们的应用中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值