STM32CubeMX+FreeRTOS实验---使用两个实例,共用一个task

发布者:灵感火花最新更新时间:2019-07-18 来源: eefocus关键字:STM32CubeMX  FreeRTOS实验  task 手机看文章 扫描二维码
随时随地手机看文章

    假如有两个Task,行为类型,只是个别参数不一样。那么可以使用同一个task,来实现两个实例。这两个实例是相互独立的:Each created instance will execute independently

under the control of the FreeRTOS scheduler.


   以两个LED的task任务为例子,假设LED1和LED2都是每1s变换一次。那么,建立2个task:分别是LED1Flash和LED2Flash,使用同样的task入口:StartLEDFlashTask



生成iar工程后,在main.c中有 以下代码:


/* Create the thread(s) */

  /* definition and creation of LED1Flash */

  osThreadDef(LED1Flash, StartLEDFlashTask, osPriorityNormal, 0, 128);

  LED1FlashHandle = osThreadCreate(osThread(LED1Flash), NULL);

 

  /* definition and creation of LED2Flash */

  osThreadDef(LED2Flash, StartLEDFlashTask, osPriorityLow, 0, 128);

  LED2FlashHandle = osThreadCreate(osThread(LED2Flash), NULL);

只是一个定义


osThreadDef只是一个定义,把相关的内容绑在一起,不是函数。

osThreadCreate才是一个函数。第二个参数就是*argument,对应StartLEDFlashTask函数的输入参数。


因此在osThreadDef之前加入code。


/*import user code,may be changed by stm32cubeMX*/

/*take attention */

    uint16_t led1pin,led2pin = 0 ; 

    led1pin = GPIO_PIN_4 ;

    led2pin = GPIO_PIN_5 ;

另外,osThreadCreate需要改成


 LED1FlashHandle = osThreadCreate(osThread(LED1Flash), (void *)(&led1pin));

 

LED2FlashHandle = osThreadCreate(osThread(LED2Flash), (void *)(&led2pin));

在StartLEDFlashTask函数改成

/* USER CODE BEGIN 5 */

    uint16_t * pxledpin ;

    pxledpin = (uint16_t *)argument ;

  /* Infinite loop */

  for(;;)

  {

    osDelay(1000);

    HAL_GPIO_TogglePin(GPIOA, (*pxledpin));

    

  }

  /* USER CODE END 5 */ 

 

两个灯就能同时点亮和熄灭了 。


查看IAR内嵌的FreeRTOS插件,可以看到,这两个task只是共用代码,但是stack和任务的优先级是独立的。



也就是说,在上面的代码里面,pxledpin是task里定义的局部变量,是保存在任务的stack里面。因此两个任务有两个独立的pxledpin变量。




假如需要两个led分别闪烁,可以在main.c加入以下代码


全局部分


typedef struct

{

uint16_t ledpin ;

uint32_t timer ;

}LEDFlashPara_TypeDef ;

 main主函数部分修改为


  LEDFlashPara_TypeDef led1para,led2para ;

  led1para.ledpin = GPIO_PIN_4 ;

  led1para.timer = 1000 ;

  

  led2para.ledpin = GPIO_PIN_5 ;

  led2para.timer = 500 ;

  

  /* Create the thread(s) */

  /* definition and creation of LED1Flash */

  osThreadDef(LED1Flash, StartLEDFlashTask, osPriorityNormal, 0, 128);

  LED1FlashHandle = osThreadCreate(osThread(LED1Flash), (void *)(&led1para));

 

  /* definition and creation of LED2Flash */

  osThreadDef(LED2Flash, StartLEDFlashTask, osPriorityLow, 0, 128);

  LED2FlashHandle = osThreadCreate(osThread(LED2Flash), (void *)(&led2para));


Task部分修改为

LEDFlashPara_TypeDef ledpara ;

ledpara = *( (LEDFlashPara_TypeDef *)argument) ;

   

  /* Infinite loop */

  for(;;)

  {

    osDelay(ledpara.timer);

HAL_GPIO_TogglePin(GPIOA, ledpara.ledpin);

  }

这样两个任务就能按照不同的频率同时正常工作了

如果把task部分修改为以下代码:


LEDFlashPara_TypeDef *pledpara ;

pledpara = (LEDFlashPara_TypeDef *)argument ;

   

  /* Infinite loop */

  for(;;)

  {

    osDelay(pledpara->timer);

HAL_GPIO_TogglePin(GPIOA, pledpara->ledpin);

  }

就会发现LED1的task正常翻转几次以后就无法正常翻转了。




未完 待续



关键字:STM32CubeMX  FreeRTOS实验  task 引用地址:STM32CubeMX+FreeRTOS实验---使用两个实例,共用一个task

上一篇:stm32 FreeRTOS中如何创建任务
下一篇:FreeRTOS学习笔记——基础知识与移植(STM32F103)

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

stm32时钟配置 STM32CubeMX配置时钟
软件: (1)STM32CubeMX (2)KEIL5 一、在时钟配置过程中需结合实际情况配置外部晶振,教程配置外部晶振。如果没有外部晶振则不用选择,导出时会自动生成内部时钟程序。所对应的IO口也可以设置为普通IO口使用。 1.在硬件上加入晶振,选择相对应的晶振引脚(不选择则默认采用内部晶振时钟系统)。 2.配置RCC(复位和时钟控制),选择外部高速始终,如下图 3.配置晶振频率 4.工程设置,并为输出做整备。 5.输出程序:
[单片机]
stm32时钟配置 <font color='red'>STM32CubeMX</font>配置时钟
STM32CubeMX之串口接收不定长数据
基本串口通信通常只能接收到定长数据,无法稳定接收不定长数据,本章介绍利用STM32单片机的IDLE空闲中断,接收不定长数据。 使能串口1的异步串行通信模式,开启Usart1的全局中断。添加DMA通道。 使用Stm32Cubemx生成源码, 打开生成的源码,删除whiel循环中的语句。 打开usart.h文件,在文件开头的USER CODE BEGIN Includes下方引入stdio.h头文件 打开usart.c文件,在USER CODE BEGIN 0与 USER CODE END 0之间添加下列代码。 #if 1 struct __FILE { int handle; }; FILE __stdout; //定义
[单片机]
<font color='red'>STM32CubeMX</font>之串口接收不定长数据
STM32CubeMX串口接收中断
才接触到cube,目前只实现了固定长度的接收。配置好后,在while(1)前加入配置接收中断。我也是跟踪代码慢慢找到这句的,目前对于cube的库函数一点都不了解。 if(HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5)!=HAL_OK)Error_Handler(); 打开it.c。找到 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEG
[单片机]
STM32CubeMX:UART(DMA空闲方式)
UART传输有三种方式,而DMA的应用采用阻塞式接收指定的数据长度,效率较低,而应用DMA空闲方式可提高其效率。 参考帖子:http://blog.csdn.net/youmeichifan/article/details/51750435 帖子中应用参考,其中修改了几个内容: 1.空闲中断为连续接收; 2.去除发送完成回调函数HAL_UART_TxCpltCallback,而在发送函数中,等待huart的发送状态位。 DMA方式在连续发送数据应用当中,会产生丢失,所以在发送前需检查发送状态。
[单片机]
STM32cubeMX学习记录1-点亮LED
一、准备工作: 1、安装STM32cubeMX软件,注意我使用的是5.0版之前的 2、安装keil-ARM软件,注意版本最好是5.2.6以后的 3、准备一个开发板 二、点灯实验(PB5接一个LED灯,低电平灯亮,高电平灯灭) (后续涉及到多种方式操作的,只讲解一种,追求能实现目的即可) 1、打开STM32cubuMX软件 2、选择左边居中位置的“New Project”进行新建一个工程; 3、先输入开发板上芯片的型号,然后再双击选择实际的芯片封装; 4、晶振RCC设置,根据自己开发板上的情况选择。如图是开发板上的外部HSE和LSE都选择上了。 5、仿真器设置:使用ST
[单片机]
<font color='red'>STM32cubeMX</font>学习记录1-点亮LED
STM32CubeMX开发环境的搭建
1、安装包下载 由于STM32CubeMX软件是基于JAVA环境运行的,所以需要安装JRE才能使用,JRE、STM32CubeMX工具和库可以到官网下载。TM32CubeMX要求JRE最低版本是1.7.0_45,如果你电脑已安装JRE版本大于1.7.0_45,则可以不用再下载安装。 1.1 Oracle官方下载JRE http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html 接受许可,根据自己电脑系统选择下载,如下图: 1.2 ST官方下载STM32CubeMX工具、库 官网可以下载最新版本的软件,STM32C
[单片机]
<font color='red'>STM32CubeMX</font>开发环境的搭建
STM32CubeMX学习教程之三:GPIO输入之利用SysTick中断给按键去抖
本文主要讨论软件去抖。实现方法是通过SysTick中断每1ms对按键进行扫描,当检测到连续的稳定无抖动电平信号(长度可设置)之后,才进行相应的逻辑操作。 软件版本: STM32CubeMX V4.25.0 System Workbench V2.4 硬件:OneNet 麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 然后设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M) 然后设置GPIO_Output (连接到LED) 和GPIO_Input(连接到按键)。注意上一篇文章里面按键连接的引脚设置为外部中断模式,这里只需
[单片机]
<font color='red'>STM32CubeMX</font>学习教程之三:GPIO输入之利用SysTick中断给按键去抖
stm32cubemx 多路adc采集
采用的软件是STM32CUBEMX+KEIL5 硬件为stm32F103C8T6 我与原文作者做的区别在于 External Trigger Conversion Edge,我在进行配置的时间没有None选项,我选择的是默认的Regular Conversion launched by software 原文地址: http://www.eemaker.com/stm32cubemxadc.html 实现功能:stm32cubeMX配置ADC多通道采集(非dma和中断方式) Stm32ADC的转换模式还是很灵活,很强大,模式种类很多,那么这也导致很多人使用的时候没细心研究参考手册的情况下容易混淆。不知道该用哪种方
[单片机]
<font color='red'>stm32cubemx</font> 多路adc采集
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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