Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

RTOS въпросче
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2584
Страница 1 от 1

Автор:  asp [ Вто Юни 27, 2006 6:08 pm ]
Заглавие:  RTOS въпросче

Значи разучавам ОС. Някой може ли да коментира постнатият код как действа? Ос то е RTX-51 тини ако има някво значение.
iend istart индекси на входящият буфер.
char _getkey (void) {
while (iend == istart) {
itask = os_running_task_id (); /* set input task number */
os_wait (K_SIG, 0, 0); /* RTX-51 call: wait for signal */
itask = 0xff; /* clear input task number */
}
return (inbuf[istart++ & (ILEN-1)]);
}

Автор:  the_real_maniac [ Сря Юни 28, 2006 12:31 pm ]
Заглавие: 

Айде аз съм ентусияст дай линк към тази ос, а или дай поне още обяснения какви са тези входящи буфери , от какво , защото опитах се да го разбера, но определено и аз удрям на камък.

дай и фуннкциите os_wait, inbuf.

Не казвам , че ще успея да ти помогна , но ;-)

Автор:  Predator_MF [ Сря Юни 28, 2006 12:49 pm ]
Заглавие: 

Тоя OS (на KEIL ако не се лъжа) още не съм го пускал, мога само да гадая как работи тая функция...от OS до OS ралика балкан (не Balkana :lol: ).

Така като гадая, istart и iend са начален и краен index на буфера, os_wait е функция, полираща някакъв сигнал, в случая K_SIG...в тоя случай функцията чака вдигане на K_SIG, вдига istart с единица и записва резултата в inbuf[index]...където вече е доста трудно за разгадаване какво става с тоя ILEN-1, предполагам ILEN е дължината на буфера, операция AND в случая действа като ограничение, тоест максималното адресируемо пространство в буфера е ILEN-1, първото което ми идва наум е, че inbuf е кръгов филтър и при всяко викане на функцията резултата се записва в следващата му клетка. Ако приемем, че K_SIG се вдига в 1-ца при приемане на символ по RS232, тая функция пише приеманите символи в кръгов буфер inbuf...има ли някаква логика ? :)

Автор:  asp [ Чет Юни 29, 2006 1:15 pm ]
Заглавие: 

Predator_MF написа:
Тоя OS (на KEIL ако не се лъжа) още не съм го пускал, мога само да гадая как работи тая функция...от OS до OS ралика балкан (не Balkana :lol: ).

Така като гадая, istart и iend са начален и краен index на буфера, os_wait е функция, полираща някакъв сигнал, в случая K_SIG...в тоя случай функцията чака вдигане на K_SIG, вдига istart с единица и записва резултата в inbuf[index]...където вече е доста трудно за разгадаване какво става с тоя ILEN-1, предполагам ILEN е дължината на буфера, операция AND в случая действа като ограничение, тоест максималното адресируемо пространство в буфера е ILEN-1, първото което ми идва наум е, че inbuf е кръгов филтър и при всяко викане на функцията резултата се записва в следващата му клетка. Ако приемем, че K_SIG се вдига в 1-ца при приемане на символ по RS232, тая функция пише приеманите символи в кръгов буфер inbuf...има ли някаква логика ? :)


Много си добър в разгадаването имаш мойте поздравления. Давам малко разяснения. os_running_task_id () връща номера на таска който е активен в момента. iend == istart индексите на входящият буфер. ILEN дължината входящият на буфер. return (inbuf[istart++ & (ILEN-1)]); би трябвало да връща поредният символ.
itask = 0xff; /* clear input task number */ няма активен таск който.... не знам точно
The os_wait function halts the current task and waits for one or several events such as a time interval, a time-out, or a signal from another task or interrupt.
явно чака някъкъв сигнал може би от прекъсването на Уарта че е приет байт.

Мисълта ми е че ако някои е разгадавал подобно нещо щото ми се струва стандартно да даде някакво обяснение.

Автор:  syscop [ Чет Юни 29, 2006 2:18 pm ]
Заглавие: 

На първо четене: while (iend == istart) - 1 - цикълче докато някой напише нещо в буфера, 2 - следващото нещо от буфера (като вземеш 1 нещо, return (inbuf[istart++ & (ILEN-1)]); ти премества указателя), в цикъла OS-а предоставя времето на останалите task-ове, и виси там щото няма какво да ти даде :supz:

Автор:  asp [ Пон Юли 03, 2006 1:19 pm ]
Заглавие: 

syscop написа:
На първо четене: while (iend == istart) - 1 - цикълче докато някой напише нещо в буфера, 2 - следващото нещо от буфера (като вземеш 1 нещо, return (inbuf[istart++ & (ILEN-1)]); ти премества указателя), в цикъла OS-а предоставя времето на останалите task-ове, и виси там щото няма какво да ти даде :supz:

мерси спец и аз подобно си мислех ти потвърди

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/