element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Avnet Boards Forums
  • Products
  • Dev Tools
  • Avnet Boards Community
  • Avnet Boards Forums
  • More
  • Cancel
Avnet Boards Forums
Avnet Boards General Using a timer when running a C program as 'bare metal'
  • Forum
  • Documents
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Avnet Boards Forums to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Not Answered
  • Replies 13 replies
  • Subscribers 337 subscribers
  • Views 2931 views
  • Users 0 members are here
Related

Using a timer when running a C program as 'bare metal'

Former Member
Former Member over 12 years ago

Hi,

I'm trying to run a benchmark-like algoritm on the zedboard using the SDK (like the helloWorld program in the labs here on ZedBoard.org).

My poblem is that when i'm trying to get the time,
startTime = ftime(&tmb);
I get an error that ftime cannot be found.

Is there an commonly used way to get the time?

Thanks for answers :)

Anders Viken

  • Sign in to reply
  • Cancel
  • jamestkennedy
    0 jamestkennedy over 12 years ago

    one way is to use the axi_timer IP. you must add this to your design using XPS. In SDK when you creste the BPS you should get the scutimer_v1_02_a library under ps7_cortexlibsrc.

    in your app source:

    #include "xil_types.h"
    #include "xtmrctr.h"
    #include "xparameters.h"

    The API you want to use:

    tunsigned int time1, time2, cum_time;

         Status = XTmrCtr_Initialize(&TmrCtrInstancePtr, XPAR_AXI_TIMER_0_DEVICE_ID);
         if (Status != XST_SUCCESS)
         {
             return;
         }


    t time1 = XTmrCtr_GetValue(&TmrCtrInstancePtr, 0);
    t XTmrCtr_Start(&TmrCtrInstancePtr, 0);

    // your process

    t XTmrCtr_Stop(&TmrCtrInstancePtr, 0);
    t time2 = XTmrCtr_GetValue(&TmrCtrInstancePtr, 0);

    This gives you clock ticks, so if your clock tick is 10 ns, divide by 100 to get us.

    i found that i had to reinitialize the timer for each measurement. i would be interested if you figure out why.

    hope this helps.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    I followed your instructions, but it seems like xtmrctr.h can't be found in the directory. What do you suggest to do here?

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • jamestkennedy
    0 jamestkennedy over 12 years ago

    do you have tmrctr_v_2_04_a in your BSP ps7_cortexa9_1libsrc?
    did you add an axi_timer in XPS and then redo the BSP for the modified HW?
    I think you should get the library in BSP.
    What libraries do you get?
    scutimer but nor timrctr? i got both but maybe i did somehting different.
    we'll get this sorted out -- no worries!

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    Hi, thanks again for your reply. Got all the include files worked out now :)

    But when I try to run the program, it "stops" after checkpoint 3 (see code). The program doesn't terminate, but it uses several minutes with nothing happening.

    The code has no errors or warnings. When I start the program I get the message: "FPGA configuration is not done on the target. Do you still want to continue launching application?"

    Do you have any idea what I might do here?

    Again thanks for your answers, much appreciated :)

    Anders Viken



    Code:
    #include "xil_types.h"
    #include "xtmrctr.h"
    #include "xparameters.h"
    #include<stdio.h>

    int main()
    {
    tprintf("Checkpoint 1
    ");
    tXTmrCtr TmrCtrInstancePtr;

    tprintf("Checkpoint 2
    ");
    tunsigned int startTime, endTime, usedTime;

    tprintf("Checkpoint 3
    ");
    tXStatus Status = XTmrCtr_Initialize(&TmrCtrInstancePtr, XPAR_AXI_TIMER_0_DEVICE_ID);

    tprintf("Checkpoint 4
    ");
    tif (Status != XST_SUCCESS)
    t{
    ttprintf("Problem with timer initialization. Exiting.
    ");
    ttreturn 1;
    t}

    tprintf("Checkpoint 5
    ");
    tstartTime = XTmrCtr_GetValue(&TmrCtrInstancePtr, 0);

    tprintf("Checkpoint 6
    ");
    tXTmrCtr_Start(&TmrCtrInstancePtr, 0);

    t// the process
    tprintf("Hello World
    ");

    tXTmrCtr_Stop(&TmrCtrInstancePtr, 0);
    tendTime = XTmrCtr_GetValue(&TmrCtrInstancePtr, 0);

    tusedTime = endTime - startTime;

    tprintf("Number of ticks used: %d
    ", usedTime);


        return 0;

    }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago in reply to Former Member

    As far as the FPGA configuration, I can help you there. First, make sure the hardware server is running (Xilinx Tools->Launch Hardware Server) and then select Xilinx Tools->Program FPGA. You'll have to select a bitstream. Zynqgeek's Hello_world walkthrough can show you how to get that if you don't have one. That should get rid of that error.

    When I run your code, it goes from checkpoint 1 to 2 to 3 then repeats main from the beginning. Apparently the XTmrCtr_Initialize function (at checkpoint 3) isn't acting as you think it is/should. I'm interested in getting this working too so I'll also be working on it.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago

    I found where the problem is, but I'm not sure how to fix it...

    In the XTmfCtr_Initialize() function, theres a for loop:

    for (TmrCtrNumber = 0; TmrCtrNumber < XTC_DEVICE_TIMER_COUNT;
    t     TmrCtrNumber++) {
    tt/*
    tt * Read the current register contents and check if the timer
    tt * counter is started and running, note that the register read
    tt * is not using the base address in the instance so this is not
    tt * destructive if the timer counter is already started
    tt */
    ttStatusReg = XTmrCtr_ReadReg(TmrCtrConfigPtr->BaseAddress,
    ttttt       TmrCtrNumber, XTC_TCSR_OFFSET);
    ttif (StatusReg & XTC_CSR_ENABLE_TMR_MASK) {
    tttprintf("********** Timer %d already started **********

    ", TmrCtrNumber);
    tttreturn XST_DEVICE_IS_STARTED;
    tt}
    t}

    The description is "Check each of the timer counters of the device, if any are already running, then the device should not be initialized. This allows the user to stop the device and reinitialize, but prevents a user from inadvertently initializing."

    Within this loop, I think there's an interrupt being fired, which is resetting something, and causing the program to go to the top of main(). I'm not sure how to overcome this, as it continues to happen during ever iteration. Could it be another timer that's firing the interrupt? I'll continue to look into this.

    (If the code above doesn't format nicely, I'll repost it)

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago in reply to Former Member

    I tried installing the 14.5 xilinx package. then the program worked as intended :)

    I have no idea why...

    Anders Viken

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • jamestkennedy
    0 jamestkennedy over 12 years ago in reply to Former Member

    do you get the printf message?
    It sounds more like it is transferring execution to something uninitialized -- bad code. i think somehow your timer is not instantiated properly from the hw configuration.
    what is the deviceid? if you only have one timer -- it should be 0. i hardcoded 0 in subsequent calls -- not good practice. but the deviceid passed to the function, XPAR_AXI_TIMER_0_DEVICE_ID was 0 in my xparamters.h file. if you passed something else, it could be reading some inadvertant location causing erratic behavior.
    good luck.
    freertos has timers that i have not used, so does the scutimer library.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • jamestkennedy
    0 jamestkennedy over 12 years ago in reply to Former Member

    good for you. i am just installing 14.4.
    and keeping 14.2 around for the speedway course makes 3. this is too much space on my SSD!

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 12 years ago in reply to jamestkennedy

    I also use XPAR_AXI_TIMER_0_DEVICE_ID (which is a macro, defined as 0 in xparameters.h). It never gets to the printf statement. I'm not sure what's going on... I'll try freeRTOS or scutimer... Or maybe just reinstall v14.5

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
>
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube