Implement the "Nuclear Reactor" example using the following:
An ISR triggered by a button press
A task to update the temperatures
A semaphore to communicate between the ISR and the update task
The update task should use dynamic memory allocation to get a buffer in which to place the temperature.
Pass the buffer containing the temperatures to the checking task using an RTOS queue.
Write an "Introduction to using FreeRTOS" document in which you use your "Nuclear Reactor" code as an example to explain the key concepts of Semaphores, queues, dynamic memory allocation in an RTOS and timing in an RTOS.
This is a code: Nuclear reactor.
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
//// main.c
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
#include
/* Scheduler include files. */
#include
#include
#include
#include
/*-----------------------------------------------------------*/
voidTaskUpdatTemps(void *pvParameters);
voidTaskCheckTemps(void *pvParameters);
/*-----------------------------------------------------------*/
//global shared data
int temperatures[2];
//xSemaphoreHandle-Data structure managed by the RTOS
xSemaphoreHandletemperaturesSem;
xSemaphoreHandleReleaseSem;
ISR(INT0_vect)
{
//Release the semaphore
xSemaphoreGive(ReleaseSem);
}
intmain(void)
{
//Set direction of PORTB pin 5,6,7 as output pins
DDRB |= (1<
DDRB |= (1<
DDRB |= (1<
//Generate in on rising edge on INT0 pin - bits in EICRA Reg
EICRA |= (1 << ISC00);
EICRA |= (1 << ISC01);
//Enable - bits in EIMSK reg
EIMSK |= (1 << INT0);
//Enable interrupts - Set I bit in SR(status register)
sei();
xTaskCreate(
TaskUpdatTemps
, NULL
, 256
, NULL
, 2
, NULL );
xTaskCreate(
TaskCheckTemps
, NULL
, 256
, NULL
, 1
, NULL );
//Create semaphores
vSemaphoreCreateBinary(temperaturesSem);
vSemaphoreCreateBinary(ReleaseSem);
//Start the task Scheduler
vTaskStartScheduler();
/*while(1)
{
//do nothing
}*/
}
/*-----------------------------------------------------------*/
voidTaskUpdatTemps(void *pvParameters)
{
//Just keep compiler happy
(void)pvParameters;
staticint count = 0;
while(1)
{
//Take the semaphore ReleaseSem
xSemaphoreTake(ReleaseSem, portMAX_DELAY);
//Take the semaphore temperatureSem to protect atomic variables
xSemaphoreTake(temperaturesSem, portMAX_DELAY);
temperatures[0]=count;
temperatures[1]=count;
//Give the semaphore back
xSemaphoreGive(temperaturesSem);
//Increment Count variable
count ++;
//Toggle portb pin 6 to turn LED on/off (Using Exclusive OR)
PORTB ^= (1<
//Delay for 1 sec
//vTaskDelay( 1000 / portTICK_RATE_MS );
}
}
/*-----------------------------------------------------------*/
voidTaskCheckTemps(void *pvParameters) // Main Green LED Flash
{
int temp0, temp1;
(void) pvParameters;
//Set direction of pin to be an output
DDRB |= (1<
while(1)
{
//Take the semaphore temperatureSem to protect atomic variables
xSemaphoreTake(temperaturesSem, portMAX_DELAY);
temp0=temperatures[0];
//Delay for 1 sec
vTaskDelay( 1000 / portTICK_RATE_MS );
temp1=temperatures[1];
//Give the semaphore back
xSemaphoreGive(temperaturesSem);
//Toggle portb pin 5 to turn LED on/off (Using Exclusive OR)
PORTB ^= (1<
//Checking to see if temperatures match
if(temp0 != temp1)
{
PORTB |= (1<
}
}
}