以下转载自安富莱电子: 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. Tensorflow 之 name/variable_scope 变量管理

    name/variable_scope 的作用 充分理解 name / variable_scope TensorFlow 入门笔记 当一个神经网络比较复杂.参数比较多时,就比较需要一个比较好的方式来 ...

  2. 解决eclipse中运行web项目时弹出的"Port 8080 required by Tomcat 9.0 Server at localhost is already in use...

    1.tomcat默认端口是8080,可以修改通过tomcat的端口 修改tomcat\conf\server.xml     结果运行程序,还是报"Port 8080 required by ...

  3. Ubuntu简单搭建git私有服务

    gitserver搭建过程 搭建gitserver过程记录 例如以下: 环境: serverUbuntu虚拟机(Boss),能通过网络訪问到(server地址:192.168.9.103). clie ...

  4. 为大家推荐一款很不错的MarkDown编辑器——stackEdit

    自己细致体验了一下下:认为它还是很不错的! !! https://stackedit.io 这是它的官网,我们能够在chrome浏览器的"应用"里找到相应的插件. ps:它但是一款 ...

  5. Download Visual Studio

    Welcome to a new way to install Visual Studio! In our newest version, we've made it easier for you t ...

  6. 从HttpServletRequest获取完整的请求路径

    String url = request.getRequestURI(); // 这个方法只能获得不包含参数的请求url,且只包含相对路径 StringBuffer url_buffer = requ ...

  7. (C++)已知String类的定义,实现其函数体

    CString类的定义如下: class CMyString{ public: CMyString(const char* pData=NULL); CMyString(const CMyString ...

  8. windows下安装msysgit 及ruby

    一:安装msysgit git是目前最流行的软件版本控制软件,在window下通常使用msysgit 下载:http://msysgit.github.io/ 安装:基本上一路默认下一步就行 安装之后 ...

  9. Nginx搭建flv mp4流媒体服务器[转]

    Nginx搭建flv mp4流媒体服务器 作者:二蛋 时间:December 1, 2014 分类:Note 环境:Centos 6.4 32bit 一.安装依赖包 1.安装zlib wget htt ...

  10. vlc模块间共享变量

    在模块中创建变量: vlc_value_t  valTemp; var_Create( p_intf, "vlc_test", VLC_VAR_STRING  ); valTemp ...