0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS系列技术文章:上下文切换

麦克泰技术 来源:麦克泰技术 2023-11-21 15:48 次阅读

嵌入式实时操作系统(RTOS)中的上下文切换是指保存和恢复任务的状态,以使调度程序能够切换到另一个任务,从而促进多任务处理。

目的:

通过在任务之间高效切换来启动多任务处理,提供并发执行。

任务状态组件:

程序计数器(PC)、寄存器、堆栈指针(SP)、状态寄存器/标志。

上下文切换中的步骤:

保存当前任务状态

更新任务控制块(TCB)

选择下一个任务

恢复下一个任务的状态

上下文切换的开销:

时间和资源的开销

RTOS旨在最大限度地减少实时响应的开销

抢占:

抢占允许中断更高优先级任务的任务

自愿或非自愿的抢占

频率和影响:

频繁使用多任务系统

影响取决于RTOS和调度器的效率

实时性的考虑:

满足截止日期的确定性时间

解决优先级反转

示例场景:

传感器读取任务切换出去,以允许嵌入式系统中的数据处理任务。

ISR中的上下文切换:

上下文开关可能发生在ISR中,需要特殊处理以保持系统的稳定。

FreeRTOS示例(STM32):

// LED切换的任务功能
void vLEDTask(void *pvParameters) {
  while (1) {
    // Toggle LED state
    // Example: Toggle STM32 LED connected to GPIO_PIN_13
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);


    // Delay for 500 ms
    vTaskDelay(pdMS_TO_TICKS(500));
  }
}


// Task function for UART communication
void vUARTTask(void *pvParameters) {
  while (1) {
    // Implement UART communication task


    // Delay for 1000 ms
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}
int main(void) {
  // STM32 HAL initialization


  // Create an LED task
  xTaskCreate(vLEDTask, "LED Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);


  // Create a UART task
  xTaskCreate(vUARTTask, "UART Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);


  // Start FreeRTOS scheduler
  vTaskStartScheduler();


  // Should not reach here
  while (1) {
  }
}

这个例子演示了一个简单的基于FreeRTOS的STM32项目,有两个任务:一个是切换LED,另一个是处理UART通信。这些任务通过上下文切换同时运行,展示了嵌入式系统中多任务处理的基础知识。任务的实际实施取决于具体的应用要求。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19008

    浏览量

    302990
  • 操作系统
    +关注

    关注

    37

    文章

    6727

    浏览量

    123182

原文标题:FreeRTOS系列技术文章:上下文切换

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    编写一个任务调度程序,在上下文切换后遇到了一些问题求解

    大家好, 我正在编写一个任务调度程序,在上下文切换后遇到了一些问题。 为下一个任务恢复上下文后: __builtin_tricore_mtcr_by_name(\"pcxi\"
    发表于 05-22 07:50

    关于进程上下文、中断上下文及原子上下文的一些概念理解

    : 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。 当发生进程调度时,进行进程切换就是上下文切换(context switch
    发表于 09-06 09:58

    BT堆栈上下文切换

    100ms就会产生一个上下文切换上下文切换每秒似乎有点高。我想我真的不能抱怨10个开关,但是有什么东西吗?在BT协议中真的需要这个吗?不能处理中断驱动吗?(这是BT是可连接的,但既没有连接,也没有
    发表于 12-17 16:30

    多线程如何实现上下文切换

    处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成切换操作。
    发表于 08-02 08:21

    上下文切换简介

    处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成切换操作。
    发表于 08-06 08:08

    上下文切换的情况发生

    处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成切换操作。
    发表于 08-07 08:38

    ucos上下文该怎么切换

    有两个问题请教一下大神!!!-->1在ucos中的上下文切换时发生在pendSV异常中,代码见下:PendSV_Handler CPSIDI; Prevent interruption
    发表于 08-26 03:21

    基于cortex-m3的rt-thread系统如何实现线程上下文切换

    线程上下文切换等功能,一般采用汇编格式编写,不同cpu架构实现方式肯定不同,为了使rt-thread系统能够在不同的CPU架构上都能运行,RT-thread提供了一套libcpu抽象层来适配
    发表于 05-05 15:00

    Cortex-M4在线程上下文切换中的优化

    cortex-m4相对比cortex-m3,在线程上下文切换中,主要增加了FPU寄存器,总共需要保存34个寄存器,合计136byte。因此原来在cortex-m3上面运行的程序在cortex-m4f
    发表于 08-05 10:58

    讨论ARM mbed OS(RTX) 的上下文切换

    之一,有时间的话写一个 uVisor 解构系列文章。2. 前言本文解剖 mbed OS(下文简称 mbed)上下文切换实现的细节。mbed 是一个分态设计的内核,本文主要聚焦 ARM v7m 架构上
    发表于 02-16 14:26

    rt-thread上下文切换函数的意义在哪?

    Cortex-M3内核上下文切换函数rt_hw_context_switch()/ rt_hw_context_switch_interrupt()中有个判断rt_thread_switch_interrupt_flag的地方,不知道意义在哪?
    发表于 03-10 11:28

    中断中的上下文切换详解

    任务上下文切换的诉求。  为什么在中断服务函数中会产生任务上下文切换的诉求?因为中断中可能会进行信号量post之类的动作(这可能会触发此前一直处于pend状态的,且比当前被中断打断的任务优先级更高的任务
    发表于 03-23 17:18

    CPU上下文切换的详细资料讲解

    当UCOS-III转向执行另一项新任务的时候,他保存了当前任务的CPU寄存器到堆栈,并从新任务的堆栈CPU寄存器载入CPU,这个过程叫做上下文切换
    发表于 08-16 17:31 2次下载
    CPU<b class='flag-5'>上下文切换</b>的详细资料讲解

    如何分析Linux CPU上下文切换问题

    在我的上一篇文章:《探讨 Linux CPU 的上下文切换》中,我谈到了 CPU 上下文切换的工作原理。快速回顾一下,CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程
    的头像 发表于 05-05 20:11 1912次阅读

    Linux技术:什么是cpu上下文切换

    过多的上下文切换会消耗 CPU 的时间来保存和恢复寄存器、程序计数器、内核栈和虚拟内存等数据,从而导致系统性能显着下降。 既然上下文切换对系统性能的影响如此之大,那么我们如何检查它呢?好了,你可以使用 vmstat 工具来查询你系统的
    发表于 09-01 09:31 442次阅读
    Linux<b class='flag-5'>技术</b>:什么是cpu<b class='flag-5'>上下文切换</b>