以下转载自安富莱电子: 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. leetcode mock Shuffle an Array

    1. shuffle算法: http://www.cnblogs.com/huaping-audio/archive/2008/09/09/1287985.html 注意:我们一般用的是第二种swap ...

  2. HDU 1232 (13.10.31)

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. JobControl 的实现原理

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-jobcontrol.html,转载请注明源地址. 引入实例:贝叶斯分类 贝叶斯分类是一种利用概率统计知 ...

  4. 浏览器自动化测试初探 - 使用phantomjs与casperjs

    收录待用,修改转载已取得腾讯云授权 作者:yangchunwen 首先要解释一下为什么叫浏览器自动化测试,因为本文只关注发布后页面功能的自动化测试,也就是UI层面的自动化. 浏览器测试有别于js代码的 ...

  5. Code a simple telnet client using sockets in python

    测试端口是否开放的python脚本 原文: https://www.binarytides.com/code-telnet-client-sockets-python/ 配置: 120.79.14.8 ...

  6. SQL语句中拆分字段

    SELECT PARSENAME(replace(MONITOR_ROOM_ID,'^' , '.'), 1) AS RoomID FROM ZY_MONITOR_ROOM 遇到以前系统高人设计的表, ...

  7. PHP与SQL数据库交互中文乱码怎么办

    1 PHP向数据库写入的时候发生乱码 如图所示,把校对放过去看看,是不是别的什么语言 点击修改把字符编码改为utf8_general_ci 2 PHP读取数据库到页面的时候发生乱码 如下图所示 即使在 ...

  8. Google POI下载工具破解之路

    我是GIS初学者,爱好二次开发,像初恋一样.最近对编译感兴趣,每当成功获取一点信息,就有一种快感,感觉马上就要成功了……其实,还早! 01.初次反编译 今天在微创业工作室找到了Google POI下载 ...

  9. Inside GDALAllRegister之三: 注册指定驱动

    现在来仔细分析如何注册一个驱动的代码,看下面代码: #ifdef FRMT_vrt GDALRegister_VRT(); #endif 编译时指定或者取消FRMT_vrt,可以控制这条语句是否编译到 ...

  10. Creating a Unity Game for Windows 8

    原地址:http://www.davebost.com/2013/08/30/creating-a-unity-game-for-windows-8 The recent release of Uni ...