⭐⭐⭐⭐⭐ SOLUCIÓN LECCIÓN SISTEMAS EMBEBIDOS, 2do Parcial (2020 PAO 1)
1. vasanza
SISTEMAS EMBEBIDOS
LECCIÓN #1 2P
Fecha: 2020/08/13 PAO1 2020-2021
Nombre: _________________________________________________ Paralelo: __________
Problema #1: (x%)
Dado el siguiente código usando Free RTOS en Arduino, ¿Cuáles de las siguientes afirmaciones son
correctas?
#include <Arduino_FreeRTOS.h>
TaskHandle_t TaskLed_Handler;
void TaskBlink( void *pvParameters );
void setup() {
pinMode(led, OUTPUT);
xTaskCreate(
TaskBlink
, "Blink" // A name just for humans
, 128 // Stack size
, NULL
, 0 // priority
, &TaskLed_Handler); // Variable que apunta al task (opcional)
vTaskSuspend(TaskLed_Handler);
}
void TaskBlink(void *pvParameters)
{
for (;;){
digitalWrite(led, HIGH);
vTaskDelay( 500 / portTICK_PERIOD_MS );
digitalWrite(led, LOW);
vTaskDelay( 500 / portTICK_PERIOD_MS );
vTaskSuspend(TaskLed_Handler);
}
}
a) La tarea TaskBlink solo será ejecutada en el momento que se utilice la instrucción
vTaskResume(TaskLed_Handler) y solo será ejecutada una vez ya que al final de la misma tarea
esta la instrucción vTaskSuspend(TaskLed_Handler).
b) La tarea TaskBlink solo será ejecutada en el momento que se utilice la instrucción
vTaskResume(TaskLed_Handler) y se ejecutará de forma infinita por el for(;;) ya que al final de la
misma tarea esta la instrucción vTaskSuspend(TaskLed_Handler).
c) Es importante que la tarea que llame a ejecutar a la tarea TaskBlink, adicione una vTaskDelay( 2000
/ portTICK_PERIOD_MS ) luego de la instrucción vTaskResume(TaskLed_Handler). Esto para
permitir que la tarea Taskblink sea ejecutada correctamente.
d) Al llamar a ejecutar a la tarea TaskBlink, no es necesario adicionar un vTaskDelay( 2000 /
portTICK_PERIOD_MS ) luego de la instrucción vTaskResume(TaskLed_Handler) para permitir
que la tarea Taskblink sea ejecutada correctamente.
2. vasanza
Problema #2: (x%)
Dado el siguiente código usando Free RTOS en Arduino, ¿Cuáles de las siguientes afirmaciones son
correctas?
#include <Arduino_FreeRTOS.h>
unsigned long ADCsensor = 0;
void TaskAnalogRead( void *pvParameters );// Sensor
int Datos1[240]={};
int index=0;
void setup() {
pinMode(A0, INPUT);
xTaskCreate(
TaskAnalogRead
, "AnalogRead"
, 128 // This stack size can be checked & adjusted by reading Highwater
, NULL
, 3 // priority
, NULL );
}
void TaskAnalogRead(void *pvParameters)
{
for (;;){
ADCsensor=0;
for(int j=0;j<60;j++){
ADCsensor += analogRead(A0)*100/1023;// [0% - 100%]
vTaskDelay( 1000 / portTICK_PERIOD_MS );
}
ADCsensor /= 60;
Datos1[index]=ADCsensor;index+=1;
}
}
a) La tarea TaskAnalogRead requiere la instrucción vTaskResume(TaskLed_Handler) para ser
ejecutada. Además, esta tarea permite realizar cada minuto la adquisición del valor promedio de 60
muestras de la entrada analógica A0.
b) La tarea TaskAnalogRead se ejecuta en parallelo con una prioridad alta y no requiere la instrucción
vTaskResume(TaskLed_Handler) para ser ejecutada. Además, esta tarea permite realizar cada
minuto la adquisición del valor promedio de 60 muestras de la entrada analógica A0.
c) La tarea TaskAnalogRead almacena cada minuto un nuevo valor promedio de 60 muestras de la
entrada analógica A0, en el vector Datos1. La capacidad de este vector permite almacenar 4 horas
de datos.
d) La tarea TaskAnalogRead almacena cada minuto un nuevo valor promedio de 60 muestras de la
entrada analógica A0, en el vector Datos1. La capacidad de este vector permite almacenar 240 horas
de datos.
3. vasanza
Problema #3: (x%)
Dado el siguiente código usando Free RTOS en Arduino, ¿Cuáles de las siguientes afirmaciones son
correctas?
#include <Arduino_FreeRTOS.h>
int led_pwm=11;
void TaskRxTrama( void *pvParameters );
int estado =0;
int RXTrama[5];
int TramaS[5] ={0x24,0x31,0x41,0x00,0x54};
int TramaA[5] ={0x24,0x31,0x42,0x00,0x57};
int IdCoordinador =0x36;//'6'
void setup() {
pinMode(led_pwm, OUTPUT);
Serial.begin(9600);
xTaskCreate(
TaskRxTrama
, "Blink" // A name just for humans
, 128 // Stack size
, NULL
,1 // priority
, NULL );
}
void TaskRxTrama(void *pvParameters) // This is a Main task.
{
for (;;){
if(Serial.available()){
if(estado==0 and Serial.read () == 0x24){
RXTrama[estado]=0x24; estado=1;
}else if(estado>0){
RXTrama[estado]=Serial.read ();
estado+=1;
if(estado>4){
estado=0;
if(RXTrama[0]==TramaS[0] and RXTrama[1]==TramaS[1] and RXTrama[2]==TramaS[2]
and RXTrama[3]==TramaS[3]and RXTrama[4]==TramaS[4])
{
Serial.println("Valores en sensor ");
}
if(RXTrama[0]==TramaA[0] and RXTrama[1]==TramaA[1] and
RXTrama[2]==TramaA[2])
{
if(RXTrama[4] == (((RXTrama[0] ^ RXTrama[1]) ^ RXTrama[2]) ^ RXTrama[3])){
Serial.println("Valor PWM en salida");
}
}
}
}
}
}
}
4. vasanza
a) La tarea TaskRxTrama requiere la instrucción vTaskResume(TaskLed_Handler) para ser ejecutada.
Además, esta tarea al recibir por puerto serial la siguiente trama de comunicación serial
“0x24,0x31,0x41,0x00,0x54” imprime por “Valores en sensor”.
b) La tarea TaskRxTrama se ejecuta en parallelo con una prioridad 1 y no requiere la instrucción
requiere la instrucción vTaskResume(TaskLed_Handler) para ser ejecutada. Además, esta tarea al
recibir por puerto serial la siguiente trama de comunicación serial “0x24,0x31,0x41,0x00,0x54”
imprime por “Valores en sensor”.
c) La tarea TaskRxTrama requiere la instrucción vTaskResume(TaskLed_Handler) para ser ejecutada.
Además, esta tarea al recibir por puerto serial la siguiente trama de comunicación serial
“0x24,0x31,0x42,0xFF,0xA8” imprime por “Valor PWM en salida”.
d) La tarea TaskRxTrama se ejecuta en parallelo con una prioridad 1 y no requiere la instrucción
requiere la instrucción vTaskResume(TaskLed_Handler) para ser ejecutada. Además, esta tarea al
recibir por puerto serial la siguiente trama de comunicación serial “0x24,0x31,0x42,0x7F,0x28”
imprime por “Valor PWM en salida”.
e) La tarea TaskRxTrama se ejecuta en parallelo con una prioridad 1 y no requiere la instrucción
requiere la instrucción vTaskResume(TaskLed_Handler) para ser ejecutada. Además, esta tarea al
recibir por puerto serial la siguiente trama de comunicación serial “0x24,0x31,0x41,0x00,0x54”
imprime por “Valor PWM en salida”.
f) La tarea TaskRxTrama se ejecuta en parallelo con una prioridad 1 y no requiere la instrucción
requiere la instrucción vTaskResume(TaskLed_Handler) para ser ejecutada. Además, esta tarea al
recibir por puerto serial la siguiente trama de comunicación serial “0x24,0x31,0x42,0x00,0x57”
imprime por “Valor PWM en salida”.