【问题标题】:Time variable address in LinuxLinux中的时间变量地址
【发布时间】:2016-02-16 23:01:28
【问题描述】:

我有一个项目有点卡住了。我使用 Beaglebones PRU(像一个小微控制器)来读取传感器数据并将其写入内存的定义空间。然后,共享相同 RAM 的主处理器可以读取数据。主处理器运行 Linux。

我想在 PRU 上尽可能精确地为数据加上时间戳。是否可以从 Linux 直接从内存读取到 PRU 上的时间变量(就像我使用“gettimeofday(..)”获得的变量一样)?或者是否有我可以转换的 Systemticks 变量? 我怎样才能以最简单的方式做到这一点?

【问题讨论】:

  • OP 似乎混淆了 Raspberry Pi 和 Beaglebone Black
  • @ThomasDickey,我怀疑 OP 只是拼错了 PRU
  • 这似乎是合理的。
  • 如果您使用 c 进行编程,您可以在 aufather.wordpress.com/2010/09/08/… 看到它为您提供纳秒级精度。对于 linux 命令行,请参阅stackoverflow.com/questions/16548528/…
  • 您是否尝试过查看 PRU 的 IEP 部分(PRU 参考指南中的第 9 章)?它包含一个运行频率为 200 MHz 的 32 位定时器(因此粒度为 5ns)。根据与实际绝对时间相比所需的准确性,您需要某种方式来同步两者。

标签: linux time beagleboneblack


【解决方案1】:

我不知道你是否已经解决了这个问题。

目前我在一个项目中工作,在该项目中我需要使用 PRU 实现特殊的通信协议,并且我需要使用其特定的时间戳存储所有通信传输,以便生成通信报告以验证一切是否已按预期执行。

为了完成这项任务,我使用了 Beaglebone Black RTC 模块。如果您查阅 AM335x 用户参考手册,您可以看到对该模块、其寄存器和精度的完整说明。如果你只需要秒精度,这是它的极限,这个模块非常适合你。如果没有,您可以将其寄存器提供的信息与 IEP 计时器结合起来。第二种选择要在这里解释更多。如果这是您的情况,请告诉我,我会尽力提供分步指南。

要使用 PRU 的 RTC 模块,可以使用 OCP 端口访问它。这是一段代码,您可以使用它从 PRU 访问 RTC 寄存器。然后我将每个值(小时、分钟、秒、年、月、日)存储在 PRU0 RAM 中,以使它们可以从 host.c 程序中读取,并检查我得到的值是否与在 Linux 终端中输入日期相同。

   //************************************************************************
    // Reading RTC from PRU
    //************************************************************************

    // Author     : Pablo Alías Mateos
    // Project    : General
    // Description: 

    //**************************************************************************
    //==========================================================================

    //**************************************************************************
    //==========================================================================

    .origin 0                        
    .entrypoint START                

    //----------------------------------------------------------------------

    #define RTC_BASE_ADDRESS    0x44E3E000   
    #define RTC_SECONDS_OFFSET  0x00000000
    #define RTC_MIN_OFFSET      0x00000004
    #define RTC_HOUR_OFFSET     0x00000008
    #define RTC_DAYS_OFFSET     0x0000000C
    #define RTC_MONTH_OFFSET    0x00000010
    #define RTC_YEAR_OFFSET     0x00000014       

    //---------------------------------------------------------------------- 

    START:

    // Enable the OCP master port

    LBCO r0, c4, 4, 4        // load SYSCFG reg into r0 (use c4 const addr)
    CLR r0, r0, 4        // clear bit 4 (STANDBY_INIT)
    SBCO r0, c4, 4, 4        // store the modified r0 back at the load addr       


    MOV r0, RTC_BASE_ADDRESS
    MOV r1, 0x00000000      // base RAM0

    LBBO    r2,r0,RTC_HOUR_OFFSET,4 
    SBBO    r2,r1,0,4   

    LBBO    r2,r0,RTC_MIN_OFFSET,4  
    SBBO    r2,r1,4,4

    LBBO    r2,r0,RTC_SECONDS_OFFSET,4  
    SBBO    r2,r1,8,4

    LBBO    r2,r0,RTC_DAYS_OFFSET,4 
    SBBO    r2,r1,12,4

    LBBO    r2,r0,RTC_MONTH_OFFSET,4    
    SBBO    r2,r1,16,4

    LBBO    r2,r0,RTC_YEAR_OFFSET,4 
    SBBO    r2,r1,20,4

希望这些信息对您有用,

巴勃罗

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2012-08-07
    • 2017-10-13
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多