stm32 freertos 开线程

该文介绍了如何在STM32L031单片机上使用STM32CubeMX集成FreeRTOS库,并创建两个线程task1和task2。代码示例展示了线程的创建、栈大小和优先级设置,以及使用HAL库进行GPIO操作来模拟线程间交互。同时,文章提到了Keil中配置FreeRTOS的尝试,但未验证成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32 freertos 开线程

freertos 开线程

主控芯片:stm32L031
通过stm32CubeMx加载freertos库,然后手动调用接口

#include "stm32f10x.h"

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"

// Lowest priority 0
#define TASK1_PRIORITY 1
#define TASK1_STACK_SIZE 512

#define TASK2_PRIORITY 2
#define TASK2_STACK_SIZE 512

TaskHandle_t task1_handler;
TaskHandle_t task2_handler;

static void task1(void * pvParameters)
{
    for (;;) {
        printf("%s\n", "task1");
        vTaskDelay(1000);
    }
}

static void task2(void * pvParameters)
{
    for (;;) {
        printf("%s\n", "task2");
        vTaskDelay(1000);
    }
}

static unsigned char task_init()
{
    BaseType_t status = pdPASS;

    status = xTaskCreate(task1,
            "task1",
            TASK1_STACK_SIZE,
            NULL,
            TASK1_PRIORITY,
            &task1_handler);

    status = xTaskCreate(task2,
            "task2",
            TASK2_STACK_SIZE,
            NULL,
            TASK2_PRIORITY,
            &task2_handler);

    return status;
}

int main()
{
    if (task_init() == pdPASS)
        vTaskStartScheduler();

    for (;;) {

    }
    return 0;
}

上面的程序好像有点问题,需要根据单片机型号改大小和优先级

#define TASK1_PRIORITY 2
#define TASK1_STACK_SIZE 256

#define TASK2_PRIORITY 2
#define TASK2_STACK_SIZE 256
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include <stdbool.h>
#include "main.h"
#include "cmsis_os.h"
#include "gpio.h"


#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */

// Lowest priority 0
#define TASK1_PRIORITY 2
#define TASK1_STACK_SIZE 256

#define TASK2_PRIORITY 2
#define TASK2_STACK_SIZE 256

TaskHandle_t task1_handler;
TaskHandle_t task2_handler;

bool TEST_PRIORITY = false;

static void task1(void * pvParameters)
{
    for (;;) {
        //printf("%s\n", "task1");
				if(!TEST_PRIORITY)
				{
					HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
					HAL_Delay(300);
					//vTaskDelay(10);
					HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
					//vTaskDelay(10);
					HAL_Delay(300);
					TEST_PRIORITY = true;
				}
				HAL_Delay(30);
    }
}

static void task2(void * pvParameters)
{
    for (;;) {
        //printf("%s\n", "task2");
				if(TEST_PRIORITY)
				{
					HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
					//vTaskDelay(10);
					HAL_Delay(300);
					HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
					//vTaskDelay(10);
					HAL_Delay(300);
					TEST_PRIORITY = false;
				}
				HAL_Delay(30);
    }
}

static unsigned char task_init()
{
    BaseType_t status = pdPASS;

    status = xTaskCreate(task1,
            "task1",
            TASK1_STACK_SIZE,
            NULL,
            TASK1_PRIORITY,
            &task1_handler);

    status = xTaskCreate(task2,
            "task2",
            TASK2_STACK_SIZE,
            NULL,
            TASK2_PRIORITY,
            &task2_handler);

    return status;
}
//https://blog.youkuaiyun.com/jf_52001760/article/details/121726691

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */
	
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
	HAL_Delay(50);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
	HAL_Delay(50);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
	HAL_Delay(50);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
	
  if (task_init() == pdPASS)
        vTaskStartScheduler();
	
  /* Call init function for freertos objects (in freertos.c) */
  //MX_FREERTOS_Init();
  /* Start scheduler */
  //osKernelStart();

  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
//			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
//		  HAL_Delay(5);
//			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
//			HAL_Delay(5);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

在这里插入图片描述
通过keil配置freertos有一篇文章可以看看KEIL自带操作系统验证例程在STM32上实现
但是我没有验证成功。

reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静思心远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值