我的编程空间,编程开发者的网络收藏夹
学习永远不晚

FreeRTOS实时操作系统的内核控制示例解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

FreeRTOS实时操作系统的内核控制示例解析

前言

内核控制的一些功能需要移植层提供,为了方便移植,这些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( ;; )
     {
         
         
         
         xTaskSuspendAll ();
         
         
         
         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用法举例

#defineportSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime ) void vApplicationSleep(TickType_t xExpectedIdleTime ){ unsigned long ulLowPowerTimeBeforeSleep,ulLowPowerTimeAfterSleep;  ulLowPowerTimeBeforeSleep =ulGetExternalTime();  prvStopTickInterruptTimer();  vSetWakeTimeInterrupt( xExpectedIdleTime );  prvSleep();  ulLowPowerTimeAfterSleep =ulGetExternalTime();  vTaskStepTick( ulLowPowerTimeAfterSleep –ulLowPowerTimeBeforeSleep );  prvStartTickInterruptTimer();}
#defineportSUPPRESS_TICKS_AND_SLEEP( xIdleTime ) vApplicationSleep( xIdleTime )
 
void vApplicationSleep(TickType_t xExpectedIdleTime )
{
    unsigned long ulLowPowerTimeBeforeSleep,ulLowPowerTimeAfterSleep;
     
    ulLowPowerTimeBeforeSleep =ulGetExternalTime();
     
    prvStopTickInterruptTimer();
     
    vSetWakeTimeInterrupt( xExpectedIdleTime );
     
    prvSleep();
     
    ulLowPowerTimeAfterSleep =ulGetExternalTime();
            
    vTaskStepTick( ulLowPowerTimeAfterSleep –ulLowPowerTimeBeforeSleep );
    
    prvStartTickInterruptTimer();
}

以上就是FreeRTOS实时操作系统的内核控制示例解析的详细内容,更多关于FreeRTOS实时操作系统内核控制的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

FreeRTOS实时操作系统的内核控制示例解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

FreeRTOS实时操作系统的内核控制是什么

这篇文章主要介绍“FreeRTOS实时操作系统的内核控制是什么”,在日常操作中,相信很多人在FreeRTOS实时操作系统的内核控制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”FreeRTOS实时操作系
2023-06-29

FreeRTOS实时操作系统内核配置的方法

今天小编给大家分享一下FreeRTOS实时操作系统内核配置的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。FreeRTO
2023-06-29

Linux操作系统的NTFS和内核的示例分析

今天就跟大家聊聊有关Linux操作系统的NTFS和内核的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。传统编译内核模块的方法繁琐而费时,这里介绍一种快速编译所需要内核模块的新
2023-06-17

FreeRTOS实时操作系统的内存怎么管理

这篇“FreeRTOS实时操作系统的内存怎么管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“FreeRTOS实时操作系统的
2023-06-29

FreeRTOS实时操作系统Cortex-M内核使用注意事项是什么

这篇文章主要介绍了FreeRTOS实时操作系统Cortex-M内核使用注意事项是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇FreeRTOS实时操作系统Cortex-M内核使用注意事项是什么文章都会有所收
2023-06-29

编程热搜

目录