Jump to content
Notícia
  • News ticker sample
  • News ticker sample

Search the Community

Showing results for tags 'tempo real'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Anunciantes
    • Advertise here
    • silvaBR Cheats
    • Astaroth Medium
  • ################## WEB CHEATS ##################
  • Anúncios/Eventos
    • Regras
    • Anúncios
    • Eventos do fórum
  • Feedback & Suporte
    • Tutoriais WC
    • Suporte
    • Sugestões
    • Denúncias e Reclamações
    • Depósito
  • WebCheats Premium
    • Trackers & Warez
    • Download
    • Cracking & Serviços Pagos
    • MarketPlace
    • Conteúdo Adulto
    • Taverna WebCheats Premium
    • WebCheats Premium - Lixeira
  • Shooter Zone
  • RPG/MOBA Zone
  • Outros Games Zone
  • Design Zone
  • Info Zone
  • Video Games Zone
  • ################## WEB CHEATS ##################
  • Entretenimento & Diversão
  • 【FREE FIRE】▄︻┻┳═一's Fórum do Clube
  • teste's Tópicos

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Discord


Idade

 
or  

Found 2 results

  1. Sistemas Operacionais de Tempo Real - Introdução Introdução Quando se fala em projetos para microcontroladores, especialmente os de 8 ou 16 bits, sempre surgem dúvidas com relação ao sistema operacional. É melhor comprar um sistema operacional ou desenvolver o seu próprio? Como tudo na nossa vida, a resposta a essa pergunta depende sempre da relação custo / benefício da solução. Muitos projetistas se sentem intimidados em projetar o seu próprio sistema, muitas vezes apenas por falta de experiência ou de conhecimento sobre esse assunto. Por outro lado, aprender a usar um sistema operacional de terceiros pode ser um tanto quanto trabalhoso e demorado. Se o sistema não for de uso gratuito, ainda será necessário pagar royalties para cada CPU que executar esse programa. Neste artigo vou desenvolver alguns raciocínios que mostrarão o fato de que desenvolver um sistema operacional próprio para microcontroladores de 8 ou 16 bits é bem mais simples do que possa parecer. Será apresentada uma estrutura bastante intuitiva e simples de como organizar o seu software de forma que ele opere em tempo real com segurança. Antes disso, precisamos conceituar alguns tópicos. Observe que o assunto sobre Sistemas Operacionais é abordado neste artigo de uma forma muito superficial. Sistemas Operacionais e Sistemas de Tempo Real são temas bastante extensos e complexos e são ensinados em cursos de graduação e pós-graduação. Neste artigo vamos apresentar somente o necessário para compreender a filosofia e preparar o terreno para apresentar em artigos futuros algumas soluções padronizadas para se implementar sistemas de tempo real. O que é um Sistema Operacional? Segundo uma definição encontrada na Wikipedia, um Sistema Operacional é um programa ou um conjunto de programas cuja função é gerenciar os recursos do sistema (definir qual programa recebe atenção do processador, gerenciar memória, criar um sistema de arquivos, etc.), fornecendo uma interface entre o computador e o usuário. Embora possa ser executado imediatamente após a máquina ser ligada, a maioria dos computadores pessoais de hoje o executa através de outro programa armazenado em uma memória não-volátil do tipo ROM (Read Only Memory) chamado BIOS (Basic Input Output System) num processo chamado bootstrapping, conceito em inglês usado para designar processos auto-sustentáveis, ou seja, capazes de prosseguirem sem ajuda externa. Após executar testes e iniciar os componentes da máquina (monitores, discos, etc), o BIOS procura pelo sistema operacional em alguma unidade de armazenamento, geralmente o Disco Rígido, e a partir daí, o sistema operacional toma o controle da máquina. O sistema operacional reveza sua execução com a de outros programas, como se estivesse vigiando, controlando e orquestrando todo o processo computacional. Segundo alguns autores, existem dois modos distintos de conceituar um sistema operacional: visão top-down pela perspectiva do usuário ou programador: é uma abstração do hardware, fazendo o papel de intermediário entre o software (programas) e os componentes físicos do computador, o (hardware); ou numa visão bottom-up, de baixo para cima: é um gerenciador de recursos, i.e., que controla quais aplicações (processos) podem ser executadas, quando devem ser executadas e quais recursos (memória, disco, periféricos) podem ser utilizados. Alguns sistemas operacionais populares são: Windows, Linux, Mac OS, Android, etc. O que é um Sistema Operacional de Tempo Real? Sistemas operacionais de tempo real ou RTOS (Real Time Operating Systems) são uma categoria especial de sistemas operacionais. Eles são voltados para aplicações onde é essencial a confiabilidade e a execução de tarefas em prazos compatíveis com a ocorrência de eventos externos. Por exemplo, se num paciente de UTI ocorrer uma variação importante nos batimentos cardíacos, o monitor cardíaco desse paciente deve ativar um alarme em poucos segundos. Outro exemplo: se um avião em voo com o piloto automático desviar da rota, o controle do avião deve corrigir imediatamente essa rota retornando o avião à rota original. Tempo real é um termo que pode ter significados muito diferentes, dependendo da velocidade da ocorrência dos eventos de um sistema e dos tempos de resposta necessários para atender a esses eventos. Há sistemas que podem levar um tempo muito longo para modificar o seu estado. Em geral os processos térmicos de aquecimento são lentos. Pode levar dias ou até semanas para esses processos responderem a determinados estímulos. Nesse caso em particular, um sistema operacional comum serviria perfeitamente para realizar o controle do processo. Particularidades de um Sistema Operacional de Tempo Real Há muitos detalhes num Sistema Operacional de Tempo Real que merecem ser apresentados. O principal é que as rotinas de processamento em geral são bastante especializadas e curtas, pois devem executar a sua tarefa no menor tempo possível. Há um forte paralelismo na execução das atividades e um estabelecimento de prioridades, onde as atividades mais prioritárias interrompem as menos prioritárias e assumem o controle do processador. A divisão de tarefas em rotinas especializadas requer que haja alguma forma de sincronismo ou troca de informação entre elas, por exemplo, para que seja informado que tarefa já foi concluída ou não por outra rotina. Algumas estruturas comuns para a troca de informações: Semáforos ou flags: são definidos bits ou palavras para a sinalização do tipo booleano ( binário 0 ou 1) para a troca de mensagens entre duas rotinas; Áreas de troca de mensagens, filas ou buffers: memórias temporárias que com auxílio dos semáforos permitem a transferência de estruturas de dados maiores entre as rotinas. Exemplos Para ilustrar as diversas arquiteturas de tempo real, serão apresentados dois exemplos bastante simplificados. Exemplo 1 Suponhamos que um programa de computador deseje realizar a transmissão de uma mensagem pela USB. Num sistema comum, ilustrando de uma maneira simplificada, esse programa monta a mensagem e chama a rotina para a transmissão e só são retomadas as próximas atividades após o término da transmissão. Esse tipo de programação é conhecida como programação linear. No caso de um sistema de tempo real (veja a Figura 1) a sequência de operações pode ser assim: Figura 1: Transmissão de caracteres em tempo real simplificada Para melhor entendimento ficará convencionado que: flag "buffer vazio" = 1, significa que não há dados no buffer temporário; flag "buffer vazio" = 0, significa que há dados novos no buffer temporário. Programa principal: O programa principal inicialmente testa se o buffer temporário está disponível ou vazio (flag "buffer vazio" = 1); Se estiver vazio, monta a mensagem numa estrutura temporária (buffer); Dispara a transmissão do conteúdo do buffer temporário alterando o flag "buffer vazio" para "não está vazio" (flag "buffer vazio" = 0); Continua a execução das outras atividades enquanto é realizada a transmissão. Rotina de Transmissão: Fica dormente ou então testa periodicamente o flag "buffer vazio"; Se o flag "buffer vazio" indicar que há dados novos (flag "buffer vazio" = 0), transfere os dados do buffer temporário para o buffer de transmissão; Altera o flag de "buffer vazio" sinalizando que o buffer está disponível para novos dados (flag "buffer vazio" = 1); Transmite os caracteres, um de cada vez, até transmitir o último; Sinaliza que "Terminou a transmissão" (flag). Observe que em geral a rotina de transmissão é programada para ser ativada por interrupção, de forma que ela não gaste ciclos de máquina enquanto espera o término de transmissão de um caracter. Assim é aproveitado o hardware do microcontrolador para realizar tarefas em paralelo com o programa principal. Exemplo 2 Esse exemplo é baseado num projeto real. Trata-se de uma placa mezanino cuja função é processar simultaneamente os dados referentes a 4 canais telefônicos em tempo real de forma a implementar as seguintes funções: Cancelamento de resíduo de voz na linha de recepção resultante do eco da "fala" gerada pela placa mãe sem distorcer os sinais de origem externa; Pré-processar os sinais de entrada identificando pulsos decádicos telefônicos através de filtragens e outros processamentos; Implementação parcial de call-progress, focando na detecção do tom de "ocupado" e de "linha". O sistema operacional de tempo real para esse caso foi projetado em camadas, com prioridades atribuídas decrescentes nas camadas conforme vai crescendo o índice da camada. O fluxo de dados tem taxas decrescentes das camadas inferiores para as superiores. Veja na Figura 2. Observe que a comunicação entre as camadas é realizada através de filas ou bufferscirculares, dimensionados de forma que num regime de atendimento simultâneo de quatro linhas telefônicas, o fluxo médio de dados nunca provoque o "estouro" dessas filas. A cada buffer estão associados ponteiros de início e final da fila ("primeira livre") e uma variável indicando o número de dados que estão na fila. O mecanismo convencionado para a operação das filas circulares é o seguinte: Quem transfere um dado para a fila, incrementa o número de elementos e o ponteiro para o final; Quem retira da fila, decrementa o número de elementos e incrementa o ponteiro de início. Figura 2: Diagrama da arquitetura do programa em camadas Uma descrição resumida do que ocorre em cada camada: CAMADA 0 Trata basicamente dos eventos gerados externamente ao programa. Há eventos assíncronos gerados pela placa-mãe e outros síncronos gerados por temporizadores de hardware. Esses eventos são: Chegada de mensagem enviada pela placa-mãe. Essa mensagem é inserida na fila de entrada de mensagens, que será tratada pela CAMADA 1; Interrupção de hardware com frequência de 10 Hz para a atualização dos estados de cada linha telefônica; Interrupção de hardware com frequência de 8 kHz onde são lidos os dados das 4 linhas telefônicas, e é realizada a decodificação dos dados recebidos; é aplicada uma rotina de cancelamento de eco com filtragem digital adaptativa; o sinal filtrado segue por 3 caminhos: é utilizado como sinal de erro para cálculo do ajuste dos coeficientes do filtro adaptativo; é transferido para a fila que alimenta a CAMADA 1. (Taxa de 8.000 amostras/s); é novamente codificado e retorna à placa-mãe. CAMADA 1 Realiza o loop principal do programa com funções de pré-processamento dos sinais entregues pela CAMADA 0 na fila de dados e o tratamento das mensagens vindas e que são endereçadas à placa-mãe. A CAMADA 0 é composta pelo encadeamento das seguintes rotinas: Tratamento dos dados provenientes das linhas telefônicas: Realiza o processamento e a análise de duas linhas por vez gerando uma saída para a CAMADA 2. A taxa máxima desses dados para a CAMADA 2 é de 170 amostras/s; Realiza um pré-processamento de dados analisando simultaneamente as 4 linhas e gera para a CAMADA 2 um fluxo de dados de 400 amostras/s endereçada ao detetor de pulsos decádicos. Também repassa uma mensagem para a placa mãe quando a CAMADA 2 detectar um pulso; Descarta dados das filas e atualiza os ponteiros. [*]Chamada das rotinas que compõem a CAMADA 2. CAMADA 2 Realiza a análise dos dados gerados na CAMADA 1 e gera as saídas endereçadas à CAMADA 1 ou à placa-mãe. É composta pelas rotinas: Realiza a análise dos dados para detecção de pulsos decádicos. Gera mensagens endereçadas à placa-mãe; Realiza a identificação dos tons de "ocupado" e de linha e sinaliza por meio de mensagens à placa-mãe. Nesse exemplo o software foi dividido em camadas com prioridades decrescentes para conseguir acomodar todas as funções previstas para o mezanino no curto tempo disponível para a sua execução. Esse projeto funcionou e ficou em operação por pelo menos 10 anos. O que é Firmware? Para completar esse trabalho é interessante conceituar Firmware. Transcrevendo mais uma vez uma definição apresentada pela Wikipedia: Em eletrônica e computação, firmware é o conjunto de instruções operacionais programadas diretamente no hardware de um equipamento eletrônico. É armazenado permanentemente num circuito integrado (chip) de memória de hardware, como uma ROM, PROM, EPROM ou ainda EEPROM e memória flash, no momento da fabricação do componente. Muitos aparelhos simples possuem firmware, entre eles: controles-remotos, calculadora de mão, algumas partes do computador, como disco rígido, teclado, cartão de memória, unidades USB's muitos instrumentos científicos e robôs. Outros aparelhos mais complexos como celulares, câmeras digitais, sintetizadores, entre outros, também possuem um firmware para a execução de suas tarefas. Não há fronteiras rígidas entre firmware e software, pois ambos são termos descritivos bastante livres. Contudo, o termo firmware foi originalmente inventado para contrastar com software de alto nível que poderia ser alterado sem a troca de um componente de hardware, e o firmware está normalmente envolvido com operações muito básicas de baixo nível das quais sem um dispositivo seria completamente não-funcional. Nos próximos artigos serão apresentadas rotinas padronizadas para utilização em sistemas de tempo real. Nesses artigos serão utilizados diversos conceitos expostos aqui. Resumo Sistemas Operacionais de Tempo Real têm uma filosofia muito peculiar na sua arquitetura. Os programas são organizados de forma a poder responder a estímulos externos ou internos num tempo curto o suficiente e compatível com a importância ou urgência do evento que gerou esses estímulos. Frequentemente esses sistemas operacionais estão intimamente ligados ao hardware de um sistema. Fonte: https://www.embarcados.com.br/sistemas-operacionais-de-tempo-real-rtos/
  2. Bom pessoal, vou ser breve e objetivo aqui. Tava ali conversando com o pessoal no chat e surgiu a ideia lá de fazer algum tipo de mini-game no chat, mais avançado do que o comando /roll que gera um numero de 1 a 6. Não tenho acesso ao codigo do forum aqui nem ao banco de dados, então resolvi fazer um chat do zero com a ideia que dei: duelo valendo coins. Eu fiz o chat seguindo o getstarted do socket.io em NodeJS. Nada demais. Apenas acrescentei alguns comandos: /roll - joga um dado com valor de 1 a 6 /name <nome_novo> - altera o nome do usuario /duel <user_id> <coins> - aposta com um usuário uma quantidade de coins. O usuário começa sem nome, e por default eu dou nome de anonimo. Eu também dou inicialmente um valor de 5000 coins para apostar. Nada demais, um chat em tempo real com esse joguinho de apostar coins. Requerimentos - Instalar o NodeJS (https://nodejs.org/en/) Iniciando o Servidor Vamos instalar as dependencias do package.json. Abra seu terminal/CMD e digite: npm install Agora vamos iniciar o servidor: node app.js Para ver o jogo rodando acesse: localhost:3000 Segue abaixo o código de toda estrutura. Jogue tudo numa mesma pasta. [HIDE-THANKS] package.json { "name": "chat-wc", "version": "0.0.1", "description": "chat com roll e duelo", "dependencies": { "express": "^4.15.2", "socket.io": "^2.0.3" } } app.js var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); function user_exist(user_id){ var socket_id = false; for (user in LIST_USERS){ if (LIST_USERS[user].uid == user_id){ socket_id = LIST_USERS[user].id; } } return socket_id } var LIST_USERS = {} io.on('connection', function(socket){ LIST_USERS[socket.id] = socket; LIST_USERS[socket.id]['uid'] = Math.floor(Math.random() * 9999) + 1; LIST_USERS[socket.id]['coins'] = 5000; LIST_USERS[socket.id].emit('chat message', "Bem vindo! Comandos disponiveis /roll, /name <novo nome>, /duel <user_id> <coins>"); socket.on('chat message', function(msg){ if(msg == '/roll'){ var dice = Math.floor(Math.random() * 6) + 1; io.emit('chat message', "(id:" + LIST_USERS[socket.id].uid + ") " + (LIST_USERS[socket.id].name || "Anonimo") + " jogou um dado..." + dice.toString()); } else if(msg.includes('/name')){ var old_name = LIST_USERS[socket.id].name || "Anonimo"; var name = msg.replace('/name', '').trim(); LIST_USERS[socket.id].name = name; io.emit('chat message', "(id:" + LIST_USERS[socket.id].uid + ") " + old_name + " mudou de nome para " + "(" + LIST_USERS[socket.id].uid + ") " + LIST_USERS[socket.id].name) } else if (msg.includes('/duel')){ msg_splited = msg.split(' '); var user_id = Number(msg_splited[1]); var coins = Number(msg_splited[2]); if (!isNaN(user_id) && !isNaN(coins)){ var user_socket_id = user_exist(user_id); if(user_socket_id){ if (coins <= LIST_USERS[socket.id].coins){ var dice_you = Math.floor(Math.random() * 6) + 1; var dice_other_user = Math.floor(Math.random() * 6) + 1; io.emit('chat message', "(id:" + LIST_USERS[socket.id].uid + ") " + (LIST_USERS[socket.id].name || "Anonimo") + " [ " + dice_you + " ] -- vs -- [ " + dice_other_user + " ] " + "(" + LIST_USERS[user_socket_id].id + ") " + (LIST_USERS[user_socket_id].name || "Anonimo")); if (dice_you > dice_other_user){ var restcoins = LIST_USERS[user_socket_id].coins - coins; if (restcoins >= 0){ LIST_USERS[user_socket_id].coins = restcoins; } else{ LIST_USERS[user_socket_id].coins = 0; } LIST_USERS[socket.id].coins += coins; LIST_USERS[socket.id].emit('chat message', "Voce ganhou " + coins + " coins") LIST_USERS[user_socket_id].emit('chat message', "Voce perdeu " + coins + " coins") } else if(dice_other_user > dice_you) { LIST_USERS[socket.id].coins -= coins; LIST_USERS[user_socket_id].coins += coins; LIST_USERS[user_socket_id].emit('chat message', "Voce ganhou " + coins + " coins") LIST_USERS[socket.id].emit('chat message', "Voce perdeu " + coins + " coins") } else { LIST_USERS[socket.id].emit('chat message', "Empatou!") LIST_USERS[user_socket_id].emit('chat message', "Empatou!") } } else { LIST_USERS[socket.id].emit('chat message', 'Voce nao tem saldo o suficiente para essa aposta') } } else { LIST_USERS[socket.id].emit('chat message', 'Usuário inexistente') } } else { LIST_USERS[socket.id].emit('chat message', 'Exemplo de comando: /duel joao 1000') } } else { io.emit('chat message', "(id:" + LIST_USERS[socket.id].uid + ") " + (LIST_USERS[socket.id].name || "Anonimo") + " <" + LIST_USERS[socket.id].coins +" coins>" + ": " + msg); } }); socket.on('disconnect', function(){ console.log('user disconnected'); delete LIST_USERS[socket.id]; }); }); http.listen(3000, function(){ console.log('Chat iniciado na porta *:3000'); }); index.html <!doctype html> <html> <head> <title>Chat WC - Duelo Coins</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font: 13px Helvetica, Arial; } form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; } form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; } form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages li { padding: 5px 10px; } #messages li:nth-child(odd) { background: #eee; } </style> </head> <body> <ul id="messages"></ul> <form action=""> <input id="m" autocomplete="off" /><button>Send</button> </form> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> <script src="https://code.jquery.com/jquery-1.11.1.js"></script> <script> $(function () { var socket = io(); $('form').submit(function(){ socket.emit('chat message', $('#m').val()); $('#m').val(''); return false; }); socket.on('chat message', function(msg){ $('#messages').prepend($('<li>').text(msg)); }); }); </script> </body> </html> [/HIDE-THANKS] Obs.: As mensagens estão sendo adicionadas sempre em cima, para quem não entendeu. Para mudar isso, troca no index.html o .prepend para .append. Também terá que adicionar um overflow-y: auto; para conseguir rolar as mensagens. Enfim, customizações ficam por conta de vocês :D abs
×
×
  • Create New...