KansaiRobot
KansaiRobot

Reputation: 10012

Measuring time in IAR (for STM8) of routine called each 100 micro seconds

I am maintaining some code in C for STM8 using IAR Embedded. what is the way to measure execution time between one part of the code and another? (Take into account that if possible I don't want to stop the execution of the code (a la breakpoint) or write to the console (since I found that this affects heavily the timing of the program).

I ve found something like this Techniques for measuring the elapsed time

but this is usually for ARM processors so many of the methods don't apply to my setting. I am thinking something like Technique #3 might be applicable...

Concretely I am asking if I can do something like that technique

unsigned int cnt1 = 0;
unsigned int cnt2 = 0;

    cnt1 = TIM3->CNT;
    func();
    cnt2 = TIM3->CNT; 
    printf("cnt1:%u cnt2:%u diff:%u \n",cnt1,cnt2,cnt2-cnt1);

for this microcontroller

Any help greatly appreciated

Upvotes: 2

Views: 1519

Answers (2)

Felipe Lavratti
Felipe Lavratti

Reputation: 2967

You cannot call printf each 100us in a 8 bit microprocessor, it has no throughput for that. Instead, increment status variables every time anything behaves unexpectedly.

unsigned int cnt1 = 0;
unsigned int cnt2 = 0;

cnt1 = TIM3->CNT;
func();
cnt2 = TIM3->CNT; 
if ((cnt2 - cnt1) > MAX_DURATION_ALLOWED)
    global_error_func_duration ++;

(Make sure TIM3 counts in microseconds)

CLK_PeripheralClockConfig (CLK_PERIPHERAL_TIMER3 , ENABLE);     
TIM3_DeInit();
TIM3_TimeBaseInit(/* Fill these parameters to get 1us counts at your CPU clock */);
TIM3_Cmd(ENABLE); 

Now, you can make a console function to print this variable, so from time to time you can check if even a single loop took more than 10ms.

Late in the development you will want to monitor these status variables to assess the system runtime integrity and take some action in case of misbehavior.

Upvotes: 1

koper89
koper89

Reputation: 655

There's plenty of solutions for that, but simple solution would be using hardware pin and toggling pin in places where you want to start/stop measuring time and using oscilloscope or some cheap logic analyser. Software as someone mentioned have some variable start and end assign current timer tick to them and in debug read them. You could aswell print them using i.e uart in runtime but this would aswell slow them down.

Upvotes: 1

Related Questions