FreeRTOS简单任务调度实现

发布者:敬亭山人最新更新时间:2021-08-18 来源: eefocus关键字:FreeRTOS  简单任务 手机看文章 扫描二维码
随时随地手机看文章

本次FreeRTOS任务调度通过S32K144来实现,首先进行工程的创建,然后做代码分析。

选择file->new->S32DS Application Project

填写工程名称,选择S32K144,点击next

FPU Support选择Hardware:-mfloat -abi = hard(否则,添加FreeRTOS模块编译会不通过),SDKs选择了2.0.0,当然还可以选择更高版本的,选高版本会支持更多东西,然后Finish,此时工程就创建好了

双击components,弹出下图

右击FreeRTOS将其add to project

点击生成代码,此时FreeRTOS模块配置完成,接下来进行代码的编写,sources下创建rtos.h与rtos.c,main函数去调用rtos_start()即可。


#ifndef RTOS_H

#define RTOS_H


#include "FreeRTOS.h"

#include "task.h"


#define PEX_RTOS_START rtos_start


void rtos_start(void);

void freertos_task1(void *pvParameters);

void freertos_task2(void *pvParameters);


#endif


#include "rtos.h"


uint32_t freertos_task1_counter = 0U;

uint32_t freertos_task2_counter = 0U;


void rtos_start(void)

{

    /* 创建两个任务*/


    xTaskCreate(freertos_task1, "task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL );

    xTaskCreate(freertos_task2, "task2", configMINIMAL_STACK_SIZE, NULL, 1, NULL );


    /* 通过下面这句话开始进行任务调度 */

    vTaskStartScheduler();


    /*如果一切正常,函数时不会执行到这里的,但如果执行到这里,很可能是内存堆空间不足导致

     空闲任务无法创建 */

    for( ;; )

    {

        /* no code here */

    }

}


void freertos_task1(void *pvParameters)

{



    const TickType_t delay_counter_1000ms = pdMS_TO_TICKS(1000UL);



    while(1)

    {

    freertos_task1_counter++;

        vTaskDelay(delay_counter_1000ms);

    }

}


void freertos_task2(void *pvParameters)

{


    const TickType_t delay_counter_2000ms = pdMS_TO_TICKS(2000UL);



   while(1)

   {

   freertos_task2_counter++;

       vTaskDelay(delay_counter_2000ms);

   }

}


此例,给两个任务做了一个任务计数操作,任务一每隔1s执行一次,任务二每隔2s执行一次,通过vTaskDelay方法将相应任务置为阻塞状态来实现 


通过debug观察两个任务的计数状态可以看出,任务一执行8次的时候,任务二执行了4次,两个任务虽然都是while(1)死循环,可以通过任务调度在一个挂起的时候执行另一个,符合设计逻辑,xTaskCreate的第五个参数是任务优先级的定义,此处数字越大代表优先级越高,对代码稍作修改,观察一下现象


#include "rtos.h"


uint32_t freertos_task1_counter = 0U;

uint32_t freertos_task2_counter = 0U;


void rtos_start(void)

{

    /* 创建两个任务*/


    xTaskCreate(freertos_task1, "task1", configMINIMAL_STACK_SIZE, NULL, 1, NULL );

    xTaskCreate(freertos_task2, "task2", configMINIMAL_STACK_SIZE, NULL, 2, NULL );


    /* 通过下面这句话开始进行任务调度 */

    vTaskStartScheduler();


    /*如果一切正常,函数时不会执行到这里的,但如果执行到这里,很可能是内存堆空间不足导致

    空闲任务无法创建 */

    for( ;; )

    {

        /* no code here */

    }

}


void freertos_task1(void *pvParameters)

{



//    const TickType_t delay_counter_1000ms = pdMS_TO_TICKS(1000UL);



    while(1)

    {

    freertos_task1_counter++;

//        vTaskDelay(delay_counter_1000ms);

    }

}


void freertos_task2(void *pvParameters)

{


//    const TickType_t delay_counter_2000ms = pdMS_TO_TICKS(2000UL);



   while(1)

   {

   freertos_task2_counter++;

//       vTaskDelay(delay_counter_2000ms);

   }

}


这里将任务一优先级设为1,任务二优先级设为2,关闭vTaskDelay的任务阻塞操作可以看到任务一的计数变量不变,任务二的计数变量变化很快,这是因为任务二优先级高,并且没有任何空闲时间,所以任务一不会去执行

关键字:FreeRTOS  简单任务 引用地址:FreeRTOS简单任务调度实现

上一篇:通过PWM做一个简单的呼吸灯
下一篇:通过TIM输出比较做一个定时器

推荐阅读最新更新时间:2024-11-11 10:50

STM32CubeMX学习笔记——FreeRTOS_任务创建与删除
Github https://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FreeRTOS/Class01_CreateTask 简介 在STM32CubeMX上配置FreeRTOS非常的简单,几乎不需要做任何操作,只需要勾选 移植FreeRTOS就成功了,关于在非Cube上的RTOS配置文件内的相关内容,也在下方的Configuration栏中给好了 所有的配置都可以在这里完成 任务创建 有别于在没有使用Cube下的创建方式,在Cube中它专门提供了可视化的创建方式,并且增加了中间文件cmsis_os.c将freertos中
[单片机]
STM32CubeMX学习笔记——<font color='red'>FreeRTOS</font>_<font color='red'>任务</font>创建与删除
STM32CubeMX FreeRTOS软件定时器实验
系统:linux mint xfce 64bit 软件: 1、SW4STM32 2、STM32CubeMX 关于这两个软件在linux的安装教程请看我另一篇博文 Linux/Windows配置stm32免费开发环境详细流程 sw4stm32比较难下载,在此提供百度网盘链接: 链接:https://pan.baidu.com/s/1nxgh1VF 密码:rvzu 3、开发板:STM32F407VET6核心 FreeRTOS软件定时器特点: (1)是RTOS的一个组件 (2)可以用来扩展STM32的定时器 (3)不是很精确,但可以用作处理循环事件或者延时事件 (4)两种模式,periodic和one
[单片机]
STM32CubeMX <font color='red'>FreeRTOS</font>软件定时器实验
STM32F103R8t6 FreeRTOS工程adc+flash模拟EEPROM源程序
STM32单片机源程序如下: #include sys.h #include delay.h #include usart.h #include led.h #include FreeRTOS.h #include task.h #include ADC.h #include 74HC595.h #include key.h #include stmflash.h //const u8 TEXT_Buffer ={ 0123456789 }; //任务优先级 #define START_TASK_PRIO 1 //任务堆栈大小 #define START_STK_SIZ
[单片机]
stm32 Ctext-M3内核最简单的多任务RTOS
RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个, 估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。 OS我把它叫做HesOS,主要功能如下,比较简单。 1--实现多任务调度 2--实现任务调度锁 3--实现临界区保护 4--实现读取cpu使用率(这个功能比较重要的) 5--实现us延时(用于模拟如IIC总线模拟) 对于一般的嵌入式应用有这些功能,差不多够用了。 移植HesOS也非常简单,不会像其它的OS一样比较庞大,修改的地方也比较多,使用起来也复杂。 HesOS不管是移植和使用都是非常简单的,类似于PC的线程使用。 主
[单片机]
stm32 Ctext-M3内核最<font color='red'>简单</font>的多<font color='red'>任务</font>RTOS
在stm32的freeRTOS上进行微秒级延时
因为时间片的原因freeRTOS自身貌似无法进行微秒级的延时,实测通过以下函数可以进行微秒级的消息 dwt_stm32_delay.h #ifndef DWT_STM32_DELAY_H #define DWT_STM32_DELAY_H #ifdef __cplusplus extern C { #endif #include stm32f4xx_hal.h /** * @brief Initializes DWT_Cycle_Count for DWT_Delay_us function * @return Error DWT counter * 1: DWT counter Error *
[单片机]
一种μC/OS-II任务调度硬件指令的实现
μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。   1 μC/OS-II的任务调度算法分析 1.1 μC/OS-II任务就绪表的解读 μC/OS操作系统采用优先级至上的任务调度原则,让进入就绪态任务中优先级最高的那个任务,一进入就绪态就能立即运行。μC/OS操作系统实现了一种巧妙的查表算法,利用这种算法能快速实现任务调度原则。如何从任务就绪表中,查找优先级最高的那个任务?归结起来: 两个变量
[单片机]
一种μC/OS-II<font color='red'>任务</font><font color='red'>调度</font>硬件指令的<font color='red'>实现</font>
STM32与FreeRTOS学习备忘,xSemaphoreGiveFromISR
在学习FreeRTOS的时候,使用中断释放信号量时,出现了问题。 中断函数卡在xSemaphoreGiveFromISR();函数里了,具体是卡在portASSERT_IF_INTERRUPT_PRIORITY_INVALID();里。 根据注释查看http://www.freertos.org/RTOS-Cortex-M3-M4.html,里面有两点点出关键。 1. Most systems default to the wanted configuration, with the noticeable exception of the STM32 driver library. If you are using
[单片机]
STM32与<font color='red'>FreeRTOS</font>学习备忘,xSemaphoreGiveFromISR
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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