0
点赞
收藏
分享

微信扫一扫

36 freertos任务通知-代替计数信号量

三十六、freertos任务通知-代替计数信号量


/**
**************************************************************************************************/
#include <stdio.h>
#include <limits.h>//标准C库文件,定义了各种类型的范围
#include "board.h"
#include "led.h"
#include "key.h"
#include "uart.h"
//#include "tim_mrt.h"


/*** System oscillator rate and clock rate on the CLKIN pin  ****/
/**/const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ;		 /**/
/**/const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ;		 /**/
 //系统复位
#define	System_restart	(LPC_SWM->PINENABLE0 = 0xffffffffUL) /**/
/**********************End**************************************/



#include "FreeRTOSConfig.h"
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"//事件头文件
#include "queue.h"//队列头文件
#include "semphr.h"//信号量头文件
#include "timers.h"//软件定时器头文件


#define TASK_STACK_SIZE 32//每个任务的栈大小
/**************************** 任务句柄 ********************************/

static xTaskHandle Receive1_TaskHandle=NULL;
static xTaskHandle Send_TaskHandle=NULL;
	



/*************************** 宏定义 ************************************/
#define USE_CHAR 0 /* 测试字符串的时候配置为 1 ,测试变量配置为 0 */



/* Sets up system hardware 
**********************************************************************
  * @ 函数名  : BSP_Init
  * @ 功能说明: 板级外设初始化,所有板子上的初始化均可放在这个函数里面
  * @ 参数    :   
  * @ 返回值  : 无
*********************************************************************/
static void prvSetupHardware(void)
{

	SystemCoreClockUpdate();

	DEBUGINIT();
	led_Init() ;	
	Key_INIT();
//	MRT_Init();
	DEBUGOUT("%u MHz\n",SystemCoreClock/1000000);
	Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "\n");

}

/**********************************************************************
 * @ 函数名 : Give_Task
 * @ 功能说明:  发送通知,代替释放信号量
 * @ 参数 :
 * @ 返回值 : 无
 ********************************************************************/
static void Give_Task(void* parameter)
{
	BaseType_t xReturn=pdPASS;
 	
	while(1)
	{

		/* 释放一个任务通知 */
		xReturn=xTaskNotifyGive(Send_TaskHandle);
		/* 此函数只会返回 pdPASS */
		if(pdPASS ==xReturn)
		{
			Board_LED_ON(1);
			printf("释放 1 个停车位 !\n");
		
		}			

		vTaskDelay(5000);
	}
}


/**********************************************************************
 * @ 函数名 :  Send_Task
 * @ 功能说明: 发送任务
 * @ 参数 :
 * @ 返回值 : 无
 ********************************************************************/
static void Send_Task(void* parameter)
{
//	BaseType_t xReturn =pdPASS;
	u32 take_num=pdTRUE;
	
	
	u8 key2=0;
	while(1)
	{
		u8 key=0;
		if(Scan_Key())
			vTaskDelay(20);
		else continue;
		if(!Scan_Key())continue;
		else
		{
			key=Scan_Key();
			key2=key;
		}
		while(Scan_Key()){};//等按键抬起
		
		if(key2)
		{

			switch(key2)
			{
				case 1:
				{
					/* K1键按下 */
					/*pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量
					/ pdFALSE 在退出函数 ulTaskNotifyTakeO 的时候任务通知值减一,类似计数型信号量。*/
					take_num =  ulTaskNotifyTake(pdFAIL,0);
					if (take_num > 0)
						printf( "KEY1 被按下, 成功申请到停车位。当前车位为 %d \n", take_num - 1);
					else
					{
						printf( "KEY1 被按下, 车位已经没有了。等待5s 释放车位\n" );
						Board_LED_OFF(1);
					}
				}break;
				case 2:
				{
					 /* K2键按下 */
					

				}break;
				case 3:
				{
					 /* K3键按下*/
					 
 					
				}break;
				default:break;
			}
			key2=0;
		}
			
	}
}

/***********************************************************************
  * @ 函数名  : AppTaskCreate
  * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
  * @ 参数    : 无  
  * @ 返回值  : 无
  **********************************************************************/
static void AppTaskCreate(void)
{
	BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
	taskENTER_CRITICAL();//进入临界区,禁止中断打断
	
	xReturn = xTaskCreate(Give_Task,
							"Give_Task",
							TASK_STACK_SIZE*4,
							NULL,
							1,
							&Receive1_TaskHandle);
	if (pdPASS == xReturn)
		printf("创建 Receive1_Task 任务成功!\r\n");
	

	xReturn = xTaskCreate(Send_Task,
							"Send_Task",
							TASK_STACK_SIZE*4,
							NULL,
							1,
							&Send_TaskHandle);
	if (pdPASS == xReturn)
		printf("创建 Send_Task 任务成功!\r\n");

	taskEXIT_CRITICAL(); //退出临界区	

}

/**
 * @brief	main routine for blinky example
 * @return	Function should not exit.
 */
int main(void)
{
	
	prvSetupHardware();
	Board_UARTPutSTR("LPC824 FreeRTOS 任务通知代替二值信号量实验 \n");
	printf("车位默认值为 0 个,按下 KEY1 申请车位,每5秒自动释放1个车位 \r\n");

	AppTaskCreate();

	vTaskStartScheduler();//任务调度

	/* Loop forever */
	while (1) {
			printf("FreeRTOS 运行失败\n\r");
 	}
	
	
}
举报

相关推荐

0 条评论