|
Злополучная функция what_day(), Вычисление дня недели |
|
|
|
Jun 6 2008, 07:11
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Для инициализации Real Time Clock возникла необходимость вычисления дня недели по дате. Функция достаточно простая: Код //---------------------------------------------------------------------------- // Вычисления дня недели по дате // Все деления целочисленные (остаток отбрасывается). // Результат: 0 — воскресенье, 1 — понедельник и т. д. //---------------------------------------------------------------------------- unsigned char what_day(unsigned int year, unsigned char month, unsigned char date) { unsigned char a = (14 - month) / 12; unsigned int y = year - a; unsigned char m = month + 12*a - 2; return (7000 + (date + y + y/4 - y/100 + y/400 + (31*m)/12 ))% 7; } Но по какой-то непонятной причине вызов ее приводит к глюкам программы. В частности, при входе в пункт меню невозможно из него выйти, при этом программа реагирует не так как задумано. Должен сказать, что проект использует ОС (scmRTOS) и ОЗУ использовано на 90%. Контроллер Mega324P (2кБ ОЗУ). Отладочными средствами (JTAG) пользоваться не представляется возможным. Это похоже на переполнение стека. Но. Почему это происходит, если вызов достаточно простой функции вставить в начале функции main (до запуска ОС): Код int main() { what_day(2008, 6, 6); ..................... Больше нигде в процессах она не используется. Пробовал менять размеры CSTACK (100...200) и RSTACK (32...64). Не помогло. Думаю менять контроллер на AT90USB1287. Но сделаю это в последнюю очередь. Может быть есть другой способ вычисления дня недели? Какие будут предложения?
|
|
|
|
|
 |
Ответов
|
Jun 6 2008, 09:47
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(GetSmart @ Jun 6 2008, 11:52)  Листинг кода посмотрите, в MAP-файле должен указываться раход стека в процедурах what_day, ??div16 (может по-другому называется). И вообще, листинги при всяких неполадках читать очень рекомендуется. По листингу не ясно, сколько расходует стек функция what_day. Может, плохо искал. Если не трудно, взгляните сами. Буду очень признательный. Цитата(GetSmart @ Jun 6 2008, 11:52)  В процедуре what_day куча временных переменных. В стеке они лежат или нет - хз. Так разве после возврата из ф-ции стек не освобождается? В одном из процессов ОС у меня применяются вычисления двойной точности. И ничего, справляется. Хватает 100 байт для процесса. P.s. Нашел еще одну функцию вычисления дня недели: Код enum Month {January=1,February,March,April,May,June,July,August, September,October,November,December}; struct Date { float day; Month month; int year; };
signed int DayOfWeek(Date date) { float F; if (date.month<March) F=365*date.year+date.day+31*(date.month-1)+ (signed int)((date.year-1)/4)-(signed int)(3*(signed int)((date.year-1)/100+1)/4); else F=365*date.year+date.day+31*(date.month-1)-(signed int)(0.4*date.month+2.3)+ (signed int)(date.year/4)-(signed int)(3*(signed int)(date.year/100+1)/4); return (signed int)F-7*(signed int)(F/7)-1; }
........................ int main() {volatile unsigned char day; Date Today={5,June,2008}; switch (DayOfWeek(Today)) { case -1: day=1;break; // printf("Sunday\n");break; case 0: day=2;break; //printf("Monday\n");break; case 1: day=3;break; //printf("Tuesday\n");break; case 2: day=4;break; //printf("Wednesday\n");break; case 3: day=5;break; //printf("Thursday\n");break; case 4: day=6;break; //printf("Friday\n");break; case 5: day=7;break; //printf("Saturday\n");break; } Та же проблема: функция работает, но приводит к тому же глюку. Почему вызов функции в начале программы может переполнять стек. Неужели ей мало 0x100 CSTACK ?
|
|
|
|
Сообщений в этой теме
alux Злополучная функция what_day() Jun 6 2008, 07:11 MrYuran интересно, а куда она возвращает результат?
Кодint... Jun 6 2008, 08:08 alux Цитата(MrYuran @ Jun 6 2008, 11:08) интер... Jun 6 2008, 08:41 GetSmart В листинге нет процедуры ??what_day. Дайте листинг... Jun 6 2008, 10:02 alux Цитата(GetSmart @ Jun 6 2008, 13:02) Я не... Jun 6 2008, 10:23 GetSmart Прерывания запретите перед вызовом этой процедуры.... Jun 6 2008, 10:33 alux Вызов идет в начале main(). Естественно, прерывани... Jun 6 2008, 10:45 MrYuran Насколько я понимаю, 0х8f это не совсем 100, верне... Jun 6 2008, 10:53 alux Цитата(MrYuran @ Jun 6 2008, 13:53) 0х8f ... Jun 6 2008, 11:16 IgorKossak ЦитатаОтладочными средствами (JTAG) пользоваться н... Jun 6 2008, 11:38 vet Коллеги, какая нехватка ОЗУ? три параметра, три пе... Jun 6 2008, 11:41 alux Цитата(vet @ Jun 6 2008, 14:41) Чип помен... Jun 6 2008, 12:08  rezident Цитата(alux @ Jun 6 2008, 18:08) Изначаль... Jun 6 2008, 12:20 rezident Совет из области паранойи, но все же попробуйте пр... Jun 6 2008, 11:47 alux Если это хоть как-то наведет на мысли... Глюк проя... Jun 6 2008, 12:41 alux Это выходит за всякие рамки понимания и попахивает... Jun 6 2008, 15:52 sKWO Цитата(alux @ Jun 6 2008, 11:11) Но по ка... Jun 6 2008, 19:21 alux Цитата(sKWO @ Jun 6 2008, 22:21) Не помог... Jun 6 2008, 21:19  sKWO Цитата(alux @ Jun 7 2008, 01:19) Не понял... Jun 7 2008, 06:02 Flasher Недавно в яре натолкнулся под авр использовал функ... Jun 6 2008, 19:38 Andreas1 Цитата(Flasher @ Jun 6 2008, 23:38) Недав... Jun 7 2008, 13:40 vet Посмотрите, какие регистры использует подпрограмма... Jun 7 2008, 04:51 AlexG Если у вас scmRTOS, то размеры каких стеков вы кру... Jun 7 2008, 13:24 GetSmart Цитата(alux)Проблема решилась частично: если вызва... Jun 7 2008, 14:00 alux Цитата(GetSmart @ Jun 7 2008, 17:00) Нуже... Jun 7 2008, 15:55 GetSmart Вызов функции деления до сих пор присутствует.
Ещ... Jun 7 2008, 17:55 alux Цитата(GetSmart @ Jun 7 2008, 20:55) Вызо... Jun 7 2008, 21:09 GetSmart Тогда выкладывайте HEX-файл. Функция деления - она... Jun 7 2008, 21:48 alux Цитата(GetSmart @ Jun 8 2008, 00:48) Тогд... Jun 7 2008, 23:21  sKWO Цитата(alux @ Jun 8 2008, 03:21) Выкладыв... Jun 8 2008, 19:36   alux Цитата(sKWO @ Jun 8 2008, 22:36) Если я е... Jun 9 2008, 08:18 GetSmart Так и не понял косяк. Со стеком не может быть проб... Jun 8 2008, 09:49 alux Цитата(GetSmart @ Jun 8 2008, 12:49) Каже... Jun 8 2008, 19:29 GetSmart Ещё как вариант, нужно сравнить два листинга с про... Jun 8 2008, 21:53 alux Этот глюк выпил достаточно моей крови... Решил д... Jun 11 2008, 15:03 GetSmart Цитата(alux)Так как в отдельный момент времени в п... Jun 11 2008, 23:15 alux Цитата(GetSmart @ Jun 12 2008, 02:15) Кла... Jun 12 2008, 06:30 GetSmart Цитата(alux)Не понял на счет глюка, я же прерывани... Jun 12 2008, 11:10 alux Цитата(GetSmart @ Jun 12 2008, 14:10) Что... Jun 12 2008, 11:31 alux ...И вновь продолжается бой.
Ребята, извините, п... Jun 13 2008, 08:04 sKWO Цитата(alux @ Jun 13 2008, 12:04) Код els... Jun 13 2008, 08:57 GetSmart Цитата(alux @ Jun 13 2008, 14:04) Код#ifd... Jun 13 2008, 17:42  alux Цитата(GetSmart @ Jun 13 2008, 20:42) Ран... Jun 13 2008, 18:45 alux Код// Alternation key code
#define ALTKEY 26 /... Jun 13 2008, 09:39 defunct зато теперь у вас
1. целая коллекция рабочих и н... Jul 5 2008, 23:42 alux Вот еще один пример до кучи. Вариация на тему ... Jul 10 2008, 16:22 sensor_ua Тогда ещё один вариант
Код //Regra de Zeller
unsig... Jul 12 2008, 04:56 GetSmart Цитата(sensor_ua)Кодreturn( nWDay < 0 ? ... Jul 12 2008, 10:32 sensor_ua ЦитатаМожно я упрощу?
это к автору - Regra de Zell... Jul 12 2008, 10:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|