Freertos Cortex-M3上下文切换

上下文切换是操作系统实现虚拟化的核心功能,操作系统对任务的管理通过上下文切换完成。
Freertos 在STM32F103上的上下文切换是本文介绍的内容。STM32F103 采用 Cortex-M3 内核 。

上下文切换的本质是对现场的保护和恢复现场,切换 CPU的运行环境。
上下文切换的触发来源于调度器,调度器根据复杂智能的调度算法来判断,是否要进行上下文切换。这换意味着一个任务被‘暂停’,任务中所做的事情都会被暂停。

1.调度器的优先级
Freertos 调度器本身的周期性运行是靠一个时间定时器systick的中断来触发的 ,假设每过1ms调度器就会随着systick的中断而运行。CUP不得不每过1ms就要去处理一下调度器的任务,增加了系统开销。这个时间间隔过短就会频繁中断CPU,过长就会让任务无法及时的切换。通常这个时间间隔选择1ms。

实时系统管关注的是实时性,Freertos做了一个非常聪明的机制。设定systick的中断优先级,那么比这个优先级高的中断就不会被打断,这样在系统中需要及时处理的问题就不会受到调度器的干扰。
这个优先级的定义
configMAX_SYSCALL_INTERRUPT_PRIORITY
默认的设定是 调度器不希望打断任何中断,所以把systick的中断优先级 设置为所有中断中最低的优先级。这样调度器不会打乱任何中断的运行。

那么这个中断优先级是如何设定的,打开Cortex-M3 权威指南
下图是异常列表
在这里插入图片描述
在这里插入图片描述

0~15是16 个 Cortex-M3 的中断线 对于外部中断,从第十六个开始。
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。来产生操作系统需要的滴答中断,作为整个系统的时基。
11 为SVCall,14为PendSv 上下文切换就放在11和14中进行
所有我们要把他配置为最低的中断优先级就可以了。直接写0不就完事了吗?

挺有趣的, Cortex-M3 中0是可以配置的最大优先级,在 Cortex-M3 中优先级寄存器数字越小代表优先级最高。所以我们就是要确定优先级寄存器最大能填多少,这样就能找到最低优先级了。

这里已经很有趣又有点绕了,STM32F103在优先级设定上又做了一次设计,神操作让我们设定一下优先级 会变的的这么复杂。Cortex-M3 设计优先级的时候,一个中断节点优先级用8bit表示。STM32F103只用了其中4个,而且是最高位4个。所以中断优先级一共222*2=16级。但是IC设计人员没有用8位,用的高4位 所以,16 优先级来说来说就是
1111 0000 =240

Freertos的开发人员为了应对不同IC厂的操作,他们想了一个办法。
就是先拿一个中断寄存器出来,写个最大值进去,ARM Cortex-M3 给了8bit干脆就写个256(0xff)进去。然后读出来看看是多少,比如写 1111 1111(0xFF )进去读出来是 1111 0000,那显然这IC是用了高4位。
然后我们看Freertos的源码xPortStartSchedule一下截取一部分

xPortStartScheduler()
volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

/* Determine the maximum priority from which ISR safe FreeRTOS API
 * functions can be called.  ISR safe functions are those that end in
 * "FromISR".  FreeRTOS maintains separate thread and ISR API functions to
 * ensure interrupt entry is as fast and simple as possible.
 *
 * Save the interrupt priority value that is about to be clobbered. */
ulOriginalPriority = *pucFirstUserPriorityRegister;

/* Determine the number of priority bits available.  First write to all
 * possible bits. */
*pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值