【FreeRTOS】白進段の使用FreeRTOS二値信号量(一)
1794 ワード
信号量使用ベースについて説明します.
1、ヘッダファイル宣言
2、タスクの開始
タスクvPeriodicRaskは、シミュレーション割り込みを開始するために使用されます.
3、任務の実現
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 );
}