Hey! I am working on Streamline Performance Analyzer for Bare Metal Support.
Generated Barman files (Linear RAM Buffer) for cortex - R7 with 7 PMU counters, compiled them separately with armcc to create a library file.
My project code is also compiling with armcc and to enable the frame pointer, I have used --use_frame_pointer instead of --fno-fomit-frame-pointer as it is used for armclang.
The readings for PMU counters are visible in the timeline view, but the function view, call path view and code view are not showing function names rather only one function row with unknown_code_in_unresolved giving the complete 100% to its execution.
I am using ultimate version for DS-5.v5.28.1 for streamline.
Compiling my code on a different platform. Executing the .axf generated (after compiling) on my target and storing the buffer generated into a .raw file.
Does anyone know what is it that I am doing wrong?
Attached are the function and call path views image.
Hi Anudhi,Thank you for getting in touch. Would it be possible to know the steps that you went through when you generated the barman.c and the barman.h files? As well as where you are putting your instrumentation in your code. The more information we know about your system the better.At the moment the worrying things are that you are only collecting 1 sample for the whole system. Is this expected or another system of your issue?A few more questions that will help us diagnose your issue:How are you sampling are you calling barman_sample_counters or barman_sample_counters_with_program_counter?What arguments do you pass your sampling function?Does you .axf file have symbols?When setting up barman.c and barman.h what did you set your max mmap layout records to?One final thing: If you are using DS-5 Ultimate with a licence you are entitled support and you may get a quicker resolution using those support channels.Hope this helps,Stephen
Hi Stephen,
Thank you for your response. I figured out what I was doing wrong and I could now see some profiling data visible in the code view and Function view with function names but it still does not list the data of all the functions.
I still have few questions based on my implementation:
For generating barman files, I have followed the same steps as shown in the video you mentioned. Linear RAM Buffer with Number of tasks as 258-> Cortex R7 -> Selected 7 PMU counters -> NO Custom Counters -> Generated.
For instrumentation, I have created a new implementation file, where I am calling the initialize function and passing the buffer, buffer length (2MB), Clock Info, and Task Info.
For interrupts, I have created a periodic timer of 200 micro seconds and in the timer handler I am calling the API - barman_sample_counters_with_program_counter with link register as the argument.
yes my .axf have symbols.
No my question is: I am not getting the data for all the functions that were hit during the start of execution till the copying of buffer data into a raw file. Instead I am only getting the profiling data of functions at which the timer expiry happened.
Does Streamline only captures the functions at which timer expired? If not, is there anything else specific to be taken care of to have the data of all the functions
Hi Anudhi,
Getting function information only when the timer has expired is expected. This is because this is the only place you are calling barman_sample_counters_with_program_counter. If you want to get sampling data for more of your application you have two options:
1) Increase the frequency of your timer so that more of your code is sampled
2) If you have any specific functions that you want to sample you can call the barman_sample_counters_with_program_counter manually on these functions meaning you will get a sample everytime the function is hit.
Unless you mean that you are only getting samples inside the sampling function itself. Then this usually points to the value of LR that you are passing into the function being corrupted somehow.
Cheers,Stephen
Thank you Stephen
I have few more questions hoping you have some answer.
Q 1) Different architectures say Cortex R7 shows 44 PMU events and Cortex A55 shows 59 PMU events in Barman Generation Wizard. Does all the architectures have different number of PMU events they can record or same? If same, how can I configure the events that are not listed in the Generation Wizard.
Q 2) The minimum time slot the cross section marker takes is 1 ms, in the timeline view. Is there a way I can see PMU event values less than 1 ms window say for 10 microsecond or 100 microsecond?
Q 3) The functions recorded in the function view are only those functions that were interrupted by the timer interrupt. Say we have four function A(), B(), C() and D(). A() and C() were interrupted by the interrupt hence sampled, so function view shows only the details of A() and C(). But what does call stack in Call Paths view shows? Does it give the information of B() and D() also if they were called from A() or C() ?
Or in call paths view also, only those functions at which the sample is taken are visible and not the complete call stack for that function?