FreeRTOS 1/FreeRTOS 2/FreeRTOS - Queues Flashcards

1
Q

Erzeugen Sie unter FreeRTOS zwei Tasks, die jeweils eine LED1 und LED2 toggeln, wobei jeder der beiden Tasks nach Beendigung des Schaltvorgangs eine Pause von 500 ms macht, bevor er wieder aufgerufen wird.
Task1 soll mit der niedrigeren Priorität 1 betrieben werden, Task2 mit der höheren Priorität 2.

A

void vTaskFunction1( void pvParameters )
{
for( ;; )
{
/
Print out the name of this task. */
LED1 = ~LED1;
vTaskDelay( 500 / portTICK_RATE_MS );
}
}
void vTaskFunction2( void pvParameters )
{
for( ;; )
{
/
Print out the name of this task. */
LED2 = ~LED2;
vTaskDelay( 500 / portTICK_RATE_MS );
}
}
int main( void )
{
xTaskCreate( vTaskFunction1, “Task 1”, 1000, NULL, 1, NULL );
xTaskCreate( vTaskFunction2, “Task 2”, 1000, NULL, 2, NULL );
vTaskStartScheduler();
for( ;; );
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

(a)
Ändern nach Sie die Lösung zu Aufgabe “FreeRTO1” so ab, dass die beiden Tasks jeweils mit einer Periode von 500 ms aufgerufen werden.

A
void vTaskFunction1( void *pvParameters ) 
{
portTickType xLastWakeTime;
// Initialise the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
const portTickType xFrequency = 500;
while(1) 
{
LED1 = ~LED1;
vTaskDelayUntil( &xLastWakeTime, xFrequency);
}
for( ;; )
 {
/* Print out the name of this task. */
}
}
int main( void )
 {
xTaskCreate( vTaskFunction1, "Task 1", 1000, NULL, 1, NULL );
xTaskCreate( vTaskFunction2, "Task 2", 1000, NULL, 2, NULL );
vTaskStartScheduler();
for( ;; );
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

(b)

Skizzieren Sie den Verlauf der beiden Tasks und des Leerlauftasks!

A

?????

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

(c)

Welche Problematik ergibt sich in Bezug auf die Einstellung der genauen Zeitabstände?

A

?????

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

(a)
Entwerfen Sie ein Programm, bei dem ein Sender-Task alle 500 ms Daten in eine Queue einstellt, die dann abwechselnd von zwei Receiver-Tasks gelesen werden.

A

static void vSenderTask( void pvParameters )
{
static int lValueToSend = 0;
portBASE_TYPE xStatus;
portTickType xNextWakeTimeS;
/
Initialise xNextWakeTimeS - this only needs to be done once. */
xNextWakeTimeS = xTaskGetTickCount();
for( ;; )
{
xStatus = xQueueSend( xQueue, &lValueToSend, 0 );
if( xStatus != pdPASS )
{
vPrintString( “Could not send to the queue.\r\n” );
}
lValueToSend++;
vTaskDelayUntil(&xNextWakeTimeS, 500 / portTICK_RATE_MS );
}
}
static void vReceiverTask( void pvParameters )
{
int lReceivedValue;
portBASE_TYPE xStatus;
portTickType xNextWakeTimeR;
/
Initialise xNextWakeTime - this only needs to be done once. /
xNextWakeTimeR = xTaskGetTickCount();
for( ;; )
{
if( uxQueueMessagesWaiting( xQueue ) != 0 )
{
vPrintString( “Queue should have been empty!\r\n” );
}
xStatus = xQueueReceive( xQueue, &lReceivedValue, xTicksToWait );
if( xStatus == pdPASS )
{
vPrintStringAndNumber( “Received = “, lReceivedValue );
}
else
{
vPrintString( “Could not receive from the queue.\r\n” );
}
vTaskDelayUntil((&xNextWakeTimeR, 500 / portTICK_RATE_MS );
}
}
xQueueHandle xQueue;
int main( void )
{
xQueue = xQueueCreate( 5, sizeof( long ) );
if( xQueue != NULL )
{
xTaskCreate( vSenderTask, “Sender”, 1000, NULL, 3, NULL );
xTaskCreate( vReceiverTask1, “Receiver”, 1000, NULL, 1, NULL );
xTaskCreate( vReceiverTask2, “Receiver”, 1000, NULL, 2, NULL );
vTaskStartScheduler();
}
else
{
/
The queue could not be created. */
}
for( ;; );
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

b)

Welche Bedingungen müssen erfüllt sein, damit das Programm stabil abgearbeitet werden kann?

A

??????

How well did you know this?
1
Not at all
2
3
4
5
Perfectly