Fundamentos de Sistemas Operativos 2025 PDF
Document Details
Uploaded by GorgeousWilliamsite3777
2025
Tags
Summary
This document contains lecture notes on operating systems.
Full Transcript
Fundamentos de Sistemas Operativos A hierarquia de classes para escrita em ficheiros e em dipositivos de entrada/saída está ilustrada na figura 4.7.2. java.lang.object Manipulação de carateres....
Fundamentos de Sistemas Operativos A hierarquia de classes para escrita em ficheiros e em dipositivos de entrada/saída está ilustrada na figura 4.7.2. java.lang.object Manipulação de carateres. java.io.Writer java.io.BufferedWriter java.io.FilterWriter java.io.OutputStreamWriter java.io.StringWriter java.io.PrintWriter java.io.FileWriter java.io.OutputStream Manipulação de bytes. FileOutputStream ByteArrayOutputStream FilterOutputStream ObjectOutputStream DataOutputStream BufferOutputStream PrintStream 41 Figura 4.7.2 –Hierarquia de classes para Escrita. Fundamentos de Sistemas Operativos Exercício 1: Construa uma classe ListarDiretorias que dispõe dos seguintes métodos: i) void Dir(String pathname) – se o pathname for uma diretoria deve listar todos os ficheiros dentro da diretoria e referir as subdiretorias. Se o pathname for um ficheiro deve listar o ficheiro e a sua dimensão. ii) void Dir() – lista os ficheiros da diretoria corrente; Resolução da alínea 1.i) if (subFicheiro.isDirectory()) System.out.format("%-45s %s \n", ficheiros[i], "[dir]"); public class ListarDiretorias { else File ficheiro; System.out.format("%-50s %-9s %s \n", ficheiros[i], subFicheiro.length(), " bytes"); void Dir(String nome) { } ficheiro = new File(nome); } if (!ficheiro.exists()){ else { // é um ficheiro, mostrar o seu conteúdo System.out.println("O " + ficheiro + " não existe."); BufferedReader leitor= null; return; try { } leitor = new BufferedReader(new FileReader(ficheiro)); if (!ficheiro.canRead()) { } catch (FileNotFoundException e2) {} System.out.println("O " + ficheiro + " não aceita leitura."); String line; return; try { } while ((line = leitor.readLine()) != null) if (ficheiro.isDirectory()) { System.out.println(line); System.out.println("A diretoria " + ficheiro +" contém:"); } catch (IOException e) {} String[] ficheiros = ficheiro.list(); try { for (int i = 0; i < ficheiros.length; i++) { leitor.close(); // concatenar o nome da diretoria ao nome do ficheiro } catch (IOException e) {} File subFicheiro = new File(ficheiro + "\\" + ficheiros[i]); } 1 de 2 } 2 de 2 42 Fundamentos de Sistemas Operativos Exercício2 : Acrescente à classe ListarDiretorias o seguinte método: i) void DirAll(String pathname) – se o pathname for uma diretoria deve listar todos os ficheiros dentro da diretoria e os ficheiros dentro das subdiretorias referindo as subdiretorias. Se o pathname for um ficheiro deve listar apenas o ficheiro e a sua dimensão. Faça a sua resolução da alínea 2.i) dentro das caixas. 1 de 2 2 de 2 43 Fundamentos de Sistemas Operativos 5. Diagramas de atividade e autómatos 5.1. Diagramas de atividade da UML para modelar aplicações multi-processo O desenho de aplicações multi-processo ou multi-tarefa pode ser decomposto em vários níveis. A um nível funcional ou comportamental, o sistema necessita duma descrição ao longo do tempo, podendo para o efeito utilizar os diagramas de estado ou os diagramas de atividade da UML(Unified Modelling Language), a outro nível é necessário uma descrição de sincronização entre os vários processos, podendo para tal, utilizar-se as swimlanes da UML. As vantagens da utilização duma linguagem gráfica são fundamentalmente, a independência da plataforma, da tecnologia, da linguagem de programação. E principalmente, conseguir reunir um conjunto de investigadores, com formações diversas, para discutir o desenho do modelo duma solução para uma aplicação multi-processo. Como não existe uma linguagem gráfica standard para modelar aplicações multi-processo, na disciplina utilizar-se-á a Unified Modelling Language, e em particular os diagramas de actividade, os diagramas de estado e as swimlanes para a modelação deste tipo de aplicações. 5.1.1. Diagramas de atividade adaptados a aplicações multi-processo Apesar dos diagramas de atividade terem sido desenhados inicialmente para representar gráficamente um fluxo de atividades duma aproximação orientada por objectos. No entanto, é possível adaptar os diagramas de atividade à modelação de cada processo duma aplicação multi-processo. Os diagramas de atividade permitem modelar um processo como um conjunto de atividades. Entre duas atividades existe uma seta que representa uma transição condicional ou incondicional e cuja orientação representa o fluxo algorítmico do processo. Uma atividade pode representar operacões, métodos, transferência de objectos entre processos e especificação dos objectos a transferir. 44 Fundamentos de Sistemas Operativos 5.1.2. Atividades Os diagramas de atividade contêm dois tipos de atividade, atividades de ação ou atividades de subatividade. 5.1.2.1. Atividades de Ação As atividades de ação são representados por rectângulos com os vértices redondos, em que no interior da caixa está representada a expressão da ação que indica qual a função da ação. A expressão da ação pode ser escrita em português ou em pseudo-código duma linguagem de programação. Se a expressão da ação for descrita em português deve começar por um verbo seguido da função. Exemplos de estados de ação: ++contador Reta de 10 cm Esperar 5 segundos Não fazer nada Uma atividade de ação obedece às seguintes caraterísticas: Indivisível – todas as operações da atividade são executadas sem transição para outra atividade; Instantâneo – o tempo de execução das operações são insignificantes. Cada diagrama de atividade tem dois símbolos especiais – um símbolo inicial que está ligado à atividade definida como atividade inicial e outro símbolo designado por símbolo final que está ligado à atividade final do diagrama. O símbolo inicial marca o início do fluxo das atividades e o símbolo final representa o fim do fluxo de atividade. A representação destes dois símbolos são os seguintes: Símbolo inicial Símbolo final 45 Fundamentos de Sistemas Operativos 5.1.2.2. Atividade de Subatividades A atividade de subatividades são não–indivisíveis ou divisíveis, significando que podem ser decompostos em duas ou mais atividades de ação ou noutras atividades de subatividades. Estas atividades devem ter um tempo de execução finito. Exemplos de atividade de subatividades: Vaguear Evitar Perseguir 5.1.3. Transição entre estados Quando uma acção ou subatividade termina a sua função existe uma transição automática da atividade atual para outra atividade, representada por uma seta. Existem quatro tipos de transições distintas e que são representadas do seguinte modo: Transição incondicional sem ações Transição incondicional com ações \ação1 \ação2... \açãoN Transição condicional com ações [expressão lógica] \ação1 \ação2... \açãoN Transição condicional sem ações [expressão lógica] 46 Fundamentos de Sistemas Operativos 5.1.4. Exemplo Vamos exemplificar a utilização dos diagramas de atividade na resolução do seguinte problema: Pretende-se modelar através de diagramas de atividade o comportamento de um robot designado por vaguear no espaço livre. O comportamento vaguear consiste no robot mover-se de forma aleatória no espaço livre. O movimento aleatório do robot é definido pela aplicação de comandos sucessivos resultantes da escolha aleatória de cada comando entre os comandos reta(distancia), curvar à direita(raio, ângulo), curvar à esquerda(raio, ângulo) e parar durante um determinado tempo. Um diagrama de atividades para solução do problema será: Escolher aleatoriamente Enviar o comando ao Esperar tempo de um comando robot execução Uma atividade de subatividades pode ser descrita por um ou mais diagramas de atividades até um nível em que todas as atividades destes diagramas sejam atividades de ação. A figura seguinte ilustra uma possível decomposição da atividade “Escolher aleatoriamente um comando”: Gerar número Comando é reta aleatório entre 0 e 3 [número é 0] Gerar distância aleatória entre 5 e 50cm Calcular tempo de execução [número entre 1 e 3] Resolver restantes comandos 47 Fundamentos de Sistemas Operativos 5.1.5. Fork e Join Os diagramas de atividade modelam com simplicidade fluxos concorrentes de acções. Pode-se dividir um fluxo de acções em dois ou mais fluxos paralelos de ações utilizando um fork, e depois pode-se sincronizar estes fluxos paralelos de ações num join. Um fork tem exactamente uma transição como entrada e duas ou mais transições como saídas. Um join tem duas ou mais transições como entrada e exactamente uma transição como saída. A transição de saída só é cumprida quando todas as transições de entrada estiverem executadas, ou seja, quando todos os fluxos concorrentes tiverem terminado a sua actividade. Portanto, um join é um ponto de sincronização entre dois ou mais fluxos concorrentes de acções. No exemplo seguinte apresenta-se um modelo simples de fluxos de acções concorrentes, que permitem modelar uma aplicação multi-comportamental num robot. Estabelecer comunicação Fork [insucesso] A aplicação começa por estabelecer a comunicação com o robot. No caso de haver sucesso no estabelecimento da comunicação com o [sucesso] robot, então lançará três comportamentos, o vaguear, o perseguir e o evitar. Quando estes três comportamentos terminarem a execução então a aplicação finaliza a comunicação com o robot e termina a sua execução. No caso de haver insucesso no estabelecimento da comunicação com o robot a aplicação termina. Vaguear Perseguir Evitar Finalizar Join comunicação 48 Fundamentos de Sistemas Operativos 5.1.6. Swimlanes As swimlanes servem para representar a sincronização e a comunicação de objetos entre tarefas diferentes. Numa dada aplicação, a partição em swimlanes não é única, podendo haver outras possibilidades de partição. Em sistemas distribuídos, as swimlanes também são utilizadas para definir o modelo de distribuição de processos através de diferentes computadores. Na seguinte figura, define-se as swimlanes que representam quatro diagramas de atividade que representam três comportamentos robóticos mais a interface gráfica a manipular pelo utilizador da aplicação. Atividades Vaguear Evitar Perseguir GUI Iniciar Tratar Eventos Vaguear Evitar Perseguir Finalizar 49 Fundamentos de Sistemas Operativos 5.1.7. Fluxo de objectos As atividades podem receber e enviar objectos e até podem modificar o estado dos objectos. Esta transferência de objectos entre as atividades são representadas no seguinte diagrama de swimlanes. Atividades Vaguear Evitar Perseguir GUI Iniciar VaguearButton [True] EvitarButton [True] PerseguirButton Tratar Eventos [True] Vaguear Evitar Perseguir FimVaguear Finalizar [True] FimEvitar [True] FimPerseguir [True] Fundamentos de Sistemas Operativos 5.2. Implementação de um diagrama de atividades com um autómato bloqueante Diagrama de atividades com 3 atividades A estrutura genérica de um autómato bloqueante para implementar um diagrama de atividades com 3 atividades {ATIVIDADE1, ATIVIDADE2, [condiçãoAtividade1ParaAtividade2] ATIVIDADE3} em que todas as atividades estão ligadas a todas as \açãoTransiçãoAtividade1ParaAtividade2 atividades com uma condição é a seguinte: [condiçãoAtividade2ParaAtividade1] Atividade 2 \açãoTransiçãoAtividade2ParaAtividade1 Atividade 1 *1 *2 void AutomatoGenérico() { int estado; [condiçãoAtividade3ParaAtividade1] estado= ATIVIDADE1; \açãoTransiçãoAtividade3ParaAtividade1 while (true) { switch (estado) { [condiçãoAtividade1ParaAtividade3] Atividade 3 case ATIVIDADE1:atividade1(); // ações a efetuar \açãoTransiçãoAtividade1ParaAtividade3 if (condiçãoAtividade1ParaAtividade2){ // condição para a Atividade2 açãoTransiçãoAtividade1ParaAtividade2(); *1 [condiçãoAtividade3ParaAtividade2] estado=ATIVIDADE2; break; \açãoTransiçãoAtividade3ParaAtividade2 } if (condiçãoAtividade1ParaAtividade3){ // condição para a Atividade3 *2 [condiçãoAtividade2ParaAtividade3] açãoTransiçãoAtividade1ParaAtividade3(); \açãoTransiçãoAtividade2ParaAtividade3 estado= ATIVIDADE3; break; } } // continua na próxima folha 51 Fundamentos de Sistemas Operativos case ATIVIDADE2:atividade2(); // actividades a efetuar no estado 2 if (condiçãoAtividade2ParaAtividade1){ // inicio da transição –condição para ir para a ATIVIDADE1 açãoTransiçãoAtividade2ParaAtividade1 (); estado= ATIVIDADE1; break; } if (condiçãoAtividade2ParaAtividade3){ // condição para a ATIVIDADE3 açãoTransiçãoAtividade2ParaAtividade3 (); estado= ATIVIDADE3; break; } case ATIVIDADE3:atividade3(); // actividades a efetuar no estado 3 if (condiçãoAtividade3ParaAtividade1){ // condição para a ATIVIDADE1 açãoTransiçãoAtividadeNParaEAtividade1 (); estado= ATIVIDADE1; break; } if (condiçãoAtividade3ParaAtividade2){ // condição para a ATIVIDADE2 açãoTransiçãoAtividadeNParaAtividade2(); estado= ATIVIDADE2; break; } } // fecho do switch } // fecho do forever } // fecho da função. 52 Fundamentos de Sistemas Operativos 5.3. Implementação de um diagrama de atividades com um autómato não bloqueante A implementação de um diagrama de atividades pode ser realizada por um autómato não bloqueante. A caraterística principal de um autómato não bloqueante é que o tempo de execução é finito, mínimo e limitado à execução das ações de uma atividade. Por exemplo, estes autómatos são adequados à implementação de funções de atendimento de interrupções onde o tempo de execução deve ser o mínimo possível. 5.3.1. Autómato não bloqueante sem estado final Alterando a estrutura genérica do autómato bloqueante apresentado na secção 2., a estrutura equivalente de um autómato não bloqueante sem estado final para implementar um diagrama de atividades com 3 atividades em que todas as atividades estão ligadas a todas as outras atividades através de condições de transição, é a seguinte: int estado; // a variável de estado é global void AutomatoNaoBloqueanteSemEstadoFinal() { switch (estado) { case ATIVIDADE1:atividade1(); // ações a realizar na atividade 1 if (condiçãoAtividade1ParaAtividade2){ açãoTransiçãoAtividade1ParaAtividade2(); estado= ATIVIDADE2; return; } if (condiçãoAtividade1ParaAtividade3){ açãoTransiçãoAtividade1ParaAtividade3(); estado= ATIVIDADE3; } return; // continua na próxima folha 53 53 Fundamentos de Sistemas Operativos case ATIVIDADE2:atividade2(); if (condiçãoAtividade2ParaAtividade1){ açãoTransiçãoAtividade2ParaAtividade1(); estado= ATIVIDADE1; return; } if (condiçãoAtividade2ParaAtividade3){ açãoTransiçãoAtividade2ParaAtividade3 (); estado= ATIVIDADE3; return; } return; case ATIVIDADE3:atividade3(); // ações a realizar no estado 3 if (condiçãoAtividade3ParaAtividade1){ açãoTransiçãoAtividade3ParaAtividade1 (); estado= ATIVIDADE1; return; } if (condiçãoAtividade3ParaAtividade2){ açãoTransiçãoAtividade3ParaAtividade2(); estado= ATIVIDADE2; return; } return; } // fecho do switch } // fecho da função. 54 54 Fundamentos de Sistemas Operativos 5.3.2. Autómato não bloqueante com estado final A estrutura genérica de um autómato não bloqueante com estado terminal de atividade difere do autómato não bloqueante sem estado terminal, porque passa a ser uma função que retorna a informação acerca se terminou ou não a atividade. Por exemplo, considere um diagrama de atividades com 2 atividades completamente ligadas, no qual uma das atividades é final, a estrutura deste autómato é a seguinte: int estado; // a variável de estado é global boolean AutomatoNaoBloqueanteComEstadoFinal() { switch (estado) { case ATIVIDADE1: atividade1(); if (condiçãoParaAtividadeFinal){ // inicio da transição do Estado1– teste da condição para ir para o Estado2 açãoTransiçãoAtividade1ParaAtividadeFinal(); estado=ATIVIDADE_FINAL; } return false; case ATIVIDADE_FINAL: atividadeFinal(); // actividades a efetuar no estado final if (condiçãoParaAtividade1){ // inicio da transição do Estado1– teste da condição para ir para o Estado2 açãoTransiçãoAtividadeFinalParaAtividade1(); estado=ATIVIDADE1; return false; } return true; } // fecho do switch } // fecho da função. 55 55 Fundamentos de Sistemas Operativos Anexo 1: Robot Lego NXT - Mindstorms O robot lego-mindstorms tem uma estrutura modelar, mas a configuração a usar tem duas rodas de tração independentes na frente e uma roda independente e livre na traseira. O robot suporta até 4 sensores e pode ter 3 atuadores podendo ser ligado a um computador através duma ligação USB ou através duma ligação wireless de bluetooth, tal como o ilustrado na figura 1. Computador USB 1 2 3 4 entradas C Saídas Visor B Sensores Atuadores A Figura 1: Estrutura do robot Lego NXT Mindstorms Modelo Computador-Robot O modelo robot-computador está ilustrado na figura 2 e é um modelo utilizado em robots que interagem com humanos e com o mundo. O robot devido à sua limitada capacidade de autonomia das baterias tem uma potência de processamento e memória limitadas integrando apenas algum tipo de inteligência básica à sua sobrevivência e impossibilitando a integração de toda a sua inteligência no robot. Assim, o robot é um escravo do computador tendo autonomia para ações muito básicas de sobrevivência. E o computador funciona como o “cérebro” do robot, comandando remotamente através de bluetooth sempre os seus movimentos e interação com o mundo exterior. Bluetooth Computador – ”Cérebro do robot” Tempo mínimo é 100ms 56 Robot – “Escravo com funções básicas” Figura 2: Modelo computador-robot Fundamentos de Sistemas Operativos O principal problema do modelo computador-robot da figura 2 é que o cérebro do robot sente ou “vê” o mundo que o rodeia com um atraso equivalente ao tempo da comunicação bluetooth. Por outras palavras, o cérebro sente o mundo não no tempo presente mas num tempo passado. Este problema pode ser minimizado com técnicas de predição em tempo real nas ações. Comandos de comunicação do Robot NXT Comunicação Descrição Exemplo boolean OpenNXT(String nomeRobot) Estabelece o canal de comunicação entre o If (OpenNXT(“Guia1”)) {} computador e o robot com o nome passado no parâmetro de entrada do método. O método retorna Ou, true em caso de sucesso. static final String robot= “Guia2”; If (OpenNXT(robot)) {} void CloseNXT() Fecha o canal de comunicação. CloseNXT() Cada robot é identificado por um nome que aparece na primeira linha do visor do robot. Todos os robots têm nomes diferentes. Depois de uma chamada ao método OpenNXT com sucesso, a ligação wireless bluetooth computador-robot fica estabelecida e a partir daqui, o programa em Java está em condições de enviar comandos de controlo para o robot. Para finalizar uma sessão de comunicação deve sempre de chamar o método CloseNXT. Se por qualquer razão o canal de comunicação bluetooth for aberto e não for fechado, apesar do programa Java terminar, o canal de comunicação permanecerá ocupado. Portanto, qualquer tentativa de nova abertura do canal irá dar erro devido à comunicação wireless bluetooth seguir o modelo ponto a ponto. 57 Fundamentos de Sistemas Operativos Comandos de movimento do Robot NXT Movimento Descrição Exemplo void Reta(int distancia) O robot descreve uma linha reta com a distância dada no // anda em frente 12 cm parâmetro “distancia” em centímetros Se o valor da Reta(12); distância for positivo o robot anda em frente, se o valor da // move para trás 19 cm distância for negativa o robot anda para trás. Reta(-19); void CurvarEsquerda(int raio, int O robot curva para a esquerda com o raio dado em // curva à esquerda com raio angulo) centímetros e segundo um dado ângulo em graus. // de 19cm e um angulo de 90 graus CurvarEsquerda(19, 90); void CurvarDireita(int raio, int O robot curva para a direita com o raio dado em // curva à direita com um raio angulo) centímetros e segundo um dado ângulo em graus. // de 38cm e um ângulo de 45 graus CurvarDireita(38, 45); void Parar(boolean assincrono) Pára o robot imediatamente quando o parâmetro de // Pára o robot após o último comando entrada“assincrono” for true. Caso seja false, só pára o Parar(false); robot depois dos outros comandos terem sido executados. // Pára imediatamente o robot Parar(true); void AjustarVMD(int offset) Ajusta a velocidade do motor direito de um valor de // Ajusta de +1 a velocidade do velocidade definido em “offset” para que o robot ande a // motor direito direito quando cumpre o comando Reta(). AjustarVMD(1); void AjustarVME(int offset) Ajusta a velocidade do motor direito de um valor de // Ajusta de -2 a velocidade do velocidade definido em “offset” para que o robot ande a // motor esquerdo direito quando cumpre o comando Reta(). AjustarVME(-2); void SetVelocidade(int O robot move-se a 50% da sua velocidade máxima. O valor // definir o robot para movimentar à percentagem) do parâmetro “percentagem” pertence a [-100, 100]% da velocidade máxima velocidade máxima. O movimento seguinte é cumprido à SetVelocidade(100); 58 velocidade definida por este comando. Fundamentos de Sistemas Operativos 1. Reta(12); Exemplos de operabilidade USB USB 1 2 3 4 1 2 3 4 C Visor 12 cm C Visor B B A A 2. Reta(-19); 1 2 3 4 1 2 3 4 A A 19 cm Visor Visor B B C C USB USB 3. CurvarDireita(19,90); 4. CurvarEsquerda(16,45); 45 graus 90 graus 16 cm 19 cm 59 Fundamentos de Sistemas Operativos Robot NXT – Comandos dos sensores Sensores Descrição Exemplo int SensorToque(int input) Devolve o valor do sensor de toque [0, 1] que // ler o sensor de toque que está está ligado è entrada “input”. Devolve 0 se não // ligado ao porto de entrada 4 houver toque e devolve 1 se houver toque. int bater= SensorToque(S_4); O parâmetro de entrada “input” pode tomar os seguintes valores constantes: S_1, S_2, S_3 ou S_4 int SensorUS(int input) Devolve um valor de distância na gama [0, // ler a distância do sensor que está 255] centímetros através da utilização do // ligado ao porto 2 sensor de ultrasons que está ligado ao parâmetro “input”. int distancia= SensorUs(S_2); O parâmetro de entrada “input” pode tomar os seguintes valores constantes: S_1, S_2, S_3 ou S_4 60 Fundamentos de Sistemas Operativos Anexo 2: Robot Lego EV3 - Mindstorms O robot lego-mindstorms tem uma estrutura modelar, mas a configuração a usar tem duas rodas de tração independentes na frente e esfera na traseira. O robot suporta até 4 sensores e pode ter 4 atuadores podendo ser ligado a um computador através duma ligação USB ou através duma ligação wireless de bluetooth, tal como o ilustrado na figura 1. Computador USB 1 2 3 4 entradas Visor D Sensores Saídas C Atuadores B A Figura 1: Estrutura do robot Lego EV3 Mindstorms Modelo Computador-Robot O modelo robot-computador está ilustrado na figura 2 e é um modelo utilizado em robots que interagem com humanos e com o mundo. O robot devido à sua limitada capacidade de autonomia das baterias tem uma potência de processamento e memória limitadas integrando apenas algum tipo de inteligência básica à sua sobrevivência e impossibilitando a integração de toda a sua inteligência no robot. Assim, o robot é um escravo do computador tendo autonomia para ações muito básicas de sobrevivência. E o computador funciona como o “cérebro” do robot, comandando remotamente através de bluetooth sempre os seus movimentos e interação com o mundo exterior. Bluetooth Computador – ”Cérebro do robot” Tempo mínimo é 100ms 61 Robot – “Escravo com funções básicas” Figura 2: Modelo computador-robot Fundamentos de Sistemas Operativos Robot EV3 – Comandos de comunicação Comandos de Descrição Exemplo comunicação boolean OpenEV3(String name) Estabelece o canal de comunicação entre o robot e o If (OpenEV3(“EV1”)) {} computador. O método retorna o valor true em caso de sucesso no estabelecimento da ligação entre o Ou, robot e o computador. O método retorna false quando a conexão falha. A falha da conexão pode ter vários String robot= new String(“EV1”); motivos, o robot não estar emparelhado, o robot estar If (OpenEV3(robot)) {} desligado, o nome do robot não ser o correto, etc. void CloseEV3() Encerra o canal de comunicação. CloseEV3() Depois do estabelecimento com sucesso do canal de comunicação, o método OpenEV3() devolve true, o programa fica em condições para enviar outros comandos para o robot. O fecho do canal de comunicação é realizado pelo método CloseEV3(). Por qualquer razão se o programa estabelecer o canal de comunicação e não o fechar então o programa poderá não voltar a conseguir abrir o canal de comunicação com sucesso porque o robot recusará a nova ligação porque “pensa” que ainda está ligado ao anterior canal de comunicação. A solução é desligar e voltar a ligar o robot. 12/11/2024 62 Fundamentos de Sistemas Operativos Robot EV3 – Comandos de movimento Motores Descrição Exemplo void Reta(int distancia) O robot descreve uma linha reta com a distância dada no // anda em frente 12 cm parâmetro “distancia” em centímetros Se o valor da Reta(12); distância for positivo o robot anda em frente, se o valor da // move para trás 19 cm distância for negativa o robot anda para trás. Reta(-19); void CurvarEsquerda(float raio, int O robot curva para a esquerda com o raio dado em // curva à esquerda com um raio angulo) centímetros e segundo um dado ângulo em graus. // de 19cm e um angulo de 90 graus CurvarEsquerda(19, 90); void CurvarDireita(float raio, int O robot curva para a direita com o raio dado em // curva à direita com um raio angulo) centímetros e segundo um dado ângulo em graus. // de 38cm e um ângulo de 45 graus CurvarDireita(38, 45); void Parar(boolean assincrono) Pára o robot imediatamente quando o parâmetro de // Pára o robot após o último comando entrada“assincrono” for true. Caso seja false, só pára o Parar(false); robot depois dos outros comandos terem sido executados. // Pára imediatamente o robot Parar(true); void SetVelocidade(int O robot desloca-se normalmente a uma velocidade de 50% // 75% da velocidade máxima percentagem) da velocidade máxima. Com este comando pode alterar a SetVelocidade(75); velocidade do robot, dando um valor para o parâmetro “percentagem” entre [-100, 100]. Os comandos de movimento seguintes cumprem-se à nova velocidade. 63 Fundamentos de Sistemas Operativos 1. Reta(12); Exemplos de operabilidade USB USB 1 2 3 4 1 2 3 4 C Visor 12 cm C Visor B B A A 2. Reta(-19); 1 2 3 4 1 2 3 4 A A 19 cm Visor Visor B B C C USB USB 3. CurvarDireita(19,90); 4. CurvarEsquerda(16,45); 45 graus 90 graus 16 cm 19 cm 64 Fundamentos de Sistemas Operativos Robot EV3 – Comandos dos sensores Sensores Descrição Exemplo float SensorAngulo(int sensor) Devolve o valor de um angulo em graus. float angulo= SensorAngulo(S_4); Quando o robot roda no sentido contrário aos ponteiros do relógio o angulo diminui. Quando roda no sentido dos ponteiros do relógio o angulo aumenta. int SensorToque(int sensor) Devolve o valor 0 quando o sensor está int toque=SensorToque(S_1) desativo ou não pressionado, e 1 quando o sensor está ativo ou pressionado. float SensorUS(int sensor) Devolve um valor entre 0 e 255 cm float distancia; correspondente à distância do sensor a um distancia=SensorUS(S_2); objeto. O valor 255 corresponde à não deteção de objeto. float SensorLuz(int sensor) Devolve um valor entre 0 e 100 float luminosidade= SensorLuz(S_3); correspondente à intensidade luminosa refletida. O parâmetro sensor dos métodos pode ter os valores: S_1, S_2, S_3 e S_4. 12/11/2024 65 Fundamentos de Sistemas Operativos Bibliografia aconselhada para a disciplina Brooks R., Cambrian Intelligence The Early History of the New AI, MIT Press, 1999. Silberchatz A., Galvin P., Gagne G., Operating System Concepts with Java, John Wiley & Sons, 2009. Marques J., Ferreira P., Sistemas Operativos, ISBN: 978-972-722-575-5, 2009. Marques J. A., Guedes P., Fundamentos de Sistemas Operativos, Editorial Presença, 1990. Lister A. M., Os Sistemas Operativos, Editorial Presença, 1986. 66