STM32F103ZE FreeRTOS任务创建与删除

发布者:楼高峰最新更新时间:2019-05-08 来源: eefocus关键字:STM32F103ZE  FreeRTOS  任务创建  删除 手机看文章 扫描二维码
随时随地手机看文章

一、前期准备 

单片机:STM32F103ZET6 

开发环境:MDK5.14 

库函数:标准库V3.5 

FreeRTOS:V9.0.0(网上下载,官网上目前是V10.0.1)


二、实验效果 

总共6个任务,串口1、4个RGB小灯以不同频率闪烁、一个删除任务,并通过串口2打印调试信息。删除任务每秒进行一次自加。当加到3的时候删除第一个小灯的任务,以此类推直到第四个小灯任务删除,之后再自加3次删除自身。这时候只有串口1任务在工作。 

 

这里写图片描述 
这里写图片描述

三、程序讲解 

任务创建函数:此为动态内存分配,由FreeRTOS的heap4.c分配 

BaseType_t xTaskCreate( 

TaskFunction_t pxTaskCode, /任务函数 

const char * const pcName, //任务名称 

const uint16_t usStackDepth, //任务堆栈大小 

void *const pvParameters, //传递给任务函数的参数 

UBaseType_t uxPriority, //任务优先级 

TaskHandle_t * const pxCreateTask //任务句柄,删除任务也是删除任务句柄 

);


任务删除函数: 

vTaskDelete( 

TaskHandle_t xTaskToDelete //任务句柄 

);


四、测试代码 

完整工程请加QQ:1002521871,验证:呵呵 。只附上与FreeRTOS相关的代码,其余串口,LED初始化请参考STM32F103ZE FreeRTOS移植、测试 

rtos_app.h


#ifndef __RTOS_APP_H__

#define __RTOS_APP_H__

#include "conf.h"

#include "FreeRTOS.h"

#include "task.h"


#define     START_TASK_PRIO         1

#define     START_STK_SIZE          128

extern      TaskHandle_t            STARTTask_Handler;

extern      void START_task(void *pvParameters);


#define     LED0_TASK_PRIO          3

#define     LED0_STK_SIZE           50



#define     LED1_TASK_PRIO          4

#define     LED1_STK_SIZE           50



#define     LED2_TASK_PRIO          5

#define     LED2_STK_SIZE           50



#define     LED3_TASK_PRIO          6

#define     LED3_STK_SIZE           50



#define     UART1_TASK_PRIO         7

#define     UART1_STK_SIZE          50



#define     UART2_TASK_PRIO         7

#define     UART2_STK_SIZE          50


#define     Mess_TASK_PRIO          2

#define     Mess_STK_SIZE           50


#define     TEST_TASK_RPIO          7

#define     TEST_STK_SIZE           128


#endif


rtos_app.c


#include "rtos_app.h"


TaskHandle_t    STARTTask_Handler;

TaskHandle_t    LED0Task_Handler;

TaskHandle_t    LED1Task_Handler;

TaskHandle_t    LED2Task_Handler;

TaskHandle_t    LED3Task_Handler;

TaskHandle_t    UART1Task_Handler;

TaskHandle_t    UART2Task_Handler;

TaskHandle_t    MessTask_Handler;

TaskHandle_t    TESTTask_Handler;


void LED0_task(void *pvParameters)

{

    while (1)

    {

        RGB_LED1 = ON;

        vTaskDelay(200 / portTICK_RATE_MS);

        RGB_LED1 = OFF;

        vTaskDelay(800 / portTICK_RATE_MS);

    }

}


void LED1_task(void *pvParameters)

{

    while (1)

    {

        RGB_LED2 = ON;

        vTaskDelay(300 / portTICK_RATE_MS);

        RGB_LED2 = OFF;

        vTaskDelay(700 / portTICK_RATE_MS);

    }

}


void LED2_task(void *pvParameters)

{

    while (1)

    {

        RGB_LED3 = ON;

        vTaskDelay(400 / portTICK_RATE_MS);

        RGB_LED3 = OFF;

        vTaskDelay(600 / portTICK_RATE_MS);

    }

}


void LED3_task(void *pvParameters)

{

    while (1)

    {

        RGB_LED4 = ON;

        vTaskDelay(500 / portTICK_RATE_MS);

        RGB_LED4 = OFF;

        vTaskDelay(500 / portTICK_RATE_MS);

    }

}


void UART1_task(void *pvParameters)

{

    int i = 0;

    while (1)

    {

        taskENTER_CRITICAL();

        USART_PRINTF_FLAG = 1;

        printf("UART1-%05d: FreeRTOS Test!rn", i);

        i ++;

        taskEXIT_CRITICAL();

        vTaskDelay(1000 / portTICK_RATE_MS);

    }

}


void UART2_task(void *pvParameters)

{

    int i = 0;

    while (1)

    {

        taskENTER_CRITICAL();

        USART_PRINTF_FLAG = 2;

        printf("UART2-%05d: FreeRTOS Test!rn", i);

        i ++;

        taskEXIT_CRITICAL();

        vTaskDelay(1000 / portTICK_RATE_MS);    

    }

}


void Mess_task(void *pvParameters)

{

    while (1)

    {

        //taskENTER_CRITICAL();

        if (cmdDealFlag == 1)

        {           

            DealWithUARTMess(RecData);

            cmdDealFlag = 0;

        }

        //taskEXIT_CRITICAL();

    }

}


void TEST_task(void *pvParameters)

{

    uint8_t times = 0;

    while(1)

    {


        if (times == 3)

        {

            vTaskDelete(LED0Task_Handler);

            taskENTER_CRITICAL();

            USART_PRINTF_FLAG = 2;

            printf("Task_LED0 has already deleted!rn");

            taskEXIT_CRITICAL();

        }

        else if (times == 6)

        {

            vTaskDelete(LED1Task_Handler);

            taskENTER_CRITICAL();

            USART_PRINTF_FLAG = 2;

            printf("Task_LED1 has already deleted!rn");

            taskEXIT_CRITICAL();

        }

        else if (times == 9)

        {

            vTaskDelete(LED2Task_Handler);

            taskENTER_CRITICAL();

            USART_PRINTF_FLAG = 2;

            printf("Task_LED2 has already deleted!rn");

            taskEXIT_CRITICAL();

        }

        else if (times ==  12)

        {

            vTaskDelete(LED3Task_Handler);

            taskENTER_CRITICAL();

            USART_PRINTF_FLAG = 2;

            printf("Task_LED3 has already deleted!rn");

            taskEXIT_CRITICAL();

        }

        else if (times == 15)

        {

            taskENTER_CRITICAL();

            USART_PRINTF_FLAG = 2;

            printf("Test task has already deleted!rn");

            taskEXIT_CRITICAL();

            vTaskDelete(TESTTask_Handler);

            taskEXIT_CRITICAL();

        }

        taskENTER_CRITICAL();

        USART_PRINTF_FLAG = 2;

        printf("Times = %drn", times);

        taskEXIT_CRITICAL();

        times ++;

        vTaskDelay(1000 / portTICK_RATE_MS);    

    }

    //vTaskDelete(NULL);

}


void START_task(void *pvParameters)

{

    taskENTER_CRITICAL();

    xTaskCreate(

        (TaskFunction_t) TEST_task,

        (const char *) "TEST_task",

        (uint16_t) TEST_STK_SIZE,

        (void *) NULL,

        (UBaseType_t) TEST_TASK_RPIO,

        (TaskHandle_t *) &TESTTask_Handler

    );


    xTaskCreate(

        (TaskFunction_t) LED0_task,

        (const char *) "LED0_task",

        (uint16_t) LED0_STK_SIZE,

        (void *) NULL,

        (UBaseType_t) LED0_TASK_PRIO,

        (TaskHandle_t *) &LED0Task_Handler

    );


    xTaskCreate(

        (TaskFunction_t) LED1_task,

        (const char *) "LED1_task",

        (uint16_t) LED1_STK_SIZE,

        (void *) NULL,

        (UBaseType_t) LED1_TASK_PRIO,

        (TaskHandle_t *) &LED1Task_Handler

    );


    xTaskCreate(

        (TaskFunction_t) LED2_task,

        (const char *) "LED2_task",

        (uint16_t) LED2_STK_SIZE,

        (void *) NULL,

        (UBaseType_t) LED2_TASK_PRIO,

        (TaskHandle_t *) &LED2Task_Handler

    );


    xTaskCreate(

        (TaskFunction_t) LED3_task,

[1] [2]
关键字:STM32F103ZE  FreeRTOS  任务创建  删除 引用地址:STM32F103ZE FreeRTOS任务创建与删除

上一篇:PT2272-M4--4键无线遥控器(STM32)
下一篇:STM32F103ZE FreeRTOS移植、测试

推荐阅读最新更新时间:2024-11-13 05:36

UCOSIII任务创建删除、挂起和恢复
一、任务的创建 任务创建函数:OSTaskCreate() void OSTaskCreate ( OS_TCB *p_tcb,//指向任务的任务控制块 CPU_CHAR *p_name,//任务名字 OS_TASK_PTR p_task,//任务函数名字 void *p_arg,//传递给任务的参数 OS_PRIO prio,//任务优先级 CPU_STK *p_stk_base,//任务堆栈基地址
[单片机]
三星删除嘲笑苹果取消耳机孔的视频,怕自己打自己脸?
三星悄然删除了其发布在YouTube官方频道上的嘲笑苹果取消iPhone耳机孔的宣传广告片,这可能跟三星Note 10取消耳机孔有关。 报道中称,三星在2017年11月发布了一则名为“Growing Up”的宣传广告。这则宣传片的大致内容为:用户对iPhone的局限性感到沮丧,在需要听歌的时候还需要转换器令用户感到不便,最后转投了三星。但是现在,Business Insider发现这则广告已从Samsung Mobile USA页面中删除。此外,三星2018年5月发布的“Growing Up”的后续宣传片也已被删除。
[嵌入式]
三星<font color='red'>删除</font>嘲笑苹果取消耳机孔的视频,怕自己打自己脸?
STM32中断及FreeRTOS中断优先级配置知识
很多朋友对中断的一些知识还是不了解,今天就写点关于Cortex-M3处理器中断相关,以及FreeRTOS中断优先级配置的内容。 1写在前面 写本文之前,先写点相关的扩展内容。 STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。 可以参看我之前分享文章: 从Cortex-M到Cortex-A认识ARM处理器 ,了解一下关于ARM处理器的种类。 本文主要结合Cortex-M3下面STM32F1系列处理器为例来讲述中断控制相关内容。而Cortex-M其它系列,或者说STM32其它系列关于中断的内容类似。 Cortex-M3只是STM3
[单片机]
ucos-ii学习笔记——首个多任务程序的创建
#include INCLUDES.h #define TASK_STK_SIZE 512 //定义两个任务的任务堆栈,每一个任务有一个任务堆栈 OS_STK MyTaskStk ; OS_STK YouTaskStk ; INT8U x=0,y=0; //字符显示位置 //声明两个任务函数 void MyTask(void *data); void YouTask(void *data); void main (void) { char *s_
[单片机]
自己写单片机操做系统3-任务创建和调度
如果存在两个或以上的任务调度就需要将栈保CPU的寄存器了。这个地方就是各个MCU不同的地方了。 这个要看MCU进入中断的流程才能知道栈需要怎么保护。 OS_STK* InitStkBuff(VOID_FUN_PTR task,OS_STK* pstk) { pstk--; *pstk = (U16)(((U32)task) 8); 存要执行的函数 pstk--; *pstk = 0xFFFF; //IY 存y寄存器 (pstk)--; *pstk = 0x1111; //IX 存x寄存器 pstk--; *pstk = 0xAA;//A;
[单片机]
STM32使用FreeRTOS中的链表创建节点与列表项
使用了STM32F103的FreeRTOS库来创建一个列表,其实FreeRTOS的list中链表是双向的循环链表,为了简单介绍,我直接说是列表了。 芯片使用的是GD32F103CBT6,该芯片兼容ST的库,不影响使用效果。 以下代码不全,仅提供思路,如有不足,请给我留言。 第一步 先定义变量,初始化列表及列表项 nodeDevice node_t; //节点数据 nodeDevice * pNode; //节点指针 xList list_t; //列表 #define pList ((xList *) &list_t) //列表指针 xListItem item_t; //列表项 xListItem * p
[单片机]
基于STM32F407的FreeRTOS学习笔记(3)
上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。 所谓的挂起,也可以认为是 暂停 ,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。 在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。 同样的,在文档中也可以找到恢复任务函数介绍。 接下来我们实现一个任务,目标是当 LED 1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。 我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。 LED0在进行vTaskDelay时是处于阻塞态
[单片机]
基于STM32F407的<font color='red'>FreeRTOS</font>学习笔记(3)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved