2009-12-01 1 views
3

У меня встроенная система, которая в настоящее время отслеживает секунды до тех пор, пока событие не должно происходить с использованием часов реального времени, приводимых в действие кристаллами часов.Рекомендации по реализации функций календаря во встроенной системе?

Теперь ему необходимо отслеживать фактическую дату и время. Поэтому мне нужно рассчитать день, месяц, год, час, минуту и ​​секунду с даты начала/времени и смещения в секундах.

Может ли кто-нибудь указать меня в правильном направлении, принимая во внимание високосные годы, летнее время (DST) и другие осложнения?


Аппаратные решения не являются вариантом, поскольку эта функция добавляется к существующему продукту. Периферия RTC интегрирована в MCU, выбранный для устройства следующего поколения.

+0

Почему бы не добавить RTC к дизайну? Или, может быть, не вариант в этом случае? – eaanon01

+1

Я не думаю, что мне нужно добавить еще один IC, чтобы конвертировать из секунд с эпохи в дату/время ... –

+0

Многие микроконтроллеры имеют встроенный RTC, если это было требование, возможно, вы могли бы использовать его? – Clifford

ответ

1

C Snippets archive имеет date and time functions. Обновление: к сожалению, архив фрагментов C теперь не функционирует. Я обновил ссылку, чтобы указать на веб-архив страницы.

См. Также «Julian day», Wikipedia, который включает формулы для Julian date calculation.

A "julian date calculation" Поиск в Google должен раскрывать больше, если вы хотите продолжить поиск.

0

Следующая функция определяет, является ли данный год високосный:

bool is_leap_year(int year) 
{ 
    return ((0 == year % 400) || ((0 == year % 4) && (0 != year % 100))); 
} 
1

код Календарь может быть немного сложен - если библиотека C во время выполнения вы используете не имеют такую ​​поддержку встроенных (и каким-то образом интегрировать счетчик часов в него), вы можете рассмотреть код в P.J. Plauger's "The Standard C Library" и адаптировать его к вашим потребностям.

2

Мне скучно, не мог удержаться от попытки решения. Вот прототип рубин - должен быть достаточно ясным, чтобы перевести на C.

Учитывая offset и датой начала хранится как: Baseyear, Baseday, Basesec где день 0 = jan1, вы можете рассчитать дату как

#initialize outputs 
year= Baseyear 
day = Baseday 
sec = Basesec+offset 

#days & seconds remaining in the current year 
is_leap = is_leap_year(year) 
days_remaining = 365+(is_leap ? 1 : 0) - day 
secs_remaining = SEC_PER_DAY*days_remaining 

#advance by year 
while (sec>=secs_remaining) 
    sec-=secs_remaining 
    year+=1 
    is_leap = is_leap_year(year) 
    days_remaining = 365+(is_leap ? 1 : 0) 
    secs_remaining = SEC_PER_DAY*days_remaining 
    day=0 
end 

#sec holds seconds into the current year, split into days+seconds 
day += sec/SEC_PER_DAY 
day = day.to_i #cast to int 
sec %= SEC_PER_DAY 

#lookup month 
for i in (0..11) 
    dpm = DAYS_PER_MONTH[i] # =[31,28,31,30,...] 
    if (i==1 && is_leap) 
    dpm+=1 
    end 
    if day < dpm 
    month = i 
    break 
    else 
    day-=dpm 
    end 
end 

day+=1 #1-based 
hour = sec/3600 
min = (sec%3600)/60 
sec = sec%60 
puts "%s %d, %d @ %02d:%02d:%02d" % [MONTHNAME[month],day,year, hour, min, sec] 

Это должно быть легко добавить проверку того, что день находится между начальным и конечным днями для летнего времени в текущем регионе и соответствующим образом корректирует час.

 Смежные вопросы

  • Нет связанных вопросов^_^