【问题标题】:Same inputs and instructions but different delays, how?相同的输入和指令但不同的延迟,如何?
【发布时间】:2018-08-04 13:26:17
【问题描述】:

对于 TI Tiva Launchpad,我编写了一个 C 代码,它从 GPIO 获取两个数字作为输入,然后将这两个数字相加并输出结果。然后,我将一个 FPGA 板连接到 Tiva 启动板并给出两个数字,以便将它们相乘并输出结果。我以 4ns 的精度计算输出和输入之间的时间差(传播延迟)。延迟以微秒为单位,因此 4ns 精度很好。然而,尽管我在每次测试中给出相同的输入模式,但每次测试的结果延迟都不同。代码就是这样,并且肯定可以准确地找到所有输入的结果。

int main(void) {

unsigned int z = 0;
unsigned char flag = 66, temp, select, num1, num2, res;
unsigned char num1Mem, num2Mem, num1MemOld, num2MemOld;
unsigned char resOld = 0;
unsigned int numOfOps = 0;
//Setup Clock, PORTC and RGB LEDs
SysCtlClockSet(SYSCTL_SYSDIV_8|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);            //Select input
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); //Inp 1 (num1)
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); //Inp 2 (num2)

GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);           //LEDs
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);//Out LS 4 bit
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//Out MS 4 bit


GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_4);                       //Push Buttons
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);

select = 0;

while(1){


    num1    = (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)  & 0xF0) >> 4;
    num2    = (GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3)  & 0x0F);

    num1Mem = num1;
    num2Mem = num2;

    res = num1 * num2;
    break;


    GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, res);
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, res);


    if(res == 0)
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02);
    else if(res < 16)
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x04);
    else if(res > 15)
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x08);

}

return 0;  }

例如,我将输入从 (0,0) 更改为 (3,5),结果输出从 0 更改为 15。我这样做了几次,每次延迟都略有不同。我认为在不同实例执行的所有指令必须完全相同,因此延迟(即周期数)必须相同但实际情况不同。为什么?是否有可能或者我可以肯定地得出结论,我的延迟结果不可能是真的?

【问题讨论】:

  • kkrambo 涵盖了答案...有了循环中的代码量,只需再添加几行代码,有一个计数器并将 lsbit 写入 gpio 引脚,看看范围上。任何类型的代码中的任何更改都可以改变循环速度,但这将给出循环时间的粗略估计。与从读取操作数到写入结果的时间相比,循环时间与您更相关(除非您使循环只这样做)。去检查你正在使用的 GPIO 库函数中发生了什么。您可以通过删除一些代码来减少循环时间。
  • 请注意,这些处理器的执行不一定是确定性的,管道很小,因此可能会产生影响,但不同的 cortex-ms 具有不同的提取大小,32 位或 16 位。如果 32 则对齐可能会花费您或为您节省额外的获取时钟周期。如果您有缓存效果,可能会有缓存效果。基本上一旦编译而不修改执行应该是确定性的,但是在任何地方添加任何代码,并且其他代码可以改变其执行时间,具体取决于。

标签: c embedded delay cpu-cycles


【解决方案1】:

您似乎没有做任何事情来同步输入更改与执行 while 循环的位置。如果您在 while 循环读取输入之前更改输入,则输出将相对快速地更改。但是,如果您在 while 循环读取输入后立即更改输入,则 while 循环必须完成当前迭代并循环回到开头并再次读取输入,然后才能看到输出更改。因此,您测量的延迟可能会因执行一次 while 循环所需的时间而异。

【讨论】:

  • 谢谢,是的,你是对的,但还有另一个大问题,因为我在 Tiva C 的输出中遇到了故障,尽管输出必须保持相同的值。我怀疑电线连接,因为我使用跨接电缆。并且可能是它们无法与引脚完全接触或金属接触不够精确。我不知道。
猜你喜欢
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多