freertos queue demo msp430

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wowocpp/article/details/82733343

参考代码:
FreeRTOSV8.2.3\FreeRTOS\Demo\CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil\SimplyBlinkyDemo

任务解析

main_blinky() creates one queue, and two tasks. It then starts the
scheduler.
创建一个队列,两个任务

The Queue Send Task:
延时200ms 发送一个消息
The queue send task is implemented by the prvQueueSendTask() function in
this file. prvQueueSendTask() sits in a loop that causes it to repeatedly
block for 200 milliseconds, before sending the value 100 to the queue that
was created within main_blinky(). Once the value is sent, the task loops
back around to block for another 200 milliseconds.

The Queue Receive Task:
等待接收消息,如果接收到消息,任务检查消息的值,是否等于100.然后切换LED的状态。

The queue receive task is implemented by the prvQueueReceiveTask() function
in this file. prvQueueReceiveTask() sits in a loop where it repeatedly
blocks on attempts to read data from the queue that was created within
main_blinky(). When data is received, the task checks the value of the
data, and if the value equals the expected 100, toggles the LED. The ‘block
time’ parameter passed to the queue receive function specifies that the
task should be held in the Blocked state indefinitely to wait for data to
be available on the queue. The queue receive task will only leave the
Blocked state when the queue send task writes to the queue. As the queue
send task writes to the queue every 200 milliseconds, the queue receive
task leaves the Blocked state every 200 milliseconds, and therefore toggles

代码:

//
// GPIO_LED : GPIO output to control an on-board red LED
// 
// EVB : Nu-LB-NUC140
// MCU : NUC140VE3CN

// low-active output control by GPC12

#include <stdio.h>
#include "NUC100Series.h"
#include "MCU_init.h"
#include "SYS_init.h"

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "semphr.h"


/* Priorities at which the tasks are created. */
#define mainQUEUE_RECEIVE_TASK_PRIORITY     ( tskIDLE_PRIORITY + 2 )
#define mainQUEUE_SEND_TASK_PRIORITY        ( tskIDLE_PRIORITY + 1 )

/* The rate at which data is sent to the queue.  The 200ms value is converted
to ticks using the portTICK_PERIOD_MS constant. */
#define mainQUEUE_SEND_FREQUENCY_MS         ( pdMS_TO_TICKS( 1000UL ) )

/* The number of items the queue can hold.  This is 1 as the receive task
will remove items as they are added, meaning the send task should always find
the queue empty. */
#define mainQUEUE_LENGTH                    ( 1 )

/* Values passed to the two tasks just to check the task parameter
functionality. */
#define mainQUEUE_SEND_PARAMETER            ( 0x1111UL )
#define mainQUEUE_RECEIVE_PARAMETER         ( 0x22UL )

/*-----------------------------------------------------------*/

/*
 * The tasks as described in the comments at the top of this file.
 */
static void prvQueueReceiveTask( void *pvParameters );
static void prvQueueSendTask( void *pvParameters );


/* The queue used by both tasks. */
static QueueHandle_t xQueue = NULL;


void vStartThreadTasks( void )
{

    /* Create the queue. */
    xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );

    if( xQueue != NULL )
    {
        /* Start the two tasks as described in the comments at the top of this
        file. */
        xTaskCreate( prvQueueReceiveTask,                   /* The function that implements the task. */
                    "Rx",                                   /* The text name assigned to the task - for debug only as it is not used by the kernel. */
                    configMINIMAL_STACK_SIZE,               /* The size of the stack to allocate to the task. */
                    ( void * ) mainQUEUE_RECEIVE_PARAMETER, /* The parameter passed to the task - just to check the functionality. */
                    mainQUEUE_RECEIVE_TASK_PRIORITY,        /* The priority assigned to the task. */
                    NULL );                                 /* The task handle is not required, so NULL is passed. */

        xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, ( void * ) mainQUEUE_SEND_PARAMETER, mainQUEUE_SEND_TASK_PRIORITY, NULL );

    }

}


static void prvQueueSendTask( void *pvParameters )
{
    TickType_t xNextWakeTime;
    const unsigned long ulValueToSend = 100UL;

    /* Check the task parameter is as expected. */
    configASSERT( ( ( unsigned long ) pvParameters ) == mainQUEUE_SEND_PARAMETER );

    /* Initialise xNextWakeTime - this only needs to be done once. */
    xNextWakeTime = xTaskGetTickCount();

    for( ;; )
    {
        /* Place this task in the blocked state until it is time to run again.
        The block time is specified in ticks, the constant used converts ticks
        to ms.  While in the Blocked state this task will not consume any CPU
        time. */
        vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );

        /* Send to the queue - causing the queue receive task to unblock and
        toggle the LED.  0 is used as the block time so the sending operation
        will not block - it shouldn't need to block as the queue should always
        be empty at this point in the code. */
        xQueueSend( xQueue, &ulValueToSend, 0U );
    }
}

static void prvQueueReceiveTask( void *pvParameters )
{
    unsigned long ulReceivedValue;
    static const TickType_t xShortBlock = pdMS_TO_TICKS( 50 );

    /* Check the task parameter is as expected. */
    configASSERT( ( ( unsigned long ) pvParameters ) == mainQUEUE_RECEIVE_PARAMETER );

    for( ;; )
    {
        /* Wait until something arrives in the queue - this task will block
        indefinitely provided INCLUDE_vTaskSuspend is set to 1 in
        FreeRTOSConfig.h. */
        xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );

        /*  To get here something must have been received from the queue, but
        is it the expected value?  If it is, toggle the LED. */
        if( ulReceivedValue == 100UL )
        {
            /* Blip the LED for a short while so as not to use too much
            power. */
            //configTOGGLE_LED();
            GPIO_TOGGLE(PC12);
            vTaskDelay( xShortBlock );
            //configTOGGLE_LED();
            GPIO_TOGGLE(PC12);
            ulReceivedValue = 0U;
        }
    }
}



int main(void)
{
    SYS_Init();      
        UART_Open(UART0, 115200);
        printf("Hello World \r\n"); 

    GPIO_SetMode(PC, BIT12, GPIO_MODE_OUTPUT);


      vStartThreadTasks();

    vTaskStartScheduler();

    while(1) {

        }
}

FreeRTOS_Queue

(稍后补充)

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/82733343
今日推荐