FreeRTOS嵌入式操作系统轮询

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录



提示:以下是本篇文章正文内容,下面案例可供参考

一、简单实验

代码如下(示例):

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "malloc.h"
#include "string.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		256  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

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

//任务优先级
#define DATAPROCESS_TASK_PRIO 3
//任务堆栈大小	 
#define DATAPROCESS_STK_SIZE  256 
//任务句柄
TaskHandle_t DATAprocess_Handler;
//任务函数
void Dataprocess_task(void *pvParameters);



//任务优先级
#define test_TASK_PRIO 4
//任务堆栈大小	 
#define test_STK_SIZE  256 
//任务句柄
TaskHandle_t test_Handler;
//任务函数
void test_task(void *pvParameters);




int main(void)
{
    
    
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 
	delay_init();	    				//延时函数初始化	 
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
	KEY_Init();							//初始化按键

	
	//创建开始任务
    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();           //进入临界区

	if(BinarySemaphore ==NULL)
	{
    
    
		printf("Bin Sem Creare Failed!\r\n");
		
		
	}
    //创建TASK1任务
    xTaskCreate((TaskFunction_t )task1_task,             
                (const char*    )"task1_task",           
                (uint16_t       )TASK1_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )TASK1_TASK_PRIO,        
                (TaskHandle_t*  )&Task1Task_Handler);   
    //创建TASK2任务
    xTaskCreate((TaskFunction_t )Dataprocess_task,     
                (const char*    )"Dataprocess_task",   
                (uint16_t       )DATAPROCESS_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )DATAPROCESS_TASK_PRIO,
                (TaskHandle_t*  )&DATAprocess_Handler); 
								    //创建TASK2任务
    xTaskCreate((TaskFunction_t )test_task,     
                (const char*    )"test_task",   
                (uint16_t       )test_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )test_TASK_PRIO,
                (TaskHandle_t*  )&test_Handler); 
								
								
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//task1任务函数
void task1_task(void *pvParameters)
{
    
    

	
	while(1)
	{
    
    
			printf("test1");
        vTaskDelay(100);                           //延时10ms,也就是10个时钟节拍	
	}
}


//Keyprocess_task函数
void Dataprocess_task(void *pvParameters)
{
    
    		


	while(1)
	{
    
    
				printf("test2");
		vTaskDelay(100);      //延时10ms,也就是10个时钟节拍	
	}
}


void test_task(void *pvParameters)
{
    
    		


	while(1)
	{
    
    
				printf("test3");
		vTaskDelay(100);      //延时10ms,也就是10个时钟节拍	
	}
}

输出结果如图
在这里插入图片描述

总结

RTOS中通过在任务函数中延时如: vTaskDelay(100); 就可以将任务停住,让下一个优先级的任务执行。

猜你喜欢

转载自blog.csdn.net/lianghuajunone/article/details/123927166