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上实现
但是我没有验证成功。