你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ST NUCLEO FREERTOS - 结构体多参数传递

[复制链接]
STMCU小助手 发布时间:2023-1-10 17:41

这次的例程是创建两个LED闪烁的程序,闪烁时间各不相同,如何做到同一程序,传入不同参数来实现功能呢?

先写一个任务创建函数,用指针来接收结构体数据。

  1. void ledFlash(void *pt){
  2.   LEDFLASH *ptLedFlash = (LEDFLASH *)pt;
  3.   byte pin = ptLedFlash->pin;
  4.   int delayTime = ptLedFlash->delayTime;

  5.   pinMode(pin,OUTPUT);
  6.   while(1){
  7.     digitalWrite(pin,!digitalRead(pin));
  8.     vTaskDelay(delayTime);
  9.   }
  10. }
复制代码

为了给任务创建时传递多个参数,这里用结构体来传递多个参数。

  1. typedef struct {
  2.   byte pin;
  3.   int delayTime;
  4. } LEDFLASH;
复制代码

setup函数:

  1. void setup() {
  2.   Serial.begin(115200);
  3.   led1.pin = PB7;
  4.   led1.delayTime = 200;
  5.   led2.pin = PC7;
  6.   led2.delayTime = 500;

  7.   if(xTaskCreate(ledFlash,
  8.                   "FLASH LED",
  9.                   1024,
  10.                   (void *)&led1,
  11.                   6,
  12.                   NULL) == pdPASS)
  13.     Serial.println("led1,flash task Created.");
  14.   
  15.   if (xTaskCreate(ledFlash,
  16.                   "Flash LED.",
  17.                   1024,
  18.                   (void *)&led2,
  19.                   6,
  20.                   NULL) == pdPASS)
  21.     Serial.println("led2 flash task Created.");
  22.   vTaskStartScheduler();
  23. }
复制代码

这样就实现了同一个任务接收不一样的参数,实现不同的功能,整体程序如下:

  1. #include <Arduino.h>
  2. #include <STM32FreeRTOS.h>

  3. typedef struct {
  4.   byte pin;
  5.   int delayTime;
  6. } LEDFLASH;

  7. void ledFlash(void *pt){
  8.   LEDFLASH *ptLedFlash = (LEDFLASH *)pt;
  9.   byte pin = ptLedFlash->pin;
  10.   int delayTime = ptLedFlash->delayTime;

  11.   pinMode(pin,OUTPUT);
  12.   while(1){
  13.     digitalWrite(pin,!digitalRead(pin));
  14.     vTaskDelay(delayTime);
  15.   }
  16. }

  17. LEDFLASH led1,led2;

  18. void setup() {
  19.   Serial.begin(115200);
  20.   led1.pin = PB7;
  21.   led1.delayTime = 200;
  22.   led2.pin = PC7;
  23.   led2.delayTime = 500;

  24.   if(xTaskCreate(ledFlash,
  25.                   "FLASH LED",
  26.                   1024,
  27.                   (void *)&led1,
  28.                   6,
  29.                   NULL) == pdPASS)
  30.     Serial.println("led1,flash task Created.");
  31.   
  32.   if (xTaskCreate(ledFlash,
  33.                   "Flash LED.",
  34.                   1024,
  35.                   (void *)&led2,
  36.                   6,
  37.                   NULL) == pdPASS)
  38.     Serial.println("led2 flash task Created.");
  39.   vTaskStartScheduler();
  40. }

  41. void loop() {
  42.   // put your main code here, to run repeatedly:
  43. }
复制代码

上传给开发板后实现两个LED按不同的频率闪烁。

161202bi66mjmzgskmmr3v.png.thumb.png


出处:社区用户:lugl发布


收藏 评论0 发布时间:2023-1-10 17:41

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版