| Микроконтролери и електроника 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 Така като гадая, 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 ] | |||||||||
| Заглавие: | ||||||||||
Много си добър в разгадаването имаш мойте поздравления. Давам малко разяснения. 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-ове, и виси там щото няма какво да ти даде |
|
| Автор: | asp [ Пон Юли 03, 2006 1:19 pm ] | |||||||||
| Заглавие: | ||||||||||
мерси спец и аз подобно си мислех ти потвърди |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|