Отговори на тема  [ 6 мнения ] 
RTOS въпросче 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 22, 2006 6:27 pm
Мнения: 376
Местоположение: plovdiv
Мнение 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)]);
}


Вто Юни 27, 2006 6:08 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Айде аз съм ентусияст дай линк към тази ос, а или дай поне още обяснения какви са тези входящи буфери , от какво , защото опитах се да го разбера, но определено и аз удрям на камък.

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

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

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Сря Юни 28, 2006 12:31 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Тоя 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...има ли някаква логика ? :)


Сря Юни 28, 2006 12:49 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 22, 2006 6:27 pm
Мнения: 376
Местоположение: plovdiv
Мнение 
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.
явно чака някъкъв сигнал може би от прекъсването на Уарта че е приет байт.

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


Чет Юни 29, 2006 1:15 pm
Профил
Online
Ранг: Форумен бог
Ранг: Форумен бог

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


Чет Юни 29, 2006 2:18 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 22, 2006 6:27 pm
Мнения: 376
Местоположение: plovdiv
Мнение 
syscop написа:
На първо четене: while (iend == istart) - 1 - цикълче докато някой напише нещо в буфера, 2 - следващото нещо от буфера (като вземеш 1 нещо, return (inbuf[istart++ & (ILEN-1)]); ти премества указателя), в цикъла OS-а предоставя времето на останалите task-ове, и виси там щото няма какво да ти даде :supz:

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


Пон Юли 03, 2006 1:19 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни