【发布时间】: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