Como obter uma velocidade de clock da CPU ARM no Linux?

14

Eu tenho uma máquina embarcada baseada em ARM baseada na placa S3C2416. De acordo com as especificações que tenho disponíveis, deve haver um ARM9 de 533 MHz (ARM926EJ-S de acordo com /proc/cpuinfo ), no entanto o software em execução "parece" lento, comparado ao mesmo software no meu telefone Android com CPU ARM de 528MHz .

/proc/cpuinfo me diz que o BogoMIPS é 266.24. Eu sei que não devo confiar no BogoMIPS em relação ao desempenho ("Bogo" = falso), no entanto, gostaria de obter uma medição da velocidade real da CPU. No x86, eu poderia usar a instrução rdtsc para obter o contador de tempo, esperar um segundo (sleep (1)), ler o contador novamente para obter uma aproximação da velocidade da CPU e, de acordo com minha experiência, esse valor era perto o suficiente da velocidade real da CPU.

Como posso encontrar a velocidade real da CPU de um determinado processador ARM?

Atualizar

Eu encontrei esta simples calculadora Pi , que eu compilei para o meu telefone Android e a placa ARM. Os resultados são os seguintes:

S3C2416

# cat /proc/cpuinfo
Processor   : ARM926EJ-S rev 5 (v5l)
BogoMIPS    : 266.24
Features    : swp half fastmult edsp java 
...
#./pi_arm 10000
Calculation of PI using FFT and AGM, ver. LG1.1.2-MP1.5.2a.memsave
...
8.50 sec. (real time)

Android

# cat /proc/cpuinfo
Processor   : ARMv6-compatible processor rev 2 (v6l)
BogoMIPS    : 527.56
Features    : swp half thumb fastmult edsp java 
# ./pi_android 10000
Calculation of PI using FFT and AGM, ver. LG1.1.2-MP1.5.2a.memsave
...
5.95 sec. (real time)

Então, parece que o ARM926EJ-S é mais lento que o meu telefone Android, mas não duas vezes mais lento do que eu esperava pelos números do BogoMIPS. Ainda não tenho certeza sobre a velocidade do clock da CPU ARM9.

    
por MiKy 29.03.2012 / 14:07

4 respostas

4

AFAICT o relógio de um S3C2416 parece com o de um S3C2443, ou processadores similares de sua família. O código-fonte do Linux sugere que há um número de relógios estreitamente relacionados.

Snippet de escolha:

    pll = get_mpll(mpllcon, xtal);
    clk_msysclk.clk.rate = pll;

    fclk = pll / get_fdiv(clkdiv0);
    hclk = s3c2443_prediv_getrate(&clk_prediv);
    hclk /= s3c2443_get_hdiv(clkdiv0);
    pclk = hclk / ((clkdiv0 & S3C2443_CLKDIV0_HALF_PCLK) ? 2 : 1);

    s3c24xx_setup_clocks(fclk, hclk, pclk);

    printk("CPU: MPLL %s %ld.%03ld MHz, cpu %ld.%03ld MHz, mem %ld.%03ld MHz, pclk %ld.%03l MHz\n",
           (mpllcon & S3C2443_PLLCON_OFF) ? "off":"on",
           print_mhz(pll), print_mhz(fclk),
           print_mhz(hclk), print_mhz(pclk));

Atualização do OP

Eu tenho procurado essa saída de dmesg , mas não consegui encontrar nada - a saída dmesg estava repleta de mensagens de depuração e o início estava faltando. Claramente, o buffer de mensagens do kernel era muito curto para conter todas as mensagens até que eu me conectasse por telnet. Colocando /bin/dmesg > /tmp/dmesg.log no início do processo de inicialização, consegui obter essa saída, confirmando o que eu queria saber:

Linux version 2.6.21 (gcc version 4.2.2)
CPU: ARM926EJ-S revision 5 (ARMv5TEJ)
Machine: SMDK2416
...
CPU S3C2416 EVT3
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C2416: mpll on 534.000 MHz, cpu 534.000 MHz, mem 133.500 MHz, pclk 66.750 MHz
    
por 29.03.2012 / 16:02
7

Experimente cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq .

No meu android, lê-se 1113600, então este está em kHz .

    
por 29.03.2012 / 17:21
1

Com o Linux, se você tiver o comando hwinfo , então (como root), execute:% hwinfo --cpu | grep Clock

    
por 29.03.2012 / 16:50
-1

dmidecode é uma pequena ferramenta útil que despeja o que está atualmente na tabela DMI em um formato que você pode ler. Fazer dmidecode | grep "Current Speed" (como root ou com sudo) imprimirá a velocidade da CPU que está sendo reportada no DMI .

    
por 29.03.2012 / 14:32