十二 freertos任务-任务栈调度锁

FreeRTOS 打开调度锁

使用如下函数可以实现 FreeRTOS 的调度锁开启:

vTaskSuspendAll ()

函数原型:

   void vTaskSuspendAll( void );

函数描述:

   函数 vTaskSuspendAll 用于实现 FreeRTOS 调度锁开启。

使用这个函数要注意以下问题:

  1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。3. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引起任务切换的 API,比如 vTaskDelayUntil、 vTaskDelay、 xQueueSend 等。

FreeRTOS 调度锁关闭

使用如下函数可以实现 FreeRTOS 的调度锁关闭:

xTaskResumeAll ()

函数原型:

BaseType_t xTaskResumeAll(void)

函数描述:

函数 xTaskResumeAll 用于实现 FreeRTOS 调度锁关闭

调度锁关闭后,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE。
使用这个函数要注意以下问题:

1. 调度锁函数只是禁止了任务调度,并没有关闭任何中断。
2. 调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 一定要成对使用。
3. 切不可在调度锁开启函数 vTaskSuspendAll 和调度锁关闭函数 xTaskResumeAll 之间调用任何会引 起任务切换的 API,比如 vTaskDelayUntil、 vTaskDelay、 xQueueSend 等。
#include <stdio.h>
#include "board.h"
#include "led.h"
#include "key.h"#include "uart.h"/*** System oscillator rate and clock rate on the CLKIN pin  ****/
/**/const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ;       /**/
/**/const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ;        /**///系统复位
#define System_restart  (LPC_SWM->PINENABLE0 = 0xffffffffUL) /**/
/***************************************************************/#include "FreeRTOSConfig.h"
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
/**************************** 任务句柄 ********************************/
/* * 任务句柄是一个指针,用于指向一个任务。*//* LED任务句柄 */
static TaskHandle_t LED1_Task_Handle= NULL;
static TaskHandle_t UART_Task_Handle= NULL;
static TaskHandle_t KEY_Task_Handle = NULL;
//static xTaskHandle  pv_handle = NULL;#define TASK_STACK_SIZE 32/* Sets up system hardware
*********************************************************************** @ 函数名  : BSP_Init* @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面* @ 参数    :   * @ 返回值  : 无
*********************************************************************/
static void prvSetupHardware(void)
{SystemCoreClockUpdate();DEBUGINIT();led_Init() ;   Key_INIT();Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "\n");}/*********************************************************************** @ 函数名  : vLED_Task0* @ 功能说明: LED_Task任务主体* @ 参数    :   * @ 返回值  : 无********************************************************************/static void vLED1_Task (void *pvParameters)
{bool LedState = false;u8 i=0;while (1) {LedState = (bool) !LedState;for(i=0;i<8;i++){Board_LED_Set(i, LedState);}vTaskDelay(500);}
}/******
任务栈测试
*****/
static void vUART_Task (void *pvParameters)
{//栈剩余检测printf("vUART_Task 任务栈开始:%d\n",(int)uxTaskGetStackHighWaterMark(NULL));while (1) {Board_UARTPutSTR("FreeRTOS 动态创建任务\n");printf("userKey 按下挂起任务, upKey按下恢复任务\n");printf("vUART_Task 任务栈剩余:%d\n",(int)uxTaskGetStackHighWaterMark(NULL));vTaskDelay(1000);}
}static void vKEY_task(void* pvParameters)
{uint8_t pcWriteBuffer[200];u8 key2=0;while(1){u8 key=0;if(Scan_Key())vTaskDelay(20);else continue;if(!Scan_Key())continue;else{key=Scan_Key();key2=key;}vTaskSuspendAll(); /* 开启调度锁 */while(Scan_Key()){};//等按键抬起/* 关闭调度锁,如果需要任务切换,此函数返回 pdTRUE,否则返回 pdFALSE */if(!xTaskResumeAll()){taskYIELD ();}if(key2){switch(key2){case 1:{printf("KEY1挂起任务LED\r\n");vTaskSuspend(LED1_Task_Handle);vTaskSuspend(UART_Task_Handle);}break;case 2:{printf("KEY2恢复任务LED\r\n");vTaskResume(LED1_Task_Handle);vTaskResume(UART_Task_Handle);}break;case 3:{/*为了获取FreeRTOS任务的执行情况,需要执行如下操作* a在FreeRTOSConfig.h文件中使能如下宏* #define configUSE_TRACE_FACILITY                  1* #define configGENERATE_RUN_TIME_STATS               1*/printf("=================================================\r\n");printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");vTaskList((char *)&pcWriteBuffer);printf("%s\r\n", pcWriteBuffer);}break;default:break;}key2=0;}}
}/************************************************************************ @ 函数名  : AppTaskCreate* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面* @ 参数    : 无  * @ 返回值  : 无**********************************************************************/
static void AppTaskCreate()
{BaseType_t xReturn=pdPASS;/*定义任务返回值*/taskENTER_CRITICAL();//进入临界区,禁止中断打断
//  xReturn=xTaskCreate(vLED1_Task, "vLED1_Task",TASK_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),(TaskHandle_t *) &LED1_Task_Handle);xReturn=xTaskCreate(vUART_Task, "vUART_Task",TASK_STACK_SIZE+32, NULL, (tskIDLE_PRIORITY + 1UL),&UART_Task_Handle);xReturn=xTaskCreate(vKEY_task, "vKEY_Task",TASK_STACK_SIZE*4, NULL, (tskIDLE_PRIORITY + 1UL),(TaskHandle_t *) &KEY_Task_Handle);if(pdPASS==xReturn){printf("创建LED_Task任务成功\r\n");} //   vTaskDelete(LED1_Task_Handle);//删除AppTaskCreate任务
//   vTaskDelete(UART_Task_Handle);//删除AppTaskCreate任务taskEXIT_CRITICAL(); //退出临界区}/*** @brief main routine for blinky example* @return   Function should not exit.*/
int main(void)
{prvSetupHardware();Board_UARTPutSTR("LPC824 FreeRTOS 任务管理\n\r");printf("Key按下挂起任务,Key按下恢复任务\r\n");AppTaskCreate();vTaskStartScheduler();//任务调度/* Loop forever */while (1) {printf("FreeRTOS 运行失败\n\r");}}

12 freertos任务-任务栈调度锁相关推荐

  1. 调度锁解决任务间资源共享问题

    文章目录 1 调度锁解决任务间资源共享问题 1.1 工作原理 1.2 任务访问流程 1.3 嵌套问题 1.4 分析 1 调度锁解决任务间资源共享问题 1.1 工作原理 实例:tinyOS中调度锁的实现 ...

  2. c语言列车调度 栈,这个用栈调度火车的程序到底是怎么回事?

    这个用栈调度火车的程序到底是怎么回事? 下面是一个用栈来实现火车调度的程序,其中,in代表初始的车列顺序,transter代表用来调度的火车轨,out代表调度后的火车轨,程序功能如下,如果in中车列顺 ...

  3. 【已解决】MIUI升级12.5.8后没有永不锁屏选项

    MIUI升级12.5.8后没有永不锁屏选项 问题描述 解决方案 打开开发者选项 [设置]→[我的设备]→[全部参数]→快速点击五次[MIUI版本] 开启"不锁定屏幕" [设置]→[ ...

  4. [书]操作系统真象还原 -- 第11、12章 用户进程及调度、系统调用、内存管理

    ======  第 12 章 系统调用.内存管理 ====== GITHUB: https://github.com/trb331617/os_elephant/tree/master/chapter ...

  5. FreeRTOS 任务栈大小确定及其溢出检测

    以下转载自https://www.cnblogs.com/yangguang-it/p/7123727.html FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常 ...

  6. 12. 面试官不问, 你也不得不知道的锁知识!

    前言 hello, 大家好, 我是咸鱼君, 擅长各种Java摸鱼姿势. 恰逢2020年"金九"月, 今天, 我们就来说一说面试中出现频率极高的锁知识! ps:说不定可以帮到部分有& ...

  7. FreeRTOS学习九(锁机制)

    在执行代码时,有的代码开始执行,是不允许被打断的.这部分的代码也叫作临界段代码.为了确保这些代码不被中断而增加了临界区的概念.所谓的临界区保护重要流程在执行的时候不会被其他事情打断.等流程运行结束后, ...

  8. FreeRTOS 查询任务 剩余的栈空间的 方法

    FreeRTOS 源码下载地址 1.官方文档提供了   函数  用来查询  任务 剩余   栈 空间,首先是看官方的文档解释(某位大神 翻译 的 官方文档.) 参数解释:     xTask:被查询任 ...

  9. 12.2 新特性:锁信息获取之在线删除索引

    黄廷忠 云和恩墨西区交付总监  简介: 超过10年专职电信行业 Oracle 数据库管理和运维经验,熟悉电信行业的业务.数据库及硬件架构.擅长数据库各种迁移方法.优化.疑难故障排除.数据库异常恢复等. ...

最新文章

  1. java中rs怎么用_java-如何使用JAX-RS设置字符集?
  2. sql删除语句_Part 3 | SQL学习:删除行
  3. parquet格式_6种数据格式对比,用Jupyter+pandas高效数据分析
  4. 将TUM数据集制作成BundleFusion数据集
  5. Android开发:调用camera API 创建MediaRecorder
  6. 系统架构----(2)大型网站架构之架构模式
  7. matlab repmat 函数的使用
  8. solr索引大小对比
  9. lintcode-397-最长上升连续子序列
  10. 选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...
  11. 关于没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题的解决方案
  12. 【数字信号处理】基本序列 ( 复指数序列 | 单位复指数序列 | 复变函数欧拉公式 )
  13. Task08|文本数据|joyfulpandas
  14. 注释一下blk_update_request函数
  15. 一文读懂卷积神经网络中的1x1卷积核
  16. 190502 Expressing Belief
  17. 环签名——典型的数字签名技术
  18. dso与Android,DSO 安装及运行 —— dso_ros + Android 手机摄像头
  19. perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)
  20. 工信部怒了,App 厂商们又作死

热门文章

  1. Nature | 微小的降雨变化极大地改变了植物的物种共存
  2. 强强联合 极智嘉助力Rhenus部署亚洲首个AMR智能仓
  3. node.js - Nodejs 分布式事务_个人文章 - SegmentFault 思否
  4. Axure元件-动态面板介绍
  5. win10计算机性能设置,Win10笔记本电脑拥有双显卡,一个集成的,一个独显。那么,怎么设置自动切换到高性能 - Microsoft Community...
  6. cas15839-78-8,UDP-L-Arabinose ,UDP-B-L-阿拉伯糖二钠盐;UDP-b-L-arabinopyranose
  7. office套件_OfficeSuite v4.9免费专业Office办公套件
  8. 【深度学习:21 天实战 Caffe】课后习题参考答案
  9. ABP模块系统插件机制
  10. Verilog例子整理(转载)