1、 介绍常用函数。
①释放信号量xTaskNotifyGive。xTaskNotifyGive是宏定义,调用xTaskGenericNotify
_和二值信号一样!!!
#define xTaskNotifyGive( xTaskToNotify ) \
xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL )
#define xTaskNotifyGive( xTaskToNotify ) \
xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL )
/*
**参数1:任务控制块
**参数2:数据
**参数3:作为二值信号量和计数信号量,只能eIncrement
**参数4:更新以前通知值到参数4
*/
BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction,
uint32_t *pulPreviousNotificationValue )
②获取信号量
/*
**参数1:退出时清除计数值,作为二值信号量恒定为pdFALSE
**参数2:等待时间
*/
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait )
2、创建任务
void m_create_task_notify3(void)
{
BaseType_t xReturn = pdPASS;
xReturn = xTaskCreate((TaskFunction_t )take_Task,
(const char* )"take_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&take_Task_Handle);
if(pdPASS == xReturn)
LOG_BLE("Receive1_Task create ok\n");
xReturn = xTaskCreate((TaskFunction_t )give_Task,
(const char* )"give_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&give_Task_Handle);
if(pdPASS == xReturn)
LOG_BLE("Receive2_Task create ok\n");
}
3、 编写内存的测试任务入口函数
#include "limits.h"
#ifndef TAG_BLE
#define LOG_BLE(...)
#endif
//任务通知替代计数信号
static TaskHandle_t take_Task_Handle = NULL;
static TaskHandle_t give_Task_Handle = NULL;
static void take_Task(void* parameter)
{
uint8_t button2_sta=0;
uint32_t take_num=0;
while (1)
{
if( READ_BUTTON2_P12() == BUTTON_PUSH )
{
if (0 == button2_sta)
{
button2_sta = 1;
take_num=ulTaskNotifyTake(pdFALSE,0);//
if(take_num > 0)
{
LOG_BLE("take ok value:%d\n",take_num-1);
} else
{
LOG_BLE("take ok error\n");
}
}
} else
{
button2_sta = 0;
}
vTaskDelay(20);
}
}
static void give_Task(void* parameter)
{
BaseType_t xReturn = pdPASS;
uint8_t button1_sta=0;
while (1)
{
if( READ_BUTTON1_P11() == BUTTON_PUSH )
{
if ( 0 == button1_sta)
{
button1_sta = 1;
xReturn = xTaskNotifyGive(take_Task_Handle);//xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL )
if( xReturn == pdPASS )
LOG_BLE("give task send ok\n");
}
} else
{
button1_sta = 0;
}
vTaskDelay(20);
}
}
实验说明和现象
①take_Task任务:每按下一次按键将获取信号量,获取成功将打印剩余信号量。
②give_Task任务:每按下一次按键将释放信号量。