Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.01 KB | None | 0 0
  1. /*
  2. 1621100004
  3. Jozias Martini Dequi
  4. */
  5.  
  6. #include "FreeRTOS_AVR.h"
  7. #include "basic_io_avr.h"
  8.  
  9. #define PENSANDO 0
  10. #define FAMINTO 1
  11. #define COMENDO 2
  12.  
  13. uint8_t filosofoEstado[5] = {0, 0, 0, 0, 0}; //Vetor de estados
  14. uint8_t filosofoPosicao[5] = {0, 1, 2, 3, 4}; //Vetor de filósofo
  15. uint8_t rodizioControle[5]= {0, 0, 0, 0, 0}; //Controle das vezes que comeu
  16. uint8_t mutexValor = 1; //Mutex
  17.  
  18. const TickType_t tresSegundos = 3000 / portTICK_PERIOD_MS; //Três segundos de delay/processar
  19. QueueHandle_t filosofoFila[5], mutexFila, garfoFila; //Declaração das filas
  20.  
  21. void filosofoTarefa(void *pvParameters);
  22. void garfoTarefa(void *pvParameters);
  23. void imprimeTarefa(uint8_t i);
  24. void controleTarefa(uint8_t i);
  25.  
  26. void setup() {
  27. Serial.begin(9600);
  28. uint8_t i;
  29. mutexFila = xQueueCreate(1, sizeof(uint8_t)); //Cria e atribui a fila do mutex
  30. garfoFila = xQueueCreate(1, sizeof(uint8_t)); //Cria e atribui a fila do garfo
  31.  
  32. for(i = 0; i < 5; i++){ //Cria a tribui a fila do filósofo
  33. filosofoFila[i] = xQueueCreate(1, sizeof(uint8_t));
  34. if(!filosofoFila[i]){
  35. while(1); //Rodando...
  36. }
  37. }
  38.  
  39. if(!mutexFila || !garfoFila || !filosofoFila) { //Verifica se foram criados
  40. while(1){}; //Rodando...
  41. }
  42.  
  43. // Tarefas de filósofos e tarefa do garfo
  44. xTaskCreate(filosofoTarefa, "Fil", 130, filosofoPosicao[0], 1, NULL);
  45. xTaskCreate(filosofoTarefa, "Fil", 130, filosofoPosicao[1], 1, NULL);
  46. xTaskCreate(filosofoTarefa, "Fil", 130, filosofoPosicao[2], 1, NULL);
  47. xTaskCreate(filosofoTarefa, "Fil", 130, filosofoPosicao[3], 1, NULL);
  48. xTaskCreate(filosofoTarefa, "Fil", 130, filosofoPosicao[4], 1, NULL);
  49. xTaskCreate(garfoTarefa, "Garfo", 100, NULL, 2, NULL);
  50.  
  51. vPrintString("As tarefas foram criadas.\n"); //Sinaliza que deu tudo certo
  52. vTaskStartScheduler(); //Inicia o escalonador
  53. //while(1){}; //Rodando...
  54. }
  55.  
  56. void filosofoTarefa (void *pvParameters) {
  57. const uint8_t id = (uint8_t *)pvParameters;
  58.  
  59. vTaskDelay(tresSegundos); //Delay de tresSegundos. Não necessário, mas ordena melhor para a visualização.
  60. imprimeTarefa(id); //Impressão e delay.
  61.  
  62. while(1) {
  63.  
  64. xQueueSend(mutexFila, &mutexValor, portMAX_DELAY); //Envia o mutexValor para mutexFila, gerando uma fila de mutex com filósofos famintos, pra depois enviar para os garfos
  65. filosofoEstado[id] = FAMINTO; //Altera o estado de todos os filósofos que acordam de PENSANDO (0) para FAMINTO (1)
  66. imprimeTarefa(id); //Impressão e delay.
  67.  
  68. controleTarefa(id); //Controle de rodízio (antes de enviar para a fila do garfo, ! ÁREA CRÍTICA !)
  69.  
  70. xQueueSend(garfoFila, &id, portMAX_DELAY); //Envia o id para garfoFila, se ainda não comeu
  71. xQueueReceive(mutexFila, &mutexValor, portMAX_DELAY); //Retira o valor de mutexFila
  72. xQueueReceive(filosofoFila[id], &mutexValor, portMAX_DELAY); //Retira o valor de filosofoFila
  73. imprimeTarefa(id); //Impressão e delay.
  74.  
  75. xQueueSend(mutexFila, &mutexValor, portMAX_DELAY);
  76. filosofoEstado[id] = PENSANDO; //Coloca novamente como pensando
  77. imprimeTarefa(id); //Impressão e delay.
  78.  
  79. xQueueSend(garfoFila, &filosofoPosicao[((id + 5 - 1) % 5)], portMAX_DELAY); // ((id + 5 - 1) % 5) Testa se a esquerda do 'id' está comendo
  80. xQueueSend(garfoFila, &filosofoPosicao[((id + 1) % 5)], portMAX_DELAY); // ((id + 5) % 5) Testa se a direita do 'id' está comendo
  81. xQueueReceive(mutexFila, &mutexValor, portMAX_DELAY); //Assim, ele escolhe qual recolocar no mutexFila, caso contrário, os filósofos começam a repetir
  82. }
  83. }
  84.  
  85. void garfoTarefa (void *pvParameters) {
  86. uint8_t id; //Id = posição do filósofo
  87. while(1){
  88. xQueueReceive(garfoFila, &id, portMAX_DELAY); //Retira da fila do garfo
  89.  
  90. if (filosofoEstado[id] == FAMINTO) {
  91. if (filosofoEstado[((id + 5 - 1) % 5)] != COMENDO && filosofoEstado[((id + 1) % 5)] != COMENDO) { //Se esquerda e direita de 'id' não estão comendo
  92. filosofoEstado[id] = COMENDO; //Pega o garfo, sinaliza COMENDO (0) no vetor de estados
  93. rodizioControle[id] += 1; //Contador
  94. xQueueSend(filosofoFila[id], &mutexValor, portMAX_DELAY); //Envia para a fila dos filósofos pra sinalizar que está comendo
  95. }
  96. }
  97. }
  98. }
  99.  
  100. void imprimeTarefa (uint8_t i) { //Imprime o estado e número do filósofo
  101. if (filosofoEstado[i] == PENSANDO) {
  102. vPrintStringAndNumber("Pensando", filosofoPosicao[i]);
  103. }
  104. else if (filosofoEstado[i] == FAMINTO) {
  105. vPrintStringAndNumber("Faminto", filosofoPosicao[i]);
  106. }
  107. else{
  108. vPrintStringAndNumber("Comendo", filosofoPosicao[i]);
  109. }
  110. vTaskDelay(tresSegundos); //Delay de tresSegundos.
  111. }
  112.  
  113. void controleTarefa (uint8_t i) { //Faz o controle do rodízio
  114. uint8_t j = 0, k = 0;
  115.  
  116. while(j < 5) {
  117. if(rodizioControle[j] == 0) { //Se não comeu, tudo bem
  118. vTaskDelay(tresSegundos);
  119. break;
  120. }
  121. if(j == 4) { //Se chegou no último (todos estão com 1 no controle), todos comeram, e ele zera o contador
  122. while(k < 5) {
  123. rodizioControle[k] = 0;
  124. k++;
  125. }
  126. }
  127. j++;
  128. }
  129. }
  130.  
  131. void loop() {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement