FreeRTOS任务切换的场合

FreeRTOS任务的切换最终都是在PendSV中断服务函数(汇编代码实现的)中完成的,发生任务切换的场合有两种情况:

1) 执行一个系统调用

2) 系统滴答定时器(sysTick)中断

所谓的执行系统调用就是执行了taskYIELD()函数或者调用了taskYIELD的其他API函数;taskYIELD()函数定义在task.h中:

#define taskYIELD()          portYIELD()

函数portELD定义在portmacro.h中:

#define portYIELD()

{

         portNVIC_INT_CTRL_REG=portNVIC_PENDSVSET_BIT;//步骤1

         __dsb(portSY_FULL_READ_WRITE);

         __isb(portSY_FULL_READ_WRITE);

}

步骤1表示通过向中断控制和状态寄存器ICSR的bit28写入1挂起PendSV来启动PendSV中断。这样就可以在PendSV中断服务函数中进行任务切换了。

中断级的任务切换函数为portYIELD_FROM_ISR()也是通过调用portYIELD来完成任务切换的。

第二个能产生任务切换的就是滴答定时器(SysTick)中断服务函数:

void SysTick_Handler(void)

{

         if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行

         {

                   xPortSysTickHandler();

}

}

xPortSysTickHandler()的主要功能是向中断控制和状态寄存器ICSR的bit28写入1挂起PendSV来启动PendSV中断。这样就可以在PendSV中断服务函数中进行任务切换了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,867评论 0 27
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,136评论 1 32
  • 1. 结构体和共同体的区别。 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。共同体uni...
    breakfy阅读 2,138评论 0 22
  • 分开之后不在想你,那是不可能的。所以我决定把我们最美好的时光写在这里。 今天的故事还是在练车场,下...
    迷魂丹阅读 315评论 0 2
  • 艾灸的原理是用易燃的艾绒等在体表经穴或患病部位进行烧灼、熏烤,借助药物温热的刺激,通过经络的传导,起到温通气血,扶...
    峰行者阅读 706评论 0 0