Я могу искусственно замедлить триггерные функции C для профилирования?
Я использую VS2012 Ultimate для некоторых встроенных разработок на C. Я компилирую код с абстракцией платформы и моделирую его на моем ПК. Другой сотрудник компании использует CodeWarrior со слоем абстракции PPC и запускает его на чипе MPC565. Задачи на встроенном чипе иногда выходят за границы процессора или времени.
В коде довольно много тригонометрии. Я знаю, что выполнение триггера на встроенном чипе происходит медленно. Как я могу преувеличить время, проведенное в триг-коде на моем ПК? Я думаю что-то вроде этого:
#define cos(x) ({ while(asiTimeMsec64() % 10 != 0); cos(x);})
#define sin(x) ({ while(asiTimeMsec64() % 10 != 0); sin(x);})
#define tan(x) ({ while(asiTimeMsec64() % 10 != 0); tan(x);})
Однако этот код не совсем работает. Я получаю ошибки компилятора о моем cos
звонки, не возвращающие номер. Я хотел бы иметь некоторую спин-блокировку - что-то, что не позволяет другим потокам работать.
Как переопределить функции триггера math.h, чтобы сделать их искусственно медленными?
3 ответа
Я не уверен, что ваша идея макроса даст вам полезные результаты, но вот как вы можете заставить ее работать:
void slowup( )
{
while(asiTimeMsec64() % 10 != 0);
}
#define cos(x) (slowup(),cos(x))
...
или, используя указатель на функцию:
double slowup( double (*trig)( double ), double val )
{
while(asiTimeMsec64() % 10 != 0);
return (*trig)( val );
}
#define cos(x) slowup(cos, x)
...
Определите новую функцию:
double slowed_cos(double x)
{
SLOW_TRIG;
return cos(x);
}
с макросами
#define cos(Var) slowed_cos(Var)
#define SLOW_TRIG while(asiTimeMSec64() % 10 !=0)
промыть и повторить для остальных. Однако вы должны будете убедиться, что прототип функции доступен везде, где используются функции по умолчанию, с соответствующим оператором include.
Также проверьте спецификацию функции math.h для аргументов.
Если вы можете, переключитесь на другой компилятор C, в основном gcc
от mingw32. С gcc вы можете использовать этот хитрый трюк, чтобы заменить библиотечные функции вашим собственным кодом, как объяснено в этом ответе. Также посмотрите, если Visual C может сделать что-то подобное!
(Примечание: если вы застряли с Windows, то лично для меня легче всего разработать на C разработку Qt SDK для mingw, с включенным Qt Creator, а затем использовать его для простого проекта C, который поддерживается вне -коробка.)
В качестве альтернативы, возьмите источники математической библиотеки C, например, из этого ответа, отредактируйте их, чтобы включить задержку, и добавьте ссылки на них вместо стандартной математической библиотеки. С gcc вы бы просто не использовали -lm
Переключатель компоновщика, вместо этого используйте ссылку на пользовательскую библиотеку, как и любую другую библиотеку. С VC это может быть так же просто, но вполне возможно, что математическая библиотека подключена по умолчанию, и в этом случае вам нужно выяснить, как отключить эту связь по умолчанию.
Кроме того, обязательно отключите любые оптимизации, которые могут создавать собственный встроенный код для функций библиотеки математики! Хотя просто компиляция в режиме отладки, вероятно, достигнет этого.
Обратите внимание, что ваши результаты профилирования будут очень грубыми. Вы, вероятно, должны немного откалибровать, как для общих настроек оптимизации C, так и для измерения того, сколько задержки вам нужно добавить к любым инструкциям с плавающей запятой. Но если профилирование реального кода на реальном устройстве не вариант, и это не только для одного проекта, но будет полезно и в будущем, тогда я вижу некоторую выгоду в настройке некоторой сравнимой среды для собственного кода ПК.