|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 10:43 pm
|
Страница 1 от 1
|
[ 6 мнения ] |
|
| Автор |
Съобщение |
|
asp
Ранг: Популярен
Регистриран на: Сря Фев 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 |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Айде аз съм ентусияст дай линк към тази ос, а или дай поне още обяснения какви са тези входящи буфери , от какво , защото опитах се да го разбера, но определено и аз удрям на камък.
дай и фуннкциите os_wait, inbuf.
Не казвам , че ще успея да ти помогна , но 
|
| Сря Юни 28, 2006 12:31 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Тоя 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...има ли някаква логика ? 
|
| Сря Юни 28, 2006 12:49 pm |
|
 |
|
asp
Ранг: Популярен
Регистриран на: Сря Фев 22, 2006 6:27 pm Мнения: 376 Местоположение: plovdiv
|
 |  |  |  | Predator_MF написа: Тоя 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...има ли някаква логика ?  |  |  |  |  |
Много си добър в разгадаването имаш мойте поздравления. Давам малко разяснения. 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 |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
На първо четене: while (iend == istart) - 1 - цикълче докато някой напише нещо в буфера, 2 - следващото нещо от буфера (като вземеш 1 нещо, return (inbuf[istart++ & (ILEN-1)]); ти премества указателя), в цикъла OS-а предоставя времето на останалите task-ове, и виси там щото няма какво да ти даде 
|
| Чет Юни 29, 2006 2:18 pm |
|
 |
|
asp
Ранг: Популярен
Регистриран на: Сря Фев 22, 2006 6:27 pm Мнения: 376 Местоположение: plovdiv
|
мерси спец и аз подобно си мислех ти потвърди
|
| Пон Юли 03, 2006 1:19 pm |
|
|
|
Страница 1 от 1
|
[ 6 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|