12 freertos任务-任务栈调度锁
十二 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.2 任务访问流程 1.3 嵌套问题 1.4 分析 1 调度锁解决任务间资源共享问题 1.1 工作原理 实例:tinyOS中调度锁的实现 ...
- c语言列车调度 栈,这个用栈调度火车的程序到底是怎么回事?
这个用栈调度火车的程序到底是怎么回事? 下面是一个用栈来实现火车调度的程序,其中,in代表初始的车列顺序,transter代表用来调度的火车轨,out代表调度后的火车轨,程序功能如下,如果in中车列顺 ...
- 【已解决】MIUI升级12.5.8后没有永不锁屏选项
MIUI升级12.5.8后没有永不锁屏选项 问题描述 解决方案 打开开发者选项 [设置]→[我的设备]→[全部参数]→快速点击五次[MIUI版本] 开启"不锁定屏幕" [设置]→[ ...
- [书]操作系统真象还原 -- 第11、12章 用户进程及调度、系统调用、内存管理
====== 第 12 章 系统调用.内存管理 ====== GITHUB: https://github.com/trb331617/os_elephant/tree/master/chapter ...
- FreeRTOS 任务栈大小确定及其溢出检测
以下转载自https://www.cnblogs.com/yangguang-it/p/7123727.html FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常 ...
- 12. 面试官不问, 你也不得不知道的锁知识!
前言 hello, 大家好, 我是咸鱼君, 擅长各种Java摸鱼姿势. 恰逢2020年"金九"月, 今天, 我们就来说一说面试中出现频率极高的锁知识! ps:说不定可以帮到部分有& ...
- FreeRTOS学习九(锁机制)
在执行代码时,有的代码开始执行,是不允许被打断的.这部分的代码也叫作临界段代码.为了确保这些代码不被中断而增加了临界区的概念.所谓的临界区保护重要流程在执行的时候不会被其他事情打断.等流程运行结束后, ...
- FreeRTOS 查询任务 剩余的栈空间的 方法
FreeRTOS 源码下载地址 1.官方文档提供了 函数 用来查询 任务 剩余 栈 空间,首先是看官方的文档解释(某位大神 翻译 的 官方文档.) 参数解释: xTask:被查询任 ...
- 12.2 新特性:锁信息获取之在线删除索引
黄廷忠 云和恩墨西区交付总监 简介: 超过10年专职电信行业 Oracle 数据库管理和运维经验,熟悉电信行业的业务.数据库及硬件架构.擅长数据库各种迁移方法.优化.疑难故障排除.数据库异常恢复等. ...
最新文章
- java中rs怎么用_java-如何使用JAX-RS设置字符集?
- sql删除语句_Part 3 | SQL学习:删除行
- parquet格式_6种数据格式对比,用Jupyter+pandas高效数据分析
- 将TUM数据集制作成BundleFusion数据集
- Android开发:调用camera API 创建MediaRecorder
- 系统架构----(2)大型网站架构之架构模式
- matlab repmat 函数的使用
- solr索引大小对比
- lintcode-397-最长上升连续子序列
- 选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...
- 关于没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题的解决方案
- 【数字信号处理】基本序列 ( 复指数序列 | 单位复指数序列 | 复变函数欧拉公式 )
- Task08|文本数据|joyfulpandas
- 注释一下blk_update_request函数
- 一文读懂卷积神经网络中的1x1卷积核
- 190502 Expressing Belief
- 环签名——典型的数字签名技术
- dso与Android,DSO 安装及运行 —— dso_ros + Android 手机摄像头
- perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)
- 工信部怒了,App 厂商们又作死
热门文章
- Nature | 微小的降雨变化极大地改变了植物的物种共存
- 强强联合 极智嘉助力Rhenus部署亚洲首个AMR智能仓
- node.js - Nodejs 分布式事务_个人文章 - SegmentFault 思否
- Axure元件-动态面板介绍
- win10计算机性能设置,Win10笔记本电脑拥有双显卡,一个集成的,一个独显。那么,怎么设置自动切换到高性能 - Microsoft Community...
- cas15839-78-8,UDP-L-Arabinose ,UDP-B-L-阿拉伯糖二钠盐;UDP-b-L-arabinopyranose
- office套件_OfficeSuite v4.9免费专业Office办公套件
- 【深度学习:21 天实战 Caffe】课后习题参考答案
- ABP模块系统插件机制
- Verilog例子整理(转载)