文章目录[隐藏]
三十五、 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 Receive2_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");
}
/**********************************************************************
* @ 函数名 : Receive1_Task
* @ 功能说明: Receive1_Task 任务主体
* @ 参数 :
* @ 返回值 : 无
********************************************************************/
static void Receive1_Task(void* parameter)
{
BaseType_t xReturn=pdTRUE;
while(1)
{
//获取任务通知,没获取到就一直等待
xReturn=ulTaskNotifyTake(pdTRUE,//pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量.
//pdFALSE 在退出函数 ulTaskNotifyTakeO 的时候任务通知值减一,类似计数型信号量。
portMAX_DELAY);
Board_LED_Toggle(1);
printf("Receive1_Task 任务通知获取成功 !\n");
}
}
/**********************************************************************
* @ 函数名 : Receive2_Task
* @ 功能说明: Receive2_Task 任务主体
* @ 参数 :
* @ 返回值 : 无
********************************************************************/
static void Receive2_Task(void* parameter)
{
BaseType_t xReturn=pdTRUE;
while(1)
{
//获取任务通知,没获取到就一直等待
xReturn=ulTaskNotifyTake(pdTRUE,//pdTRUE 在退出函数的时候任务任务通知值清零,类似二值信号量,
//pdFALSE 在退出函数 ulTaskNotifyTakeO 的时候任务通知值减一,类似计数型信号量。
portMAX_DELAY );
if(NULL !=xReturn)
{
Board_LED_Toggle(1);
printf("Receive2_Task 任务通知获取成功 !\n");
}
}
}
/**********************************************************************
* @ 函数名 : Send_Task
* @ 功能说明: 发送任务
* @ 参数 :
* @ 返回值 : 无
********************************************************************/
static void Send_Task(void* parameter)
{
BaseType_t xReturn =pdPASS;
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键按下 */
xReturn= xTaskNotifyGive(Receive1_TaskHandle);
/* 此函数只会返回 pdPASS */
if ( xReturn == pdPASS )
printf("Receive1_Task_Handle 任务通知释放成功!\r\n");
}break;
case 2:
{
/* K2键按下 */
xReturn= xTaskNotifyGive(Receive2_TaskHandle);
/* 此函数只会返回 pdPASS */
if ( xReturn == pdPASS )
{
printf("Receive2_Task_Handle 任务通知释放成功! \r\n");
}
}break;
case 3:
{
/* K3键按下*/
}break;
default:break;
}
key2=0;
}
}
}
/***********************************************************************
* @ 函数名 : AppTaskCreate
* @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
* @ 参数 : 无
* @ 返回值 : 无
**********************************************************************/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
taskENTER_CRITICAL();//进入临界区,禁止中断打断
xReturn = xTaskCreate(Receive1_Task,
"Receive1_Task",
TASK_STACK_SIZE*4,
NULL,
2,
&Receive1_TaskHandle);
if (pdPASS == xReturn)
printf("创建 Receive1_Task 任务成功!\r\n");
xReturn = xTaskCreate(Receive2_Task,
"Receive2_Task",
TASK_STACK_SIZE*4,
NULL,
2,
&Receive2_TaskHandle);
if (pdPASS == xReturn)
printf("创建 Receive2_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("按下 KEY1 或者 KEY2 进行任务与任务间的同步 \r\n");
AppTaskCreate();
vTaskStartScheduler();//任务调度
/* Loop forever */
while (1) {
printf("FreeRTOS 运行失败\n\r");
}
}
任务通知代替二值信号量
实验现象:
key1按下发送消息通知给任务1,任务1收到通知后打印出来,改变LED1状态。
key2按下发送消息通知给任务2,任务2收到通知后打印出来,改变LED1状态。使用函数:
发送 xTaskNotifyGive();
接收 ulTaskNotifyTake();
版权声明:本文为CSDN博主「春风得意吃火锅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17208955/article/details/122350868
暂无评论