学习freertos之点亮led入门(stm32c8t6)

文章介绍了如何使用FreeRTOS在微控制器上移植并管理多任务,以实现同时控制两个LED独立闪烁。通过任务创建、调度和优先级设置,使得CPU能高效利用,实现实时性。任务1和任务2分别控制LED0和LED1,通过vTaskDelay实现不同延时时间的闪烁效果。
摘要由CSDN通过智能技术生成

首先,freertos移植是第一步,野火、原子、普中都有介绍。

这里记录一下,使用freertos点亮两个led,两个led之间的运行不受影响,不必等待点亮第一个led后,再点亮第二个led,这样cpu的利用率更高,实时性强

其步骤包括:

1.优先级、堆栈大小、任务函数、任务句柄的声明与定义。

//优先级
#define START_TASK_PRIO       1
//堆栈大小
#define START_STK_SIZE        120
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;


//task1优先级
#define TASK1_TASK_PRIO      	2
//task1堆栈大小
#define TASK1_STK_SIZE        120
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t  Task1Task_Handler;


//task2优先级
#define TASK2_TASK_PRIO      	3
//task2堆栈大小
#define TASK2_STK_SIZE        120
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t  Task2Task_Handler;

与裸机的优先级不同,freertos下的优先级的数字越大,优先级越高

2、任务创建与调度

xTaskCreate((TaskFunction_t ) start_task,
				            (char *   	    ) "start_task",
							(uint16_t 		) START_STK_SIZE,
							(void *         ) NULL,
							(UBaseType_t    ) START_TASK_PRIO,
							(TaskHandle_t * ) &StartTask_Handler);									 

vTaskStartScheduler();//开启任务调度	


		

 3、创建子任务(task1 、task2)

 void start_task(void * pvParameters)
{
        //创建Task1
		xTaskCreate((TaskFunction_t ) task1_task,
								(char *   			) "task1_task",
								(uint16_t 			) TASK1_STK_SIZE,
								(void *         ) NULL,
								(UBaseType_t    ) TASK1_TASK_PRIO,
								(TaskHandle_t * ) &Task1Task_Handler);
        //创建Task2
		xTaskCreate((TaskFunction_t ) task2_task,
								(char *   			) "task2_task",
								(uint16_t 			) TASK2_STK_SIZE,
								(void *         ) NULL,
								(UBaseType_t    ) TASK2_TASK_PRIO,
								(TaskHandle_t * ) &Task2Task_Handler);
		
		vTaskDelete(StartTask_Handler);//删除任务,删除自身用NULL						
}

3、子任务详细内容(由于上一步创建了任务,但任务执行需要具体化,这里对两个led亮灭的时间进行设置,延时需要freertos提供的vTaskDelay函数,否则无法进入任务的执行

//任务1
void task1_task(void * pvParameters)
{
	 while(1)
	 {		  
			//vTaskDelete(StartTask_Handler); 
		  LED0=~LED0;
		  vTaskDelay(500);
	 }
 
}

// 任务2
void task2_task(void * pvParameters)
{ 
	 while(1)
	{
		 LED1=0;
		 vTaskDelay(1000);
		 LED1=1;
		 vTaskDelay(1000);
	 }
 
}

学习小结:freertos执行多个任务的原理是:cpu同一时刻只能一个任务,但很短的一个时间内来回切换任务,造成可以在同一时刻执行多个任务的错觉。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值