以下转载自安富莱电子: http://forum.armfly.com/forum.php

vTaskDelete() API 函数
任务可以使用 API 函数 vTaskDelete()删除自己或其它任务。
任务被删除后就不复存在,也不会再进入运行态。
空闲任务的责任是要将分配给已删除任务的内存释放掉。因此有一点很重要,那就
是使用 vTaskDelete() API 函数的任务千万不能把空闲任务的执行时间饿死。
需要说明一点,只有内核为任务分配的内存空间才会在任务被删除后自动回收。任
务自己占用的内存或资源需要由应用程序自己显式地释放。

在使用这个API函数之前,需要配置INCLUDE_vTaskDelete == 1。

刚开始,看历程有点不解,给一个任务句柄初始化为NULL,为什么删除任务(非自身任务)的时候,传入的还是句柄,句柄不是初始化为NULL了吗?思前想后觉得应该是xTaskCreate创建函数会更改任务句柄的值,果然,xTaskCreate函数接受的任务句柄是个二级指针,就算我们给任务句柄初始化为NULL,xTaskCreate函数执行之后,任务句柄会被更改为一个非NULL指针。所以就有了下面的代码:

//初始化任务句柄

static TaskHandle_t xHandleTaskLED1 = NULL;
static TaskHandle_t xHandleTaskBeep = NULL;

//创建任务

static void AppTaskCreate(void)
{
xTaskCreate(vTaskLed1, /* 任务函数名 */
"Task Led1", /* 任务名,字符串形式,方便调试 */
, /* 栈大小,单位为字,即4个字节 */
(void *)&task_led3, /* 任务形参 */
, /* 优先级,数值越大,优先级越高 */
&xHandleTaskLED1); /* 任务句柄 */ xTaskCreate(
vTaskBeep,
"Task Beep",
,
NULL,
,
&xHandleTaskBeep);
}

//在任务beep中删除led任务

void vTaskBeep(void *pvParameters)
{
/* 任务都是一个无限循环,不能返回 */
while()
{
BEEP_ON;
/* 阻塞延时,单位ms */
vTaskDelay( );
BEEP_OFF;
vTaskDelay( );
if(xHandleTaskLED1!=NULL)
vTaskDelete(xHandleTaskLED1);
}
}

led的任务句柄,虽然初始化为NULL,但是任务创建函数执行之后,任务句柄(是个一级指针)会被二级指针改变,所以当它不是NULL的时候,证明led任务被创建,就可以在beep中将其删除,如果要删除beep任务自身,vTaskDelete(NULL)即可。

改变任务优先级
vTaskPrioritySet() API 函数
API 函数 vTaskPriofitySet()可以用于在调度器启动后改变任何任务的优先级。

函数 vTaskPrioritySet 用于实现 FreeRTOS 任务优先级的修改。
 第 1 个参数是任务句柄,用于区分不同的任务。
 第 2 个参数是给任务配置的新优先级。
使用这个函数要注意以下问题:
1. 使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1
#define INCLUDE_vTaskPrioritySet 1
2. 如果第一个参数里面填的是 NULL,即数值 0 的话,那么配置的就是当前正在执行的任务。
3. 如果被修改的任务的优先级,修改后高于正在执行的任务,将执行任务切换,切换到修改好的高优先级任务。
4. 第二个参数数值不可大于等于 FreeRTOSConfig.h 文件中的宏定义:
#define configMAX_PRIORITIES 配置的数值。

使用这个函数要注意以下问题:
1. 使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1
#define INCLUDE_vTaskPriorityGet 1
2. 如果第一个参数里面填的是 NULL,即数值 0 的话,那么获取的优先级就是当前正在执行的任务。

改变任务优先级
调度器总是在所有就绪态任务中选择具有最高优先级的任务,并使其进入运行态。
本例即是通过调用 vTaskPrioritySet() API 函数来改变两个任务的相对优先级,以达到
对调度器这一行为的演示。

在不同的优先级上创建两个任务。这两个任务都没有调用任何会令其进入阻塞态的
API 函数,所以这两个任务要么处于就绪态,要么处于运行态——这种情形下,调度器
选择具有最高优先级的任务来执行。

所以,我们创建任务一LED亮,优先级1,任务二,蜂鸣器响,优先级2。这样在不阻塞的情况下,只会执行任务2,蜂鸣器响,但是,我们在任务二中,修改任务一的优先级,使它高于任务二。步骤如下:

void vTaskLed1(void *pvParameters)
{
/* 任务都是一个无限,不能返回 */
int *piParameters;
piParameters=(int *)pvParameters;
while()
{
if(*piParameters==)
{
LED1( ON );
/* 阻塞延时,单位ms */
vTaskDelay( );
LED1( OFF );
vTaskDelay( );
}
else if(*piParameters==)
{
LED2( ON );
/* 阻塞延时,单位ms */
vTaskDelay( );
LED2( OFF );
vTaskDelay( );
}
else if(*piParameters==)
{
LED3( ON ); }
}
}
/*********************************************************************************
* @ 函数名 : vTaskBeep
* @ 功能说明: Beep 任务
* @ 参数 : pvParameters,当任务创建的时候传进来,可以没有
* @ 返回值 : 无
********************************************************************************/
void vTaskBeep(void *pvParameters)
{
/* 任务都是一个无限循环,不能返回 */
while()
{
BEEP_ON; }
}

上面代码,任务2,beep优先级为2,任务1,led优先级为1,没有阻塞操作,调度器只执行优先级高的任务2,但是,我们更改任务2代码如下:

void vTaskBeep(void *pvParameters)
{
/* 任务都是一个无限循环,不能返回 */
while()
{
BEEP_ON;
vTaskPrioritySet(xHandleTaskLED1,); }
}

把任务一优先级设成3,这样任务2运行到vTaskPrioritySet ()函数后(就算vTaskPrioritySet 函数后面还有程序都不会再执行),调度器会重新选择优先级更高的执行。

再试试我们用vTaskPrioritySet 的NULL参数修改自身优先级为1,这样任务1,2优先级都是1,这样都可以运行。

void vTaskBeep(void *pvParameters)
{
/* 任务都是一个无限循环,不能返回 */
while()
{
BEEP_ON;
vTaskPrioritySet(NULL,);
}
}

FreeRtos——任务删除,改变任务优先级的更多相关文章

  1. FreeRTOS和Ucos在任务优先级的区别

    而ucos的任务优先级是任务优先级的数组越小,任务优先级越高.和STM32的中断优先级保持一样的分析,和freeRTOS相反.

  2. 026、Java中改变运算优先级

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  3. 【freertos】004-任务创建与删除及其实现细节

    前言 后面都是已动态内存任务为例来分析. 注意: 由于当前学习是在linux上跑的freertos,对于freertos底层相关接口,从demo工程来看,都是posix标准相关. 鉴于freertos ...

  4. 【freertos】011-信号量、互斥量及优先级继承机制源码分析

    目录 前言 11.1 任务同步 11.2 信号量概念 11.3 二值信号量 11.3.1 二值信号量概念 11.3.2 优先级翻转 11.3.3 二值信号量运作机制 11.4 计数信号量 11.4.1 ...

  5. FreeRTOS随记

    任务函数原型: void ATaskFunction(void * pvParameters); 任务不允许从实现函数中返回.如果一个任务不再需要,可以用vTaskDelete()删除; 一个任务函数 ...

  6. freeRTOSConfig.h文件对FreeRTOS进行系统配置

    FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制.每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核.这个配置文件是针 ...

  7. freeRTOS中文实用教程1--任务

    1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...

  8. FreeRTOS基础篇教程目录汇总

    以下教程(大部分章节)(尤其理论介绍部分)转载自安富莱电子,官网链接: http://forum.armfly.com/forum.php 然后根据安富莱的教程自己做了分析和测试,希望大家共同进步. ...

  9. FreeRTOS学习笔记1:任务

    任务特性每个任务有自己的环境,不依赖于其他任务与调度器任何时间点只有一个任务运行.由调度器决定上下文环境:(寄存器值.堆栈内容等)调度器保证的就是任务开始执行时的上下文环境与上一次退出时相同所以每个任 ...

随机推荐

  1. ZeroClipboard及其原理介绍

    系列教程地址:http://www.365mini.com/page/zeroclipboard-2_x-quick-start.htm ZeroClipboard 是国外大神开发的一个用于剪贴板复制 ...

  2. C# 将Dictionary,StringDictionary等集合数据绑定到如comboBox等控件数据源中将获取健值

    一般在使用C#提供的如combobx控件绑定数据源时都是直接绑定数据库里的数据的(DataTable,DataSet等) 最近在一个项目里需要使用combobox绑定类似“状态的”数据源,该字段里的数 ...

  3. Report Studio中目录结构报表浅析

    一:场景:在一个报表中如果存在多个页面,每个页面显示不同的数据,如何通过目录控件实现对每一个报表的友好访问呢?下面我们就来看一下下面的效果,如下图1,2 图1:-------------------- ...

  4. [Algorithm -- Dynamic Programming] Recursive Staircase Problem

    For example there is a staricase N = 3 | ---|   |---|    | |---|            | ---|                  ...

  5. BlazeMeter+Jmeter 搭建接口测试框架

    转载:http://www.sohu.com/a/133218497_575744 关于接口测试,笔者认为其难点分别在如下几方面:接口参数的获取和输入.测试数据的准备.场景的串联.测试结果的断言. 接 ...

  6. 会说话的HTML--语义化杂谭-TGideas-腾讯游戏官方设计团队

    家里有个熊孩子,经常会有一些意想不到的事情发生:回家的时候,他会笑呵呵冲过来,大声喊着“臭爸爸”:你让他把鞋穿上,他会提起鞋子往楼下扔...在小孩的世界里,他虽然会说话,但不一定明白其中的意思,不能正 ...

  7. css 小问题解决方法整理

    1,图片垂直居中: 设置包括图片的div:height=20px:line-height=20px. 设置图片vertical-align:middle 就可以. 2,行内块元素有3px bug,可通 ...

  8. swift 音乐播放器项目-《lxy的杰伦情歌》开发实战演练

    近期准备将项目转化为OC与swift混合开发.试着写一个swift音乐播放器的demo,体会到了swift相对OC的优势所在.废话不多说.先上效果图: watermark/2/text/aHR0cDo ...

  9. 算法笔记_142:无向图的欧拉回路求解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8 ...

  10. canvas的api

    Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap).使用前,首先需要新建一个canvas网页元素. 1 2 3 ...