【FreeRTOS】白進段の使用FreeRTOS二値信号量(一)


信号量使用ベースについて説明します.
1、ヘッダファイル宣言
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "supporting_functions.h"

#define mainINTERRUPT_NUMBER	3

static void vHandlerTask( void *pvParameters );
static void vPeriodicTask( void *pvParameters );

//     
static uint32_t ulExampleInterruptHandler( void );

//        
SemaphoreHandle_t xBinarySemaphore;

2、タスクの開始
タスクvPeriodicRaskは、シミュレーション割り込みを開始するために使用されます.
int main( void )
{
    //        
    xBinarySemaphore = xSemaphoreCreateBinary();

	if( xBinarySemaphore != NULL )
	{
		xTaskCreate( vHandlerTask, "Handler", 1000, NULL, 3, NULL );

		xTaskCreate( vPeriodicTask, "Periodic", 1000, NULL, 1, NULL );

		vPortSetInterruptHandler( mainINTERRUPT_NUMBER, ulExampleInterruptHandler );

		vTaskStartScheduler();
	}

	for( ;; );
	return 0;
}

3、任務の実現
static void vHandlerTask( void *pvParameters )
{
	for( ;; )
	{
		// block       
		xSemaphoreTake( xBinarySemaphore, portMAX_DELAY );

		vPrintString( "Handler task - Processing event.\r
" ); } } static void vPeriodicTask( void *pvParameters ) { const TickType_t xDelay500ms = pdMS_TO_TICKS( 500UL ); for( ;; ) { vTaskDelay( xDelay500ms ); vPrintString( "Periodic task - About to generate an interrupt.\r
" ); // vPortGenerateSimulatedInterrupt( mainINTERRUPT_NUMBER ); vPrintString( "Periodic task - Interrupt generated.\r
\r
\r
" ); } } static uint32_t ulExampleInterruptHandler( void ) { BaseType_t xHigherPriorityTaskWoken; // xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken ); portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); }