【freertos操作系统教程】第16章 freertos调度锁,任务锁和中断锁

上传人:wm****3 文档编号:47262643 上传时间:2018-07-01 格式:PDF 页数:28 大小:779.16KB
返回 下载 相关 举报
【freertos操作系统教程】第16章  freertos调度锁,任务锁和中断锁_第1页
第1页 / 共28页
【freertos操作系统教程】第16章  freertos调度锁,任务锁和中断锁_第2页
第2页 / 共28页
【freertos操作系统教程】第16章  freertos调度锁,任务锁和中断锁_第3页
第3页 / 共28页
【freertos操作系统教程】第16章  freertos调度锁,任务锁和中断锁_第4页
第4页 / 共28页
【freertos操作系统教程】第16章  freertos调度锁,任务锁和中断锁_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《【freertos操作系统教程】第16章 freertos调度锁,任务锁和中断锁》由会员分享,可在线阅读,更多相关《【freertos操作系统教程】第16章 freertos调度锁,任务锁和中断锁(28页珍藏版)》请在金锄头文库上搜索。

1、第16章 F Fr re ee eR RT TOOS S 调调度度锁锁,任任务务锁锁和和中中断断锁锁 本章教程为大家讲解调度锁,任务锁和中断锁的概念,以及 FreeRTOS 调度锁的使用。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429。 16.1 调度锁 16.2 中断锁 16.3 任务锁 16.4 FreeRTOS 调度锁开启 16.5 FreeRTOS 调度锁关闭 16.6 实验例程说明 16.7 总结 1 16 6. .1 1 调调度度锁锁 调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函

2、数,处于调度锁开和调度锁关之间的代码在执行期间是不会被高优先级的任务抢占的,即任务调度被禁止。这一点要跟临界段的作用区分开,调度锁只是禁止了任务调度,并没有关闭任何中断,中断还是正常执行的。而临界段进行了开关中断操作。 1 16 6. .2 2 中中断断锁锁 中断锁就是 RTOS 提供的开关中断函数,FreeRTOS 没有专门的中断锁函数,使用 15.3 小节里面介绍的中断服务程序临界段处理函数就可以实现同样效果。 1 16 6. .3 3 任任务务锁锁 简单的说,为了防止当前任务的执行被其它高优先级的任务打断而提供的锁机制就是任务锁。FreeRTOS 也没有专门的任务锁函数,但是使用 Fre

3、eRTOS 现有的功能有两种实现方法: 通过给调度器加锁实现 利用 FreeRTOS 的调度锁功能给调度器加锁的话,将关闭任务切换功能,从而高优先级任务也就无法抢占低优先级任务的执行,同时高优先级任务也是无法向低优先级任务切换的。另外特别注意,调度锁只是禁止了调度器工作,并没有关闭任何中断。 通过关闭任务切换中断 PendSV 和系统时钟节拍中断 Systick 武武汉汉安安富富莱莱电电子子有有限限公公司司W W W WW W W WW W W W. . . .A A A AR R R RM M M MF F F FL L L LY Y Y Y. . . .C C C CO O O OM M

4、M M 安安富富莱莱 S ST TM M3 32 2- -V V6 6 开开发发板板 F Fr re ee eR RT TO OS S 教教程程 2 20 01 16 6年年0 06 6月月3 30 0日日 版版本本:1 1. .0 0 第第 2 2 页页 共共 2 28 8 页页 利用 FreeRTOS 的任务代码临界段处理函数就可以关闭 PendSV 中断和 Systick 中断。 因为进入临界段前,操作寄存器 basepri 关闭了所有小于等于宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 所定义的中断优先级(实现任务切换功能的 PendS

5、V 中断和滴答定时器中断是最低优先级中断,所以也是被关闭的),这样低优先级任务在执行临界段代码期间是不会被高优先级任务打断的,从而就实现了任务锁的效果。 1 16 6. .4 4 F Fr re ee eR RT TOOS S 调调度度锁锁开开启启 使用如下函数可以实现 FreeRTOS 的调度锁开启: vTaskSuspendAll() 关于这个函数的讲解及其使用方法可以看 FreeRTOS 在线版手册: 这里也对此函数进行下介绍。 函数原型: void vTaskSuspendAll( void ); 函数描述: 函数 vTaskSuspendAll 用于实现 FreeRTOS 调度锁开启

6、。 使用这个函数要注意以下问题: 1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。 2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。 武武汉汉安安富富莱莱电电子子有有限限公公司司W W W WW W W WW W W W. . . .A A A AR R R RM M M MF F F FL L L LY Y Y Y. . . .C C C CO O O OM M M M 安安富富莱莱 S ST TM M3 32 2- -V V6 6 开开发发板板 F Fr re ee eR RT TO OS S 教教程程 2 20

7、 01 16 6年年0 06 6月月3 30 0日日 版版本本:1 1. .0 0 第第 3 3 页页 共共 2 28 8 页页 3. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、xQueueSend 等。 使用举例: /* * * 函 数 名: vTaskLED * 功能说明: LED 闪烁 * 形 参: pvParameters 是在创建该任务时传递的形参 * 返 回 值: 无 * 优 先 级: 2 * */ static void

8、vTaskLED(void *pvParameters) while(1) vTaskSuspendAll(); /* 开启调度锁 */ printf(“任务 vTaskLED 正在运行rn“); xTaskResumeAll (); /* 关闭调度锁 */ bsp_LedToggle(2); vTaskDelay(200); 1 16 6. .5 5 F Fr re ee eR RT TOOS S 调调度度锁锁关关闭闭 使用如下函数可以实现 FreeRTOS 的调度锁关闭: xTaskResumeAll () 关于这个函数的讲解及其使用方法可以看 FreeRTOS 在线版手册: 武武汉汉安安

9、富富莱莱电电子子有有限限公公司司W W W WW W W WW W W W. . . .A A A AR R R RM M M MF F F FL L L LY Y Y Y. . . .C C C CO O O OM M M M 安安富富莱莱 S ST TM M3 32 2- -V V6 6 开开发发板板 F Fr re ee eR RT TO OS S 教教程程 2 20 01 16 6年年0 06 6月月3 30 0日日 版版本本:1 1. .0 0 第第 4 4 页页 共共 2 28 8 页页 这里也对此函数进行下介绍。 函数原型: BaseType_t xTaskResumeAll(v

10、oid) 函数描述: 函数 xTaskResumeAll 用于实现 FreeRTOS 调度锁关闭 调度锁关闭后,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE。 使用这个函数要注意以下问题: 1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。 2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。 3. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、vTaskDelay、

11、xQueueSend 等。 使用举例: /* * * 函 数 名: vTaskLED * 功能说明: LED 闪烁 * 形 参: pvParameters 是在创建该任务时传递的形参 * 返 回 值: 无 * 优 先 级: 2 * */ static void vTaskLED(void *pvParameters) 武武汉汉安安富富莱莱电电子子有有限限公公司司W W W WW W W WW W W W. . . .A A A AR R R RM M M MF F F FL L L LY Y Y Y. . . .C C C CO O O OM M M M 安安富富莱莱 S ST TM M3 3

12、2 2- -V V6 6 开开发发板板 F Fr re ee eR RT TO OS S 教教程程 2 20 01 16 6年年0 06 6月月3 30 0日日 版版本本:1 1. .0 0 第第 5 5 页页 共共 2 28 8 页页 while(1) vTaskSuspendAll(); /* 开启调度锁 */ printf(“任务 vTaskLED 正在运行rn“); xTaskResumeAll (); if(!xTaskResumeAll() /* 关闭调度锁,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE */ taskYIELD (); bsp_LedTog

13、gle(2); vTaskDelay(200); 1 16 6. .6 6 实实验验例例程程说说明明 16.6.1 STM32F103 开发板实验 配套例子: V4-310_FreeRTOS 实验_调度锁 实验目的: 1. 学习 FreeRTOS 的调度锁。 2. 注意,调度锁只是关闭了任务的调度功能,并没有关闭任何中断,中断可以继续执行。 实验内容: 1. K1 按键按下,串口打印任务执行情况(波特率 115200,数据位 8,奇偶校验位无,停止位 1)。 2. 本实验通过调度锁的功能,实现 printf 函数的多任务调用。 3. 各个任务实现的功能如下: vTaskUserIF 任务 :按键消息处理。 vTaskLED 任务 :LED 闪烁。 vTaskMsgPro 任务 :消息处理,这里是用作 LED 闪烁。 vTaskStart 任务 :启动任务,也是最高优先级任务,这里实

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号