stm32 freertos 开线程

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.csdn.net/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

猜你喜欢

转载自blog.csdn.net/liuqingsongmsdn2014/article/details/130118281