2013-02-22 4 views
4

Я использую микроконтроллер STM32 с подключенными минимальными библиотеками. Я хотел бы использовать функцию clock() от <ctime> (и, возможно, новый std::chrono), но я застрял в clock(), возвращая -1.Как функция clock() в <ctime> получает доступ к системным часам?

Это неудивительно, поскольку я не ожидаю, что библиотеки в gcc-arm-none-eabi будут знать периферийное расположение моего микроконтроллера.

Как сообщить clock, где он получает свой счет? Могу ли я просто обновить его или есть функция нижнего уровня, которую мне нужно реализовать?

+0

[Возможно, вы найдете это полезным.] (Https://github.com/libopencm3/libopencm3/blob/master/lib/stm32/timer.c) – 2013-02-22 17:53:37

+0

@ H2CO3: Я не так много спрашиваю _ "как я получаю системные часы? »_, поскольку я -« Учитывая, что могу получить системные часы, как мне связать их с заголовком 'time.h'?» _ – Eric

+0

В этом случае: вам нужно повторно реализовать 'clock()' функция. – 2013-02-22 17:59:27

ответ

1

Обычно это часть работы по переносу реализации libc на новую платформу. Когда вы компилируете копию glibc или newlib (две самые популярные реализации стандартной библиотеки C), вам необходимо предоставить ряд методов заглушки, один из которых будет обеспечивать время. gcc-arm-none-eabi - это цель, предопределенная в newlib, которая реализует много этих заглушек, но не те, для получения времени, потому что, как вы сказали, это специфические приложения.

Лучшее, что нужно сделать, - это построить инструментальную цепочку самостоятельно, реализуя этот метод. Вы можете следовать инструкциям here, но перед тем, как вы создадите newlib, измените цель, чтобы заполнить эту заглушку. Имеется хорошая ссылка на реализацию заглушек here.

В качестве альтернативы вы можете реализовать свою собственную функцию clock, когда вы связываете приложение, оно предпочтет вашу версию над той, что находится в библиотеке. Однако будьте осторожны, это означает, что все, что в библиотеке, которая вызывает clock, по-прежнему будет называть сломанную версию библиотеки, поэтому вам может потребоваться переопределить множество функций.

+0

Спасибо. 'times' - это имя функции, которую я искал. Я предполагаю, что в библиотеке libnosys.a я связываю делегатов, которые вызывают '_times'? – Eric

+0

Я думаю, что 'libnosys.a' реализует' times' как неудачный. Скорее всего, вам нужно использовать 'libgloss', а не использовать libnosys.a', заполняя любые заглушки. – jleahy

+0

Нет, определяя '_times' без перекомпиляции инструментальной цепочки, сделал трюк. Спасибо за ссылки. – Eric