Moderadores: 51, guest2003, Renie, gpenga
tcpipchip escreveu:Tem cache de código no stm32f429 ?
RobL escreveu:Cache?
Não sei quantos ciclos têm um desvio incondicional no ARM CM3 ou CM4 e quantos ciclos têm um XOR. Para não procurar no manual vou usar outro micro.
Um exemplo no AVR fica simples de entender pois cada clock executa um ciclo de instrução.
Sei de cabeça que para um AVR, um xor 1 ciclo e um desvio incondicional “true” 2 ciclos.
Lembro que após o XOR executará um desvio incondicional e novamente o XOR ...
Portanto, para um clock de 20Mhz o primeiro código (com um só XOR) vai mudar o estado da saída a cada 3 ciclos ( 1XOR+2 Incondicional) . O período terá 6 ciclos e portanto F= 20Mhz/6ciclos = 3,3Mhz, na porta.
Para o código com dez XOR, haverá 1 ciclo para cada mudança na porta e só no final do loop um desvio incondicional de 2 ciclos. Se medido por um osciloscópio, com preço para os mortais, ele vai mostrar graficamente no display a assimetria(corretamente) no momento do desvio incondicional, mas o cálculo apresentado da frequência no display será de F= 20Mhz/2ciclos= 10Mhz !!!
Isto por que no momento do desvio incondicional, o scope inicia um novo cálculo devido a variação (aumento) do tempo para 1+2 ciclos (1 do xor e 2 do desvio) e ao final desse ciclo o scope percebe nova assimetria, caindo novamente para 1 ciclo (dos xor) . Aguarda alguns ciclos simétricos para recalcular a frequência. O resultado será novamente 10Mhz.
Concluímos que com um só XOR e um desvio incondicional torna a operação simétrica. Com a sequência de dez XOR aumentará a frequência, neste trecho, mas ao gerar o desvio incondicional gera uma assimetria.
O aumento da frequência se deu devido aos dez XOR com 1 ciclo, comparado ao primeiro código onde cada transição leva 3 ciclos.
No ARM Cortex3 ou 4 acontecerá da mesma forma, o desvio incondicional poderá ter 1 ciclo ou 1+P ciclos.
Suponho não ter nada de cache influenciando esse aumento da frequência.
Minha consulta no site ARM para tirar essa dúvida:
ARM M0 a M4 não tem cache são para propósitos gerais. Exemplo com cache: ARM940 ou SARM946E-S o número 4 na sequencia numérica significa cache.
msamsoniuk escreveu:essas discussoes sobre performance de GPIO sao divertidas, mas profundamente improdutivas. depois de anos e anos acompanhando esse tipo de coisa, a unica conclusao logica que eu observo eh "nunca tente fazer em software o que vc DEVE fazer em hardware". primeiro que eh um grande desperdicio de recursos computacionais: bem lembro de um computador cujo refresh de video era feita por software e isso consumia 75% da performance do processador, sobrando livre apenas os 25% referentes ao retraco vertical. era algo aceitavel na epoca, em que as pessoas usavam o computador como um brinquedo e se maravilhavam com qualquer porcaria e nao davam muito valor para o dinheiro, mas hoje em dia seria tao inaceitavel quanto encontrar uma promocao do mercado "pague 4 e leve 1". segundo que a medida que os processadores ficam mais complexos, eles ficam menos deterministicos. entao calcular tempo via software comeca a ficar complicado: vc pode ateh usar um timer ou sinal de trigger para calibrar o tempo, mas fatidicamente vai ter um certo jitter para responder. terceiro e ultimo eh que querer fazer tudo por software em pleno seculo XXI eh, no minimo, personificar um senhor da inquisicao. lah na decada de 70 ateh seria justificavel, visto que o hardware era todo discreto e complexo, mas hoje em dia nao parece existir justificativa: todo fabricante embute uma boa quantidade de hardware integrado, variando de timers a canais de DMA, de modo que o software fique restrito a tarefas de controle e gerenciamento. em tempo, fazer as coisas por software nao eh pecado, mas fazer vista grossa para o hardware que esta disponivel certamente beira a burrice!
solucao simples para o problema de performance de GPIO: DMA + FIFO. via DMA vc transfere dados com mais performance do que usando o processador, inclusive deixando o processador livre para outras tarefas de controle. embora a banda de memoria seja dividida, as transferencias via DMA possuem menos overhead. literalmente, o controlador de DMA eh um memcpy() codificado em hardware, onde toda a parte "chata" de incrementar ponteiros, decrementar contador, testar, etc eh feita pelo hardware, em paralelo e sem intervencao do processador. o problema eh que o DMA eh um canhao: para otimizar os acessos, eh interessante fazer as transferencias em burst (blocos). e como ele divide espaco com o processador, esta sujeito a um certo jitter referente a esse compartilhamento. entao uma FIFO resolve os dois problemas: recebe as transferencias em burst e ajusta para a velocidade nominal que vc quer ter no GPIO. ao mesmo tempo, limpa o jitter que o compartilhamento de barramento injeta nas transferencias. o resultado eh seu GPIO transferindo dados continuamente, de forma brutalmente veloz e precisa. sobre a FIFO, tem que considerar o periferico: alguns jah possuem FIFOs integradas. entao ao inves de despejar tudo em um GPIO, eventualmente, pode optar por um componente externo mais especializado que jah possui FIFO. por exemplo, ao inves de conectar um ADC diretamente no GPIO e puxar o DMA diretamente, um ADC com FIFO e bus pode ser uma opcao melhor, pq essa FIFO integrada jah absorve os problemas de jitter que o DMA vai ter. e se o bus for mais largo que os dados efetivos (bus de 32 bits para um ADC de 8 bits, por exemplo), vc multiplica a performance (no exemplo, 4x).
Fervolt escreveu:Caro msamsoniuk, concordo com o que você escreveu exceto um ponto, de que essas discussões são "profundamente improdutivas'. Acredito que todos querem fazer seus projetos da melhor forma e o mais eficiente possível.
Eu postei essa dúvida, pois fiquei meio desapontado com os resultados de um simples teste, porque um microcontrolador que tem seu núcleo rodando a 72MHz entrega só 3,2MHz num pino? claro que não pensei que saísse algo próximo do clock, mas achei que é muito pouco.
Esse tópico me agregou informações interessantes, como o caso do "cache", que eu desconhecia até então.
Essa questão de programar microcontroladores eu tenho como hobby, apesar de conseguir fazer algumas coisas aqui, não tenho vivência.
Agradeço a todos que responderam.
De fato, o que eu consegui fazer até agora está de acordo com o que você recomendou, estou terminando um gerador de vídeo para testes de monitores de máquinas e estou usando timers com interrupção para gerar os sinais de sincronismo horizontal e vertical e o sinal de vídeo é gerado usando DMA + SPI. A performance é excelente não consome quase nada de processamento, esse meu projeto tem como base o do link https://www.artekit.eu/vga-output-using-a-36-pin-stm32/ sendo que o que coloquei a mais foi a possibilidade de poder ajustar as frequências de varredura através de um LCD 320x240 e um encoder rotativo.
A conversão dos sinais de vídeo resolvi deixar quieto por enquanto.
Valeu!
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante