使用FreeRTOS在Arduino上开发STM32

0.开发环境(工具)

Vscode 、platformio、arduino、STM32F103C8T6、USB-TTL

引脚连接:STM32直接设置为烧录模式即可,烧录完成后会自动运行程序。

   

1.点灯加串口输出调试

注意事项:每次上传程序前,需要按一下复位键。

#include <Arduino.h>
#define ledPin PC13

HardwareSerial Serial1(PA10, PA9); // 将串口1的管脚指定到PA10(RX),PA9(TX)引脚上
int i = 0;
void setup()
{
  Serial1.begin(115200);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(ledPin, LOW);
  delay(500);
  Serial1.println(i++);
}

platformio.ini文件配置

[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = arduino
upload_port = COM17
monitor_port = COM17
monitor_speed = 115200
upload_protocol = serial

2.FreeRTOS开发STM32

添加相关库函数

测试程序:板载LED闪烁,同时进行串口输出

#include <Arduino.h>
#include <STM32FreeRTOS.h>
#define ledPin PC13

HardwareSerial Serial1(PA10, PA9); // 将串口1的管脚指定到PA10(RX),PA9(TX)引脚上
int i = 0;

void test1(void *pt)
{
  pinMode(ledPin, OUTPUT);
  while (1)
  {
    digitalWrite(ledPin, HIGH);
    vTaskDelay(100);
    digitalWrite(ledPin, LOW);
    vTaskDelay(100);
    Serial1.println(i++);
  }
}

void setup()
{
  Serial1.begin(115200);

  xTaskCreate(test1, "", 1024, NULL, 1, NULL);
  vTaskStartScheduler(); // 开启任务调度,这条语句必须加,否则程序无法正常执行
  vTaskDelete(NULL);
}

void loop()
{
}

 vTaskStartScheduler()的作用

vTaskStartScheduler()是FreeRTOS实时操作系统中的一个函数,它的作用是启动任务调度器。在FreeRTOS中,任务调度器负责按照任务的优先级和调度策略来调度任务的执行。

具体而言,vTaskStartScheduler()函数会初始化FreeRTOS的内部数据结构,并开始任务调度器的运行。一旦调用了该函数,任务调度器会按照任务的优先级和调度策略开始调度任务的执行。它会根据每个任务的优先级,以抢占或协作的方式分配处理器时间片给不同的任务,从而实现任务的并发执行。

vTaskStartScheduler()函数通常是在系统初始化过程的最后被调用,它标志着系统进入多任务运行状态。在调用该函数之前,需要先创建并初始化好各个任务,并设置好任务的优先级。

需要注意的是,vTaskStartScheduler()函数是一个永不返回的函数,一旦任务调度器开始运行,它将控制整个系统的执行,直到发生严重错误或调用了特殊的函数来停止任务调度器的运行。

总结起来,vTaskStartScheduler()函数的作用是启动FreeRTOS任务调度器,让各个任务按照优先级和调度策略并发执行。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用FreeRTOS在Arduino上开发STM32

发表评论