Как вы устанавливаете системное время, используя C / C ++? - PullRequest
3 голосов
/ 14 сентября 2009

У меня есть встроенная система (ARM 9263) под управлением ОСРВ, инструменты IAR. Система поддерживает стандартную функцию time (), которая дает мне текущее время. Мне нужен обратный вызов, то есть мне нужно установить время - есть ли стандартный способ «С» для этого? Я гуглил, наверняка думал, что это будет очевидно, но, возможно, это зависит от платформы? Я не уверен почему, так как time () нет - есть идеи? Спасибо!

Ответы [ 4 ]

5 голосов
/ 14 сентября 2009

Используя набор инструментов IAR, API-интерфейс времени суток C (time()) можно переопределить, используя пример из ARM\src\lib\time.c. Процедура по умолчанию всегда возвращает -1, что указывает на то, что CRT не знает, который час. Как только вы предоставите свою собственную реализацию time(), которая будет получать время суток из источника, который зависит от вашей платформы tartget и / или RTOS, вы можете установить время суток, обновляя любой из этих источников времени. IAR, возможно, уже сделал это для своей ОСРВ - я не использовал ОСРВ PowerPac IAR.

Подробные сведения о том, как это работает для другой ОСРВ или системы без ОСРВ, изложены в Руководстве по разработке IAR C / C ++.

Например, в системе, в которой я работал, в которой используется микроконтроллер ST Micro STM32, часы реального времени (RTC) устанавливаются на тик раз в секунду, а библиотечная функция time() просто возвращает значение в RTC. Установка новой даты / времени является вопросом установки RTC с новым значением. Счетчик времени RTC установлен со значением эпохи Unix (секунды с 1 января 1970 года), что позволяет остальным функциям библиотеки, начиная с time.h, работать нормально (вплоть до 2035 года, когда начинают возникать 32-битные переполнения). опустошение).

Подпрограммы календаря в библиотеке поддержки времени выполнения IAR DLIB C датируются 2035-12-31 (я подозреваю, что они переполнены до 2038 года, потому что внутренние вычисления используют эпоху 1 января 1900 года). Если вы используете эпоху Unic, другие подпрограммы DLIB более или менее просто работают - я не уверен, какой уровень усилий потребуется для использования другой эпохи.

2 голосов
/ 14 сентября 2009

Существует settimeofday (2), который позволяет вам это делать, но это POSIX, а не ANSI C.

Вы также можете проверить clock_settime, что, возможно, может быть более применимо к встроенным системам. См. Эту страницу руководства, например.

1 голос
/ 14 сентября 2009

Инструменты IAR не относятся к конкретным целям, поэтому никто из библиотеки не знает, как установить время на вашем оборудовании (или прочитать его в этом отношении), которое зависит от вашего пакета поддержки плат ( который обычно сопоставляет ваше оборудование со стандартной библиотекой).

Не у всех целей даже есть RTC. Инструменты IAR предоставляют поддержку и для ряда конкретных микроконтроллеров и готовых плат разработки, поэтому вы можете обнаружить, что это уже сделано для вас - вам просто нужно посмотреть.

У вашего микро может быть внутренний RTC, или у вас может быть внешний RTC, но «ARM 9263» сам по себе не определяет RTC, поэтому вам нужно быть более конкретным - RTC обычно добавляются как периферийные устройства, специфичные для поставщика. Тогда это будет случай получения руководства пользователя детали и записи необходимых регистров.

1 голос
/ 14 сентября 2009

Не существует стандартного способа сделать это на C или C ++. Вам придется обратиться к поставщику ОС за API и / или поставщику компилятора или стандартной библиотеки для какого-то расширения.

...