FreeRTOS使用汇总



/**********创建任务**************/
TaskHandle_t Hardware_TaskHandle;	//任务句柄,如果不用到消息,可不用句柄
void main (void)
{
  MY_NVIC_PriorityGroupConfig(4);
  delay_init(168);
  xTaskCreate(startTask, "START_TASK", 300, NULL, 7, &startTaskHandle);
  vTaskStartScheduler();        //开启调度
  while(1)
  {
	  vTaskDelay(100);
  }
}

static void startTask(void *arg)
{
  taskENTER_CRITICAL();	//进入临界区  
  xTaskCreate(Hardware_Task, "Hardware_init", 300, NULL, 6, &Hardware_TaskHandle);//硬件初始化    
 
 //xTaskCreate(Hardware_Task, "Hardware_init", 300, NULL, 6, NULL);	//不用句柄
 
  vTaskDelete(startTaskHandle); //删除开始任务
  taskEXIT_CRITICAL();  //退出临界区
}


/**********队列**************/
#include "queue.h"
QueueHandle_t test_Queue;   		//定义
u8 test_send   //需要发送的数据
BaseType_t xHigherPriorityTaskWoken;	//中断需要
					//队列项  每个队列项的字节数
test_Queue=xQueueCreate(2,1);        //创建队列  2个项目,每个项目1个字节	
//每次发送和接收一个项目
//任务级发送函数
xQueueSend(test_Queue,&test_send,portMAX_DELAY);        //任务发送队列函数,发送消息到队尾
xQueueSendToFront(test_Queue,&test_send,portMAX_DELAY);        //任务发送队列函数,发送消息到队头
xQueueOverwrite(test_Queue,&test_send);	//任务发送队列函数,带覆写功能,应该是到队尾

//中断级发送函数
xQueueSendFromISR(test_Queue,&test_send,&xHigherPriorityTaskWoken);        //中断队列发送函数,发送消息到队尾
xQueueSendToFrontFromISR(test_Queue,&test_send,&xHigherPriorityTaskWoken); //中断队列发送函数,发送消息到队头
xQueueOverwriteFromISR(test_Queue,&test_send,&xHigherPriorityTaskWoken);   //带覆写功能,满了覆盖掉旧队列

//任务级读取函数
xQueueReceive(test_Queue,&test_queue,portMAX_DELAY);	//任务读取队列函数,读完删掉队列项
xQueuePeek(test_Queue,&test_queue,portMAX_DELAY);	//任务读取队列函数,读完不删掉

//中断级读取函数
xQueueReceiveFromISR(test_Queue,&test_queue,&xHigherPriorityTaskWoken);		//读完删掉队列项
xQueuePeekFromISR(test_Queue,&test_queue);	    //读完不删除

//用法
if(test_Queue!=NULL)
	{
      if(xQueueReceive(test_Queue,&test_queue,portMAX_DELAY))
      {
	  }
	}
	


/**********二值信号量**************/
#include "semphr.h"
SemaphoreHandle_t Binary_test;		//定义
BaseType_t xHigherPriorityTaskWoken;	//中断需要

Binary_wiredown=xSemaphoreCreateBinary();     //创建二值信号量

//任务级释放信号量
xSemaphoreGive(Binary_test);
	
//中断级释放信号量
xSemaphoreGiveFromISR(Binary_test,&xHigherPriorityTaskWoken);	

//任务级获取信号量
xSemaphoreTake(Binary_test,portMAX_DELAY);

//中断级获取信号量
xSemaphoreTakeFromISR(Binary_test,&xHigherPriorityTaskWoken);

//用法
if(Binary_test!=NULL)
    {
      if(xSemaphoreTake(Binary_test,portMAX_DELAY)==pdTRUE)//获取信号量
      {
	  }
	}

/**********互斥信号量**************/
#include "semphr.h"
//互斥信号量句柄
SemaphoreHandle_t MutexSemaphore;	//互斥信号量
//创建互斥信号量
MutexSemaphore=xSemaphoreCreateMutex();
xSemaphoreTake(MutexSemaphore,portMAX_DELAY);	//获取互斥信号量
xSemaphoreGive(MutexSemaphore);					//释放信号量
	
	
	
	
/**********事件标志组**************/
#define TOUCHBIT_0	(1<<0)				
#define TOUCHBIT_1	(1<<1)				
#define TOUCHBIT_2	(1<<2)				
#define EVENTBIT_ALL	(TOUCHBIT_0|TOUCHBIT_1|TOUCHBIT_2)
EventGroupHandle_t EventGroupHandler;	//定义
BaseType_t xHigherPriorityTaskWoken;	//中断需要

EventGroupHandler=xEventGroupCreate();		//创建事件标志组

//任务级设置事件位
xEventGroupSetBits(EventGroupHandler,TOUCHBIT_0);	//将指定的事件位置1
xEventGroupClearBits(EventGroupHandler,TOUCHBIT_0);	//将指定的事件清零

//中断级设置事件位
xEventGroupSetBitsFromISR(EventGroupHandler,TOUCHBIT_0,&xHigherPriorityTaskWoken);	//将指定的事件位置1
xEventGroupClearBitsFromISR(EventGroupHandler,TOUCHBIT_0);	//将指定的事件清零

//任务级获取事情标志组
xEventGroupGetBits(EventGroupHandler);	

//中断级获取事情标志组
xEventGroupGetBitsFromISR(EventGroupHandler);	

//任务级等待指定的事件位
xEventGroupWaitBits( 
					(EventGroupHandle_t)EventGroupHandler,
					(EventBits_t)EVENTBIT_ALL,				
					(BaseType_t)pdTRUE,//退出时EVENTBIT_ALL清除	
					(BaseType_t)pdFALSE,//或关系
					(TickType_t)portMAX_DELAY;//一直阻塞
					);
	
//用法
EventBits_t EventValue;
if(EventGroupHandler!=NULL)
    {
      EventValue=xEventGroupWaitBits(
                                     (EventGroupHandle_t)EventGroupHandler,		
                                     (EventBits_t)EVENTBIT_ALL,
                                     (BaseType_t)pdTRUE,//退出时EVENTBIT_ALL清除				
                                     (BaseType_t)pdFALSE,//或关系
                                     (TickType_t)portMAX_DELAY);
      if((EventValue&(TOUCHBIT_0))==(TOUCHBIT_0))     //触摸事件
      {
	  }
	  else if((EventValue&(TOUCHBIT_1))==(TOUCHBIT_1))  
	  {
	  }
	}	  
	
/**********任务通知**************/
#include "limits.h"
BaseType_t xHigherPriorityTaskWoken;	//中断需要	
uint32_t value  //保存之前的通知值
//任务通知不需要创建

//任务级发送通知
xTaskNotify(Hardware_TaskHandle(任务句柄), 7(值) , eAction(更新方式));	//带有通知值并且不保留接收任务原通知值
													eAction是个枚举类型
													typedef enum
													{
														eNoAction=0,
														eSetBits,	//更新指定的bit
														eIncrement,//通知值加1
														eSetValueWithOverwrite,	//覆写的方式更新通知值
														eSetValueWithoutOverwrite	//不覆写通知值
													}
xTaskNotifyGive(Hardware_TaskHandle);  //不带通知值不保留接受任务的通知值,会将接收任务的通知值加1
xTaskNotifyAndQuery(Hardware_TaskHandle,7(值),eAction(更新方式),&value(保存之前的通知值));//带有通知值并且保留接收任务的原通知值


//中断级发送通知
xTaskNotifyFromISR(Hardware_TaskHandle,3(值),eAction(更新方式),&xHigherPriorityTaskWoken);	//xTaskNotify()的中断版本
xTaskNotifyGiveFromISR(Hardware_TaskHandle,&xHigherPriorityTaskWoken);//xTaskNotifyGive()的中断版本													
xTaskNotifyAndQueryFromISR(Hardware_TaskHandle,7(值),eAction(更新方式),&value(保存之前的通知值),&xHigherPriorityTaskWoken);//xTaskNotifyAndQuery()的中断版本

//获取任务通知
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);		//为pdTRUE,退出函数的时候任务通知值清零,类似二值信号量
											//为pfFALSE,推出函数的时候任务通知值减1,类似计数型信号量

xTaskNotifyWait(
				uint32_t ulBitsToClearOnEntry,
				//没有接受到任务通知时将此任务通知值与改参数的值取反值进行按位与运算,
				//此参数为0xffffffff或为ULONG_MAX时将任务通知值清零
				uint32_t ulBitsToClearOnExit,
				//接受到任务通知,在做完相应的处理退出函数之前将任务通知值与此函数的取反值进行按位与运算
				//当参数为0xffffffff或ULONG_MAX的时候就会将任务通知值清零
				uint32_t* pulNotificationValue,
				//用于保存任务通知值
				TickType_t xTicksToWait
				//阻塞时间
				);		//等待任务通知,全功能版通知获取函数
//使用说明:
 xTaskNotify( (TaskHandle_t) Infor_TaskHandle,
                      (uint32_t) (1),
                      (eNotifyAction) eSetValueWithOverwrite ); //给SCAN发送通知,发送解锁数据
 
 BaseType_t err = 0;
 uint32_t NotifyValue = 0; 
 err =  xTaskNotifyWait( (uint32_t) 0x00,       //进入函数不会清除任务bit
                           (uint32_t) ULONG_MAX,   //退出函数清除所有bit
                           (uint32_t*) &NotifyValue,  //保存任务通知值
                           (TickType_t) 0 );          //阻塞时间
    if( err == 1 )
    {
      if( NotifyValue == 1 )
      {
        
      }
      else if( NotifyValue == 2 )
      {
        
  

				
//模拟邮箱用法
#include "limits.h"
BaseType_t err;

xTaskNotify( (TaskHandle_t) Scan_TaskHandle,	//任务句柄
               (uint32_t) _send_mode,			//发送值
               (eNotifyAction) eSetValueWithOverwrite );	//覆写模式
			   
err = xTaskNotifyWait( (uint32_t) 0x00,       //进入函数不会清除任务bit
                         (uint32_t) ULONG_MAX,   //退出函数清除所有bit
                         (uint32_t*) &send_mode,  //保存任务通知值
                         (TickType_t) 0 );          //阻塞时间
				
  if( err == pdTURE )   //接收到通知
  {
    
  }

//模拟事件组用法
#include "limits.h"
#define Scan_EVENTBIT_0	(1<<0)
#define Scan_EVENTBIT_1	(1<<1)
#define Scan_EVENTBIT_2	(1<<2)
BaseType_t err;

xTaskNotify( (TaskHandle_t) Sceen_TaskHandle,	//任务句柄
               (uint32_t) Sceen_EVENTBIT_0,			//更新位
               (eNotifyAction) eSetBits );	//更新指定的bit
			   
err = xTaskNotifyWait( (uint32_t) 0x00,       //进入函数不会清除任务bit
                         (uint32_t) ULONG_MAX,   //退出函数清除所有bit
                         (uint32_t*) &NotifyValue,  //保存任务通知值
                         (TickType_t) 0 );          //阻塞时间
				
  if( err == pdTURE )   //接收到通知
  {
    if((NotifyValue&Scan_EVENTBIT_0)!=0)   //事件0发生	
     {
       	
     }				
     else if((NotifyValue&Scan_EVENTBIT_1)!=0)	//事件1发生	
     {
       
     }
     else if((NotifyValue&Scan_EVENTBIT_2)!=0)	//事件2发生	
     {
       	
     }
  }

















原文地址:https://www.cnblogs.com/penuel/p/13495021.html