Performance 如何在低资源设备上测试算法性能?

Performance 如何在低资源设备上测试算法性能?,performance,algorithm,testing,arduino,attiny,Performance,Algorithm,Testing,Arduino,Attiny,我对使用atmel avr控制器从LIN总线读取数据感兴趣。不幸的是,这种总线上的消息没有开始或结束指示器,唯一合理的解决方案似乎是暴力解析。来自总线的可用数据加载到循环缓冲区中,蛮力方法在缓冲区中查找有效消息 使用64字节缓冲区和20MHZ attiny时,如何测试代码的性能,以确定是否可能发生缓冲区溢出?补充:我担心的是算法会运行缓慢,从而缓冲更多的数据 关于蛮力算法。缓冲区中的第二个元素假定为消息大小。例如,若假定长度为22,则对前21个字节进行异或运算,并针对缓冲区中的第22个字节进行测

我对使用atmel avr控制器从LIN总线读取数据感兴趣。不幸的是,这种总线上的消息没有开始或结束指示器,唯一合理的解决方案似乎是暴力解析。来自总线的可用数据加载到循环缓冲区中,蛮力方法在缓冲区中查找有效消息

使用64字节缓冲区和20MHZ attiny时,如何测试代码的性能,以确定是否可能发生缓冲区溢出?补充:我担心的是算法会运行缓慢,从而缓冲更多的数据


关于蛮力算法。缓冲区中的第二个元素假定为消息大小。例如,若假定长度为22,则对前21个字节进行异或运算,并针对缓冲区中的第22个字节进行测试。如果校验和通过,代码将检查第一个(SRC)和第三个(DST)字节是否是它们应该是的。AVR是最容易进行性能分析的微控制器之一,因为它是一台RISC机器,具有简单的指令集和众所周知的每条指令执行时间

所以,最基本的步骤是,你拿着装配图,开始计算不同的场景。基本寄存器操作需要一个时钟周期,分支通常需要两个周期,内存访问需要三个周期。XORing循环可能需要每个字节5-10个循环,因此它相对便宜。如何掌握汇编代码取决于编译器,但所有编译器都倾向于以合理易读的形式给出最终结果

通常,如果不了解算法和时间要求,就不可能对这类问题给出明确的答案。但是,由于LIN总线速度限制为20 kbit/s,因此每个字节大约有10000个时钟周期。这对几乎任何事情都足够了


一个更困难的问题是如何处理依赖于时间的LIN帧。这不是一个很好的习惯,因为它确实需要微控制器付出额外的努力。(使用第9位到底有什么问题?)

LIN框架由一个

  • 中断(至少13位时间)
  • 同步分隔符(0x55)
  • 消息id(8位)
  • 消息(0..8 x 8位)
  • 校验和(8位)
至少有四种可能的方法及其起伏:

  • (您的回答)从所有可能的起始位置开始,并尝试找出校验汇总消息的位置。一旦同步,这就不需要了。(简单,但返回重影消息的概率为1/256。请记住放弃同步字段。)

  • 使用内部UART并查找同步字段;尝试找出分隔符后面的数据是否有意义。(这比上面的错误概率要低,但需要同步分隔符无故障通过,因此可能会错过消息。)

  • 寻找休息的机会。最简单的方法是给所有到达的字节加上时间戳。很可能不需要以任何方式缓冲传入数据,因为数据速率非常低(最大2000字节/秒)。名义上,帧的最后一个字符的结尾与下一帧的第一个字符的开头之间的距离至少为13位。由于接收一个字符需要10位,因此在接收上一条消息中最后一个字符的结尾和下一条消息的第一个字符的结尾之间的延迟名义上至少为23位。为了允许位定时有一些公差,可以将限制设置为,例如17位。如果“字符接收”中断之间的时间距离超过此限制,则字符属于不同的帧。检测到中断后,可以开始收集新邮件。(这几乎符合官方规范。)

  • 自己一点一点地做。如果从机和主机之间没有良好的同步,则必须使用此方法确定主时钟。实现不是很简单,但有一个例子是:(我并不认为它是万无一失的,它相当简单。)

  • 我会选择3号。为输入数据创建一个中断,每当数据出现时,您都会将当前时间戳(需要计数器)与前一个中断的时间戳进行比较。如果字符间时间过长,则启动新消息,否则追加到旧消息。然后,您可能需要对消息进行双重缓冲(一个是您正在收集的,另一个是您正在分析的),以避免很长的中断例程

    实际实现取决于代码的其他结构。这不需要太多时间


    如果你不能确保你的时钟与moster时钟足够同步(+-4%),那么你就必须看一下#4,它可能更有启发性,但相当乏味。

    你的基本问题是(在我看来):

    如何测试代码的性能,以确定是否可能发生缓冲区溢出


    在算法开始时将管脚设置为高,在算法结束时将其设置为低。在示波器上查看它(我假设您有一个这样的系统——没有它,嵌入式开发非常困难。)您将能够测量算法所需的最大时间,并了解其可变性。

    我不太熟悉LIN总线帧,但我假设它与发送和接收数据的定时控制有关。ATmel为汽车应用提供全方位解决方案,包括微控制器、lin控制器和电压调节器。我们假设lin控制器将处理所有必要的定时,并为微控制器提供cmos级RX/TX。无论如何,感谢您提供的信息和您的答案。请参阅我编辑的答案。有关更完整的说明,请参阅,例如。最困难的问题是您是否需要同步