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 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468423.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32CubeMX 软件使用学习笔记1
1:CubeMX是ST公司开发的一款软件,旨在通过图形化的配置MCU方式,来减轻开发人员的工作量,让大家更轻松,快乐。用户使用图形化工具配置MCU后,CubeMX可以根据用户选择的IDE,来生成对应的工程文件(包含了初始化代码),下文将介绍。可以在ST的官网上查看CubeMX的功能介绍,并下载CubeMX. https://www.st.com/en/development-tools/stm32cubemx.html2:CubeMX下载完成后,在安装时,会提示安装java sdk, 按提示安装即可。3:安装完成后,打开软件,界面如下。4:手动安装MCU软件包。菜单栏“Help”->“manage embedde
发表于 2019-10-08
STM32CubeMX 软件使用学习笔记1
stm32 CubeMx falsh应用
STM32CubeMx工具没有配置Flash应用。需用户调用库函数实现FLASH的擦除、读、写操作。具体FLASH的擦除、读、写流程及具体配置详情需查看STM32 FLASH编程文档。现贴出基于STM32CubeMX工具MDK建立的工程文档,实现的FLASH操作代码。//读取指定地址的半字(16位数据)//faddr:读地址(此地址必须为2的倍数!!)//返回值:对应数据.uint16_t STMFLASH_ReadHalfWord(uint32_t faddr){return *(uint16_t*)faddr; }//从指定地址开始读出指定长度的数据//ReadAddr:起始地址//pBuffer:数据指针
发表于 2019-10-08
关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置
freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void);调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈,不过在CubeMx中的Configuration->FreeRtos->Include parameters中使能uxTaskGetStackHighWaterMark函数;2.整体设置过小,TOTAL_HEAP_SIZE
发表于 2019-09-30
STM32F4 CubeMX HAL CAN 使用步骤
(这仅仅是一个最简单的CAN示例Demo程序,仅作参考。最新的HAL库CAN的部分有所改变,不能直接使用该文方法。)STM32CubeMX版本:固件库版本:第一步分:CubeMX软件配置。0、工程配置以及芯片选择这里就不再赘述了,最好是勾选为每个外设生成独立的.c源文件。1、打开CAN外设。2、配置芯片时钟树。这里我使用了芯片内部HSI RC,主时钟配置为168MHz。3、CAN配置。3.1配置波特率为1Mb/s。计算方法:42M/2/(14+6+1)==1M3.2、使能RX0接收中断。到这里配置已经完成了,这里我们只配置了部分选项,其余大部分都是采用的默认配置。点击工具栏中齿轮图标,生成代码。第二部分:代码修改。1、打开
发表于 2019-09-30
STM32F4 CubeMX HAL CAN 使用步骤
stm32CubeMx CAN 发送数据
平台  STM32F429软件  STM32CubeMx 5.0.0固件库  STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一  简介  CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议
发表于 2019-09-30
stm32CubeMx CAN 发送数据
STM32CubeMX系列教程01_STM32Cube产品介绍
一、写在前面之前开发STM32,大家常见的就是使用寄存器、或者标准外设库进行开发。但是,从15、16年开始,ST逐渐停止了对标准外设库的更新和维护,转向了HAL和LL库。·SPL:Standard Peripheral Library标准外设库·HAL:Hardware Abstraction Layer硬件抽象层库·LL:Low-layer底层库我写STM32CubeMX系列教程有两个原因:1.停止标准库更新,使用STM32CubeMX配置HAL/LL库是主流;2.网上关于STM32CubeMX的教程相对凌乱,没有系统的进行讲解。该系列教程会从基础开始写起,以及结合实例代码详细讲述。后面实例我计划另开分支,比如针对F1系列就开一
发表于 2019-09-18
STM32CubeMX系列教程01_STM32Cube产品介绍
小广播
何立民专栏 单片机及嵌入式宝典

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

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