【问题标题】:Speed up executable program Linux - arm processor. Bit Toggling加速可执行程序Linux - arm 处理器。位切换
【发布时间】:2014-05-27 00:46:27
【问题描述】:

我正在运行引导到终端的 linux(无 gui)。 我有一块带有 ArmV7 处理器的 ZyBo 电路板。我写了一个 C 程序来在 PMOD 上输出一个时钟和一个相应的数据序列。 PMOD 的开关速度高达 50MHz。但是,我的程序创建的时钟只有 115 Hz 的最大频率。我需要这个程序尽可能快地输出,因为我使用的 PMOD 能够达到 50MHz。 我使用以下代码行编译了我的程序: gcc -ofast (c_program)

#include <stdio.h>
#include <stdlib.h>

#define ARRAYSIZE 511
//________________________________________

//macro for the SIGNAL PMOD
//________________________________________
//DATA 
//ZYBO Use Pin JE1
#define INIT_SIGNAL system("echo 54 > /sys/class/gpio/export"); system("echo out > /sys/class/gpio/gpio54/direction");
#define SIGNAL_ON system("echo 1 > /sys/class/gpio/gpio54/value");
#define SIGNAL_OFF system("echo 0 > /sys/class/gpio/gpio54/value");
//________________________________________

//macro for the "CLOCK" PMOD
//________________________________________
//CLOCK 
//ZYBO Use Pin JE4
#define INIT_MYCLOCK system("echo 57 > /sys/class/gpio/export"); system("echo out > /sys/class/gpio/gpio57/direction");
#define MYCLOCK_ON system("echo 1 > /sys/class/gpio/gpio57/value");
#define MYCLOCK_OFF system("echo 0 > /sys/class/gpio/gpio57/value");

int main(void){

int myarray[ARRAYSIZE] = {//hard coded array for signal data
    1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,0,1,0,0,1,1,1,0,0,1,1,1,0,1,1,1,1,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,0,0,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,1,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,1,0,1,1,0,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,1,1,1,0,1,1,1,0,0,1,1,1,0,1,0,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,0,0,1,0,1,1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,0,0,1,0,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,1,0,0,1,0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0
    };

INIT_SIGNAL
INIT_MYCLOCK;
//infinite loop
int i;
do{
    i = 0;
    do{
        /*
        1020 is chosen because it is twice the size needed allowing for the changes in the clock.
        (511= 0-510, 510*2= 1020 ==> 0-1020 needed, so 1021 it is)
        */
        if((i%2)==0)
        {
            MYCLOCK_ON;
            if(myarray[i/2] == 1){
                SIGNAL_ON;
            }else{
                SIGNAL_OFF;
            }
        }
        else if((i%2)==1)
        {
            MYCLOCK_OFF;
            //dont need to change the signal since it will just stay at whatever it was.
        }
        ++i;
    } while(i < 1021);
} while(1);
return 0;
}

如何使我的可执行程序输出至少达到兆赫兹的量级?

【问题讨论】:

  • 没有看到您的代码并了解您要完成的工作,没有人可以帮助您。从糟糕的编码到基本的硬件限制,可能出现的问题数量巨大。你需要做一些分析来弄清楚为什么代码这么慢。
  • 已添加C代码
  • 我认为这不是硬件限制,因为我认为 ArmV7 处理器的 cpu 速度约为 600MHz,而我使用的 PMOD 可以处理高达约 50MHz 的输出。如果我可以让我的数据信号和我的假时钟跟随我 ZyBo 板上的时钟(或创建一个派生时钟),那就太好了。我很确定这是一些 linux 配置或知道如何访问我的 c 代码中的某些内容,例如系统时钟
  • 我不知道你在做什么,但每一个system 调用都会带来巨大的开销。
  • 我正在做一个涉及信号处理的项目,我正在使用 ZyBo 板来做这件事。该阵列基本上是一个硬编码信号,将在 pmod 上的一个引脚上输出,以便由它将连接到的其他电路进行操作。我正在使用“系统”调用来告诉系统将 1 伏或 0 伏输出到板上的一个引脚上(代表数据信号和时钟信号。一个引脚用于数据,另一个用于时钟)。这是我知道告诉系统输出电压的唯一方法。非常感谢您的帮助。谢谢

标签: c linux embedded toggle executable


【解决方案1】:

您正试图通过使用system 函数(即创建一个进程)来调用另一个可执行文件(/bin/echo)来控制您的时钟,以将值写入/sys 文件系统中的伪文件。难怪您无法达到数百赫兹以上的速率。

您至少应该通过直接打开它们并从程序中写入它们来写入/sys 文件系统中的伪文件,而不是通过system。这可能无法让您进入 MHz 范围,但它的运行速度肯定会比您现有的速度快数百倍。

【讨论】:

  • @vanjoe d'oh...在 Windoze 和 Linux 之间来回切换太多
  • systemexecve /bin/sh 将使用其内部 echo 然后你有 waitpid。所以在这些时间级别上绝对不是一次微不足道的往返。
【解决方案2】:

直接使用FILE * fopen ( const char * filename, const char * mode );打开文件并使用int fprintf ( FILE * stream, const char * format, ... );将你的字符串打印出来

http://www.cplusplus.com/reference/cstdio/fopen/

http://www.cplusplus.com/reference/cstdio/fprintf/

如果您需要更快的速度,请查看 open() 系统调用和 mmap()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2015-07-19
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多