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

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

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

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

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

  1. void ledFlash(void *pt){0 F' E; G! [7 m7 A9 F
  2.   LEDFLASH *ptLedFlash = (LEDFLASH *)pt;
    ! P3 A7 j  z+ }: \7 u1 Y
  3.   byte pin = ptLedFlash->pin;; y' l( p# B7 M& z6 \$ J: F* \8 t
  4.   int delayTime = ptLedFlash->delayTime;. }$ {2 r$ K9 v# a4 e

  5. : B4 w3 ?/ W: W" B: `/ m) K
  6.   pinMode(pin,OUTPUT);
    ( U$ ]* Y' U/ @3 z# a  ^1 g: h. c
  7.   while(1){% v+ N% P- w; z1 W- ^9 \# A
  8.     digitalWrite(pin,!digitalRead(pin));4 i5 H; c* Z* A( B! {
  9.     vTaskDelay(delayTime);' \8 \8 e0 f) y, L
  10.   }1 h# S7 R8 v' h( d7 G. q
  11. }
复制代码

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

  1. typedef struct {; g+ @* p( |6 R7 Z+ l
  2.   byte pin;
    + j3 T3 x0 L$ N+ c: e
  3.   int delayTime;6 z0 P1 c) e! {
  4. } LEDFLASH;
复制代码

setup函数:

  1. void setup() {
    ( h" Z; Q* u* O5 _: Q
  2.   Serial.begin(115200);, R/ o, |' w  V3 {3 w1 @
  3.   led1.pin = PB7;
    9 x( h$ L" ~( R. S& R7 `
  4.   led1.delayTime = 200;9 l' Y, c, a! ^8 A( k
  5.   led2.pin = PC7;: {7 G2 ?/ t3 ?& E( L' C; S9 l& F9 b
  6.   led2.delayTime = 500;8 c1 q+ }: f% q- s  M5 ]3 V

  7. 7 [& C/ ?/ F  @, s7 [# l8 O
  8.   if(xTaskCreate(ledFlash,
    # \: r- V& {& [, B5 L" ^7 R
  9.                   "FLASH LED",6 e' |) |' ]; D
  10.                   1024,
    ( e, I" q$ E6 A2 F! J$ S
  11.                   (void *)&led1,5 d+ I( A4 d9 y: `
  12.                   6,
    9 K" I# Y( [# `
  13.                   NULL) == pdPASS)
    2 W& |3 m9 Z/ h
  14.     Serial.println("led1,flash task Created.");$ D% {, g- V1 M$ E$ e
  15.   
    6 d2 f4 u( Z/ a0 ^4 D+ `
  16.   if (xTaskCreate(ledFlash,
    ( T5 @' e! }1 n0 W" ~" X! s/ y
  17.                   "Flash LED.",; k" b1 O! V' f5 e+ i
  18.                   1024,* b+ \* D. a6 k2 t
  19.                   (void *)&led2,
    + o4 _, R! U6 ~; P$ X+ A! m
  20.                   6,
    . Z& `7 h: Z9 l4 z( ]4 r+ Y
  21.                   NULL) == pdPASS)
    % n; i" y% K/ w: f( O
  22.     Serial.println("led2 flash task Created.");
    5 s, P$ }5 F/ Q1 J" E9 c2 }
  23.   vTaskStartScheduler();. F; Y, c6 L$ K2 j1 ~$ H6 O
  24. }
复制代码

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

  1. #include <Arduino.h>1 @; Z1 J+ _8 D9 w
  2. #include <STM32FreeRTOS.h>; B: ]) N0 S$ _; _" V' _
  3. $ C* W0 |5 w  g) L( l
  4. typedef struct {! @' E6 F$ s2 ?! Q
  5.   byte pin;+ m5 {8 B2 `+ M5 T( W+ p, G9 [
  6.   int delayTime;
    / X/ Z" @1 _9 ]5 q/ i  `0 P
  7. } LEDFLASH;1 M; ~9 p% @% [2 W
  8. : ~% g9 V: M, s0 d- G* A1 e+ D
  9. void ledFlash(void *pt){
    - h1 [7 u) H0 r5 Q7 r
  10.   LEDFLASH *ptLedFlash = (LEDFLASH *)pt;4 f6 k4 [7 z, T2 b5 [8 D& A
  11.   byte pin = ptLedFlash->pin;
    3 k8 K- z0 ?6 P% E# a8 |
  12.   int delayTime = ptLedFlash->delayTime;. {8 u6 h3 j2 i3 S
  13. $ X6 v' o9 M& [5 b; M8 h
  14.   pinMode(pin,OUTPUT);
    ; V/ ]9 X. z7 A+ @7 u+ G6 o* g
  15.   while(1){& h$ Y+ \! f2 d* C+ b* S5 w
  16.     digitalWrite(pin,!digitalRead(pin));+ X# R6 Z# a5 z0 o  _% c. C
  17.     vTaskDelay(delayTime);9 H- |- \  z7 L# k& a2 F2 p
  18.   }7 T; H1 T4 e( _; \
  19. }7 X& i9 z6 k$ W

  20. * Y* }4 c5 F- X8 A0 I/ n" j& l
  21. LEDFLASH led1,led2;* W8 O( ^2 z* ^& C6 I) c+ n

  22. 6 O. Z- e- Q4 W  a
  23. void setup() {
    0 @1 d; }8 Y% a) l  M- P! {
  24.   Serial.begin(115200);. r3 b+ a7 }2 o5 F) A  N& X# U
  25.   led1.pin = PB7;
    , l4 A# A7 {& C# P  T. z
  26.   led1.delayTime = 200;$ O& \- ^2 Y; e% z- \
  27.   led2.pin = PC7;
    : }3 w/ L5 W5 ?# M' J: a5 {" l$ `
  28.   led2.delayTime = 500;& b5 D" E) @9 B% k

  29. . c- Q2 \1 d0 F1 r9 w/ }5 {
  30.   if(xTaskCreate(ledFlash,# i) ~* ]9 w  u+ S
  31.                   "FLASH LED",5 i. g0 R" b) ?8 p  {4 o8 F
  32.                   1024,
    4 L* q7 u) [& |- ?  N
  33.                   (void *)&led1,
    % p. X# g! R( o) W( E
  34.                   6,8 t+ V  s6 d  m& a. T, ]
  35.                   NULL) == pdPASS)8 U" D/ g, `) c
  36.     Serial.println("led1,flash task Created.");
    4 m2 ~, N, Z, f
  37.   : B' Q' U5 d. t
  38.   if (xTaskCreate(ledFlash,
    / y( d( o6 L: x$ i) a6 b! j
  39.                   "Flash LED.",* B: s7 }8 f; i% t* v
  40.                   1024,( S) N6 {& |0 {3 j. U
  41.                   (void *)&led2,
    ) S, ]1 W5 T1 f3 O# K8 |
  42.                   6,
    0 e1 ^4 D1 ~, w- y# F
  43.                   NULL) == pdPASS); c* V; y; n5 V5 H
  44.     Serial.println("led2 flash task Created.");
    ) {" r+ E1 ]1 L/ X% @7 i
  45.   vTaskStartScheduler();
    8 U- {1 X" X8 }/ h7 O  j2 M. v
  46. }. I# Z# {# K' V8 y
  47. * ]" U# E# d9 K. \; @" r0 s. K# w8 i
  48. void loop() {' Q  }- ~# [  l: Y
  49.   // put your main code here, to run repeatedly:0 I7 p0 w! |1 T
  50. }
复制代码

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

161202bi66mjmzgskmmr3v.png.thumb.png


' m) X# T# z5 h

出处:社区用户:lugl发布

2 O. g. w$ r& ^
赞 收藏 评论0 发布时间:2023-1-10 17:41

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版