Я могу искусственно замедлить триггерные функции 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, так и для измерения того, сколько задержки вам нужно добавить к любым инструкциям с плавающей запятой. Но если профилирование реального кода на реальном устройстве не вариант, и это не только для одного проекта, но будет полезно и в будущем, тогда я вижу некоторую выгоду в настройке некоторой сравнимой среды для собственного кода ПК.

Другие вопросы по тегам