Я хотел бы отладить свой код и не могу получить доступ к внутреннему уровню в процессе, так как это может нарушить связь с оборудованием. (энергозависимые операции выполняются там, где список наблюдения будет мешать основному доступу к чтению.)
Поэтому я тестирую возвращаемые значения интерфейса, но компилятор IAR даже оптимизирует неиспользуемые переменные.
и утверждение, подобное этому:
i = object.foo();
if (i)i=i;
тоже не помогает
Я нашел здесь, на SO просто отвечает на этот совет для этого случая, чтобы использовать операции ввода-вывода. но это тоже не вариант, так как у меня нет возможности включить стандартные библиотеки C. и сам проект не требует ввода / вывода, нет собственного варианта функций ввода / вывода.
Так какие у меня варианты кроме отключения оптимизатора?
Самый надежный способ — найти параметр в файлах компоновщика, который принудительно связывает определенную переменную. Но это, конечно, полностью зависит от системы.
В противном случае стандартное портативное решение просто написать (void)i;
где-то в коде. Это работает для большинства компиляторов. Если этого не произойдет, вы можете сделать еще один шаг вперед:
#ifdef DEBUG_BUILD
volatile int dummy;
// all variables you would like to have linked:
dummy = i;
dummy = j;
...
#endif
Или, если вы любите неясные макросы:
#define FORCE_LINKING(x) { void* volatile dummy = &x; }
(void*
так как это тип универсальный и работает для всех типов переменных. * volatile
сделать сам указатель изменчивым, что означает, что компилятору запрещено оптимизировать запись в него.)
Обычный способ — поместить его в цикл while с помощью макроса.
#define KEEP_UNUSED(var) do { (void)var; } while(false);
IAR также имеет расширение под названием __root
:
http://supp.iar.com/FilesPublic/UPDINFO/004350/manuals.htm
Атрибут __root может использоваться как для функции, так и для переменной
убедитесь, что когда модуль, содержащий функцию или переменную
связаны, функция или переменная также включена, независимо от того
ссылается остальная часть программы.