STM32F103FreeRTOS任务创建(动态方法)

        RTOS系统的核心就是任务管理,FreeRTOS也不例外。在初步学习的时候首先要掌握的就是任务的创建、删除、挂起和恢复等操作。

        我们在学习STM32、和51单片机的时候看到的是一个while函数一直在死循环执行着我们的函数,不可以两个while或者多个while同时跑,如果定义两个while的话会发现只有一个while函数在跑另一个不会执行,FreeRTOS的多任务创建就可以几个while同时跑。

        下面将会对其进行讲解:

        首先是任务的状态:状态分为四个状态,运行态、就绪态、阻塞态、挂起态,运行态就是任务处于运行的状态,就绪态是处于就绪的状态就是在等待运行的状态,阻塞态就是当前任务正在等待某个外部时间的完成,比如延时函数的使用就是使任务进入了阻塞态。

         任务的优先级,每个任务都可以分配一个从0~(configMAX_PRIORITIES-1)的优先级,优先级的数字越小表示优先级越低。

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

        这是开启任务的一些宏定义

#define LED0_TASK_PRIO 2 
#define LED0_STK_SIZE 50 
TaskHandle_t LED0Task_Handler; 
void led0_task(void *p_arg); 

#define LED1_TASK_PRIO 3 
#define LED1_STK_SIZE 50 
TaskHandle_t LED1Task_Handler; 
void led1_task(void *p_arg); 

//这是具体的任务,LED0和LED1的操作任务
	BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode, //任务函数
							const char * const pcName, //任务名称
							const uint16_t usStackDepth,//任务堆栈大小
							void * const pvParameters,//传递给任务函数的参数
							UBaseType_t uxPriority,//任务优先级
							TaskHandle_t * const pxCreatedTask //任务句柄 
                            )
//这是任务创建函数的原型
	 xTaskCreate((TaskFunction_t )start_task, 
 (const char* )"start_task", 
 (uint16_t )START_STK_SIZE, 
 (void* )NULL, 
 (UBaseType_t )START_TASK_PRIO, 
 (TaskHandle_t* )&StartTask_Handler); 
 vTaskStartScheduler(); //开启任务调度	

运用上面的宏定义对任务创建函数的进行配置。下面是具体的任务函数的定义

void start_task(void *pvParameters) //开启任务函数
{
        taskENTER_CRITICAL();//进入临界值
    	xTaskCreate((TaskFunction_t )led0_task,
							(const char* )"led0_task",
							(uint16_t )LED0_STK_SIZE,
							(void* )NULL,
							(UBaseType_t )LED0_TASK_PRIO,
							(TaskHandle_t* )&LED0Task_Handler);
	    xTaskCreate((TaskFunction_t )led1_task,
							(const char* )"led1_task",
							(uint16_t )LED1_STK_SIZE,
							(void* )NULL,
							(UBaseType_t )LED1_TASK_PRIO,
							(TaskHandle_t* )&LED1Task_Handler);
    	vTaskDelete(StartTask_Handler); //删除开始任务
	    taskEXIT_CRITICAL(); //退出临界区
    
}
void led0_task(void *pvParameters)
{
		 while(1)
		 {
				 LED0=~LED0;
				 vTaskDelay(500);
		 }
}
void led1_task(void *pvParameters)
{
	 while(1)
	 {
			 LED1=0;
			 vTaskDelay(100);
			 LED1=1;
			 vTaskDelay(100);
	 } 

}

vTaskDelay函数就一个FreeRTOS的延时函数。这里面还有很多的其他的函数,请看后面的更新......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值