Я использую набор инструментов arm-none-eabi с newlib, чтобы настроить таргетинг на настраиваемую плату с ARM Cortex-M0 + (в частности, MCU-on-eclipse версии набора инструментов). Я компилирую / связываю с -nostartfiles
и --specs=nano.specs
и переназначил stdout и stderr на USB и последовательный порт соответственно. Я создал реализации для большинства системных вызовов C.
Я использую библиотеку chrono с двумя пользовательскими часами, функциями now () получить время RTC или мой таймер systick. Похоже, что это отражает назначение стандартных stable_clock и system_clock, поэтому я подумал, что могу попробовать их использовать.
для этого мне пришлось реализовать системный вызов gettimeofday, который я сделал
// returning a set time of one second just for testing
int _gettimeofday(struct timeval* tv, void* tz) {
tv->tv_sec = 1;
tv->tv_usec = 255;
return 0;
}
мой основной код выглядит следующим образом:
int main(void)
{
HWInit();
static std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
static std::chrono::system_clock::time_point t2 = std::chrono::system_clock::now();
int64_t count1 = t1.time_since_epoch().count();
int64_t count2 = t2.time_since_epoch().count();
printf("Time 1: %lld\n Time 2: %lld\n", count1, count2);
for(;;){}
return 0;
}
используя отладчик, я вижу, что и steady_clock::now()
, и sysytem_clock::now()
вызывают мою функцию _gettimeofday (), и обе в конечном итоге имеют один и тот же момент времени.
конечно, если я попытаюсь сделать следующее, я получу несколько ошибок определения:
using SysClock = std::chrono::system_clock;
SysClock::time_point SysClock::now() noexcept {
return SysClock::time_point( SysClock::duration(1983) );
}
Так можно как-то перегрузить функции now () стандартных хронометров? или, может быть, вся реализация часов с моей собственной продолжительностью и определениями типов реплик, которые лучше соответствуют оборудованию? Я могу перегрузить новые и удалить для своей встроенной системы (и должен), поэтому было бы неплохо сделать это для chrono.