内核控制的一些功能须要移植层提供,为了方便移植。这些API函数用宏来实现,比方上下文切换、进入和退出临界区、禁止和使能可屏蔽中断。内核控制函数还包含启动和停止调度器、挂起和恢复调度器以及用于低功耗模式的调整系统节拍函数。

1.强制上下文切换宏

taskYIELD:用于强制上下文切换的宏。

在中断服务程序中的等价版本号为portYIELD_FROM_ISR。这也是个宏,事实上现取决于移植层。

用于上下文切换的实际代码由移植层提供。对于Cortex-M3硬件。这个宏会引起PendSV中断。

2.进入临界区宏

taskENTER_CRITICAL:用于进入临界区的宏。在临界区中不会发生上下文切换。

进入临界区的实际代码由移植层提供,对于Cortex-M3硬件,先禁止全部RTOS可屏蔽中断,这能够通过向basepri 寄存器写入configMAX_SYSCALL_INTERRUPT_PRIORITY来实现。basepri寄存器被设置成某个值后,全部优先级号大于等于此值的中断都被禁止。但若被设置为0。则不关闭不论什么中断。0为默认值。然后临界区嵌套计数器增1。

3.退出临界区宏

taskEXIT_CRITICAL:用于退出临界区的宏。

退出临界区的实际代码有移植层提供。对于Cortex-M3硬件。先将临界区嵌套计数器减1。假设临界区计数器为零,则使能全部RTOS可屏蔽中断。这能够通过向basepri 寄存器写入0来实现。

4.禁止可屏蔽中断宏

taskDISABLE_INTERRUPTS:禁止全部RTOS可屏蔽中断。

在调用宏taskENTER_CRITICAL进入临界区时,也会间接调用该宏禁止全部RTOS可屏蔽中断。

5.使能可屏蔽中断宏

taskENABLE_INTERRUPTS:使能全部RTOS可屏蔽中断。在调用宏taskEXIT_CRITICAL退出临界区时,也会间接调用该宏使能全部RTOS可屏蔽中断。

6.启动调度器

6.1函数描写叙述

void vTaskStartScheduler( void );

启动RTOS调度器。之后RTOS内核控制哪个任务运行以及何时运行。

当调用vTaskStartScheduler()后,空暇任务被自己主动创建。假设configUSE_TIMERS被设置为1,定时器后台任务也会被创建。

假设vTaskStartScheduler()成功运行,则该函数不会返回,直到有任务调用了vTaskEndScheduler()。假设由于RAM不足而无法创建空暇任务,该函数也可能运行失败。并会立马返回调用处。

7.停止调度器

7.1函数描写叙述

void vTaskEndScheduler( void );

仅用于x86硬件架构中。

停止RTOS内核系统节拍时钟。全部创建的任务自己主动删除并停止多任务调度。

8.挂起调度器

8.1函数描写叙述

void vTaskSuspendAll( void );

挂起调度器。但不禁止中断。当调度器挂起时,不会进行上下文切换。

调度器挂起后。正在运行的任务会一直继续运行,内核不再调度(意味着当前任务不会被切换出去),直到该任务调用了xTaskResumeAll ()函数。

内核调度器挂起期间,那些能够引起上下文切换的API函数(如vTaskDelayUntil()、xQueueSend()等)决不可使用。

9.恢复被挂起的调度器

9.1函数描写叙述

BaseType_t xTaskResumeAll( void );

恢复因调用vTaskSuspendAll()函数而挂起的实时内核调度器。xTaskResumeAll()仅恢复调度器,它不会恢复那些被vTaskSuspend()函数挂起的任务。

9.2返回值

返回pdTRUE 表示恢复调度器引起了一次上下文切换,否则,返回pdFALSE。

9.3使用方法举例

 voidvTask1( void * pvParameters )
{
for( ;; )
{
/* 任务代码写在这里 */ /* ... */ /* 有些时候。某个任务希望能够连续长时间的运行,但这时不能使用taskENTER_CRITICAL ()/taskEXIT_CRITICAL ()的方法,这样会屏蔽掉中断,引起中断丢失。包含系统节拍时钟。 能够使用vTaskSuspendAll ()停止RTOS内核调度:*/
xTaskSuspendAll (); /* 运行操作代码放在这里。 这样不用进入临界区就能够连续长时间运行了。在这期间。中断仍然会得到响应,RTOS内核系统节拍时钟也会继续保持运作 */ /* ... */ /* 操作结束。又一次启动RTOS内核 。我们想强制进行一次上下文切换。可是假设恢复调度器的时候已经运行了上下文切换。再运行一次是没有意义的。因此会进行一次推断。 */
if( !xTaskResumeAll () )
{
taskYIELD ();
}
}
}

10.调整系统节拍

10.1函数描写叙述

void vTaskStepTick( TickType_txTicksToJump );

假设RTOS使能tickless空暇功能,每当仅仅有空暇任务被运行时,系统节拍时钟中断将会停止,微控制器进入低功耗模式。

当微控制器退出低功耗后。系统节拍计数器必须被调整,将进入低功耗的时间弥补上。

假设FreeRTOS移植文件里定义了宏portSUPPRESS_TICKS_AND_SLEEP()实体,则函数vTaskStepTick用于在这个宏portSUPPRESS_TICKS_AND_SLEEP()实体内部调整系统节拍计数器。函数vTaskStepTick是一个全局函数,所以也能够在宏portSUPPRESS_TICKS_AND_SLEEP()实体中重写该函数。

在文件FreeRTOSConfig.h中,宏configUSE_TICKLESS_IDLE必须设置为1。此函数才有效。

10.2參数描写叙述

  • xTickToJump:时间值,单位是系统节拍周期,表示微处理器进入低功耗的时间,函数依据这个值来调整系统节拍计数器的值。

10.3使用方法举例

/* 首先定义宏portSUPPRESS_TICKS_AND_SLEEP()。宏參数指定要进入低功耗(睡眠)的时间,单位是系统节拍周期。*/
#defineportSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime ) /* 定义被宏portSUPPRESS_TICKS_AND_SLEEP()调用的函数 */
void vApplicationSleep(TickType_t xExpectedIdleTime )
{
unsigned long ulLowPowerTimeBeforeSleep,ulLowPowerTimeAfterSleep; /* 从时钟源获取当前时间,当微控制器进入低功耗的时候,这个时钟源必须在运行 */
ulLowPowerTimeBeforeSleep =ulGetExternalTime(); /*停止系统节拍时钟中断。*/
prvStopTickInterruptTimer(); /* 配置一个中断,当指定的睡眠时间达到后,将处理器从低功耗中唤醒。这个中断源必须在微控制器进入低功耗时也能够工作。*/
vSetWakeTimeInterrupt( xExpectedIdleTime ); /*进入低功耗 */
prvSleep(); /* 确定微控制器进入低功耗模式持续的真正时间。由于其他中断也可能使得微处理器退出低功耗模式。 注意:在调用宏portSUPPRESS_TICKS_AND_SLEEP()之前。调度器应该被挂起,portSUPPRESS_TICKS_AND_SLEEP()返回后,再将调度器恢复。因此。这个函数未完毕前。不会运行其他任务。 */
ulLowPowerTimeAfterSleep =ulGetExternalTime(); /*调整内核系统节拍计数器。*/
vTaskStepTick( ulLowPowerTimeAfterSleep –ulLowPowerTimeBeforeSleep ); /*又一次启动系统节拍时钟中断。*/
prvStartTickInterruptTimer();
}

FreeRTOS系列第13篇---FreeRTOS内核控制的更多相关文章

  1. FreeRTOS系列第2篇---FreeRTOS入门指南【转】

    转自:http://blog.csdn.net/zhzht19861011/article/details/49819309 版权声明:本文为博主原创文章,未经博主允许不得转载.联系邮箱:zhzhch ...

  2. FreeRTOS系列第17篇---FreeRTOS队列

    本文介绍队列的基本知识,具体源代码分析见<FreeRTOS高级篇5---FreeRTOS队列分析> 1.FreeRTOS队列 队列是基本的任务间通讯方式.能够在任务与任务间.中断和任务间传 ...

  3. FreeRTOS系列第14篇---FreeRTOS任务通知

    注:本文介绍任务通知的基础知识,具体源代码分析见<FreeRTOS高级篇8---FreeRTOS任务通知分析> 每一个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0.R ...

  4. FreeRTOS系列第20篇---FreeRTOS信号量API函数

    FreeRTOS的信号量包括二进制信号量.计数信号量.相互排斥信号量(以后简称相互排斥量)和递归相互排斥信号量(以后简称递归相互排斥量).我们能够把相互排斥量和递归相互排斥量看成特殊的信号量. 信号量 ...

  5. Mysql高手系列 - 第13篇:细说NULL导致的神坑,让人防不胜防

    这是Mysql系列第13篇. 环境:mysql5.7.25,cmd命令中进行演示. 当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免? ...

  6. Jenkins进阶系列之——13修改Jenkins权限控制

    说明:本方法适用于安全矩阵和项目矩阵授权策略的Jenkins. 很多童鞋在使用jenkins的时候忘记配置权限或者权限配置错误,然后各种蛋疼.最近闲着无事,折腾了下.好了,闲话少扯. Jenkins的 ...

  7. spring 5.x 系列第13篇 —— 整合RabbitMQ (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 本用例关于rabbitmq的整合提供简单消 ...

  8. Mysql高手系列 - 第10篇:常用的几十个函数详解,收藏慢慢看

    这是Mysql系列第10篇. 环境:mysql5.7.25,cmd命令中进行演示. MySQL 数值型函数 函数名称 作 用 abs 求绝对值 sqrt 求二次方根 mod 求余数 ceil 和 ce ...

  9. Mysql高手系列 - 第14篇:详解事务

    这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操 ...

随机推荐

  1. angularjs1-3,工具方法,bootstrap,多个module,引入jquery

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. USACO 2.1 Sorting a Three-Valued Sequence

    Sorting a Three-Valued Sequence IOI'96 - Day 2 Sorting is one of the most frequently performed compu ...

  3. DOM基础知识(Node对象、Element对象)

    5.Node对象 u  遍历节点 u 父节点 .parentNode - 获取父节点—> 元素节点或文档节点 .parentElement - 获取父元素节点—> 元素节点 u    子节 ...

  4. <Android Framework 之路>Android5.1 Camera Framework(三)

    上一次讲解了一下startPreview过程,主要是为了画出一条大致的从上到下的线条,今天我们看一下Camera在Framework的sendCommand和dataCallback,这部分属于衔接过 ...

  5. svn中有的代码被标注黄色,绿色和红色,分别表示什么意思呢?

    1.红色感叹号表示这个文件从服务器上下载下来以后,在本地被修改过.这时执行提交操作就可以了.2.黄色感叹号表示这个文件在提交的时候发现存在冲突,也就是说有别人在你提交之前对这个文件的同一个版本进行了修 ...

  6. 转:Hibernate使用SQLQuery

    原文:http://hi.baidu.com/luo_qing_long/blog/item/783a15eceb75abdd2f2e21b0.html 对原生SQL查询执行的控制是通过SQLQuer ...

  7. s2sh的MVC执行流程和执行原理

    =======================执行流程 1. 从页面开始,提交表单或者点击链接会触发一个action 2. action交给struts2处理,读取src目录struts.xml文件, ...

  8. 解决从Excel导入数据库,导入到DataTable时数据类型发生变化的问题(如数字类型变成科学计数法,百分数变成小数)

    做项目的时候,C#读取Excel数据到DataTable或者DataSet,设断点查看DataTable,发现Excel的显示为较长位数数字的字段如0.000012在DataTable中显示为科学计数 ...

  9. UVa 11520 Fill in the Square

    题意:给出 n*n的格子,把剩下的格子填上大写字母,使得任意两个相邻的格子的字母不同,且从上到下,从左到右的字典序最小 从A到Z枚举每个格子填哪一个字母,再判断是否合法 #include<ios ...

  10. learn cmake

    cmake简介 在cmake出现之前,在linuxiax下,大型软件系统一般使用make来控制编译过程,而在Windows下可能是用vs下一个project来构建.一个复杂的系统本身依赖关系就很麻烦, ...