Решили мы на работе переползти на свежу версию IAR (с 6.30 сразу на 7.40) и, в процессе переползания, выявили странное поведение stack analysis. Для того, чтобы локализовать проблему сделали новый Си-шный проект с чистого листа, в который добавили один единственный файл:
Код
#include <math.h>
int AngularVelocityFilter1(double * res, const double angle)
{
*res = acos(angle);
return 0;
}
void main(void)
{
double angle;
AngularVelocityFilter1(&angle, 0.1234);
}
Все настройки проекта оставили дефолтными. Разрешили только использование stack analysis и генерацию map-файла. В итоге при сборке проекта имеем предупреждение:
Код
Warning[Ls015]: [stack usage analysis] at least one function appears to be uncalled. Example: "__iar_Atan". A complete list of uncalled functions is in the map file.
Содержимое map-файла (только часть):
Код
rogram entry
"__iar_program_start": 0x08000bb9
Maximum call chain 88 bytes
"__iar_program_start" 0
"__cmain" 0
"main" 16
"AngularVelocityFilter1" 8
"acos" 32
"__aeabi_dadd" 16
"__iar_dadd" 16
interrupt
"__default_handler" in vector_table_M.o [5]: 0x08000297
Maximum call chain 0 bytes
"__default_handler" in vector_table_M.o [5] 0
Uncalled function
"__iar_Atan": 0x08000299
Maximum call chain 64 bytes
"__iar_Atan" 32
"__aeabi_dadd" 16
"__iar_dadd" 16
Мы посмотрели, как в стандратной библиотеки реализована функция расчета acos. В конечном итоге acos действительно вызывает __iar_Atan. Но вопрос в том, почему стек анализатор не видет вызова __iar_Atan и говорит о том, что __iar_Atan - Uncalled function? При этом в ассемблерном коде мы видем вызов __iar_Atan.
В целом проблема решается исключением из анализа __iar_Atan, но выглядит это ну как-то уж очень странно. Хотелось бы понять в чем косяк.
P.S. На 6.30 такой проблемы у нас нет.
Сообщение отредактировал Grigorij - Apr 28 2015, 13:48