2013-04-03 4 views
-2

Есть ли способ приостановить программу в сборке, скажем, 1 секунду, а затем возобновить ее нормальный поток? Я программирую чат через последовательный порт, но по какой-то причине, когда я набираю строку в одной из программ, другой не всегда получает ее как одну строку; Иногда он печатает его в целом, но в других случаях он отображает только одну часть и сразу же понимает, что существует больше строк для приема и печати в виде второй строки. То, что я пытаюсь сделать, это остановить программу на секунду или около того, так что она может быть уверенной, что она получает целую строку, а не только ее часть.Приостановка программы сборки

+0

Если вы делаете это правильно, вы должны получить поток байтов, который отображается только тогда, когда вы получаете некоторый байт «конец сообщения» (например, символ новой строки), и вам не нужно будет паузу для начала. Ваша 1-секундная пауза не решает проблему. – Brendan

+3

Укажите CPU и ОС. Ответ будет зависеть от них. На самом деле, пожалуйста, сделайте то же самое для всех вопросов [сборки]. –

+1

Не было бы проще исправить протокол чата, чтобы начало/конец строки можно было идентифицировать при получении в качестве байтового потока? Таймерные устройства не работают надежно или вводят раздражающую задержку, или и то, и другое. –

ответ

2

Для 80х86; если ОС - это что-то вроде MS-DOS или «none», тогда вы хотите опросить «тики» BIOS с полуночи в цикле при выполнении HLT (для экономии энергии). Чтобы получить «тики с полуночи», используйте int 0x1A с ah=0x00. Одна секунда будет приблизительно 18 тиков. Будьте очень осторожны с переворачиванием - если вы не будете осторожны и делаете «expiry_time = now + 1 second» незадолго до полуночи, тогда вы можете ждать всегда, и вы должны сделать if(expiry_time >= 0x001800B0) expiry_time -= 0x001800B0, чтобы этого не случилось.

Если ОС - это что-то современное (Windows, OS X, Linux, FreeBSD и т. Д.), То вы хотите сообщить планировщику ОС, чтобы он запускал другие задачи в течение 1 секунды (чтобы избежать причинения вреда CPU без причины); и вам придется либо найти подходящий (специфичный для ОС) API, чтобы это сделать, либо найти какую-то библиотеку, чтобы ссылаться на нее, которая делает это за вас.

+0

+1 (я сделал один раз инфракрасный передатчик для 80386, используя эту технику.) Интервал разрешения на микросекунду не нужно было беспокоиться о переполнениях. –

+0

Я пробовал это в ожидании 1 тика (aprox 55ms), и он работает нормально, ни одна из моих строк не получает в куски больше – user2221424

0

Да,

использование GOTO и NOPS.

или создать цикл, в котором пробивается ноль, и избегать его при выполнении определенных условий. или создать ярлык GOTO bunchs НОП

startover 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
nop 
GOTO startover // this wil run forever! you need an escape condition 
+0

- это то, что даже сборка? Я никогда не видел эти команды до – user2221424

+1

. Каждый процессор имеет по крайней мере один язык ассемблера (и часто есть два или более разных языка ассемблера для CPU - например, синтаксис Intel и AT & T). Поскольку в вопросе не говорится, какой язык ассемблера, для которого ЦП, «псевдо-сборка» - хорошая идея. 'GOTO' не является сборкой, но' GOTO' существует на многих языках и очень широко понимается, что делает его привлекательным вариантом для «псевдо-сборки». – Brendan

+0

что я не понимаю, нет, я полагаю, что на самом деле это не значит ничего, кроме траты времени. – user2221424

0

Да, вы можете получить системные часы, а затем сделать петлю, чтобы проверить, если второй прошло после того, как вы получили время ...

Это может помочь, если вы по сборке x86: https://softwareengineering.stackexchange.com/questions/134084/assembly-instructions-execution-time

Или вы можете сделать очень длинную петлю, чтобы сделать паузу ... второе я не рекомендую много, но это может удовлетворить ваши потребности

+0

Я использую x68, я попробую это, спасибо большое – user2221424

2

я отвечаю не сам вопрос, но все равно:

Никогда (я имею в виду НИКОГДА не!) Использовать временные задержки для таких целей! Это очень, очень, очень плохой дизайн. Связь последовательного порта основана на символьных потоках. Правильно разработанная программа (независимо от используемого языка) должна обрабатывать поток без каких-либо временных задержек.

-1

вы можете написать это заявление в .Code раздел после отображения того, что вы хотите

.code 
;write your code 
call Waitmsg 
+0

Неверный вопрос. Речь идет о спящем/ожидании фиксированного количества времени, а не для ввода пользователем. Вы уже опубликовали еще одну копию этого точного ответа на http://stackoverflow.com/questions/23249397/assembly-console-pause, где она действительно принадлежит (хотя было бы намного лучше, если бы вы связались с какой-то документацией о том, что эта функция есть/делает). –

0

Кажется, проблема возникла из буферизации. Ожидание может быть хорошим, но вы должны ответить на главный вопрос, который «Сколько раз?». И на самом деле, вы действительно не знаете. Comonly в ASM, мы используем прерывание или ожидаем «пока не установлен флаг». Но только «ожидание определенного времени второго» кажется не правильным выбором (я согласен на 100% с johnfound!)

Предложение: в программе отправителя буферизуйте данные до тех пор, пока CR/LF не отправит их. На приемнике дождитесь появления CR/LF. Также посмотрите на указатели последовательного буфера (IN и OUT), чтобы увидеть позицию указателя начала и конца, которая может дать некоторую информацию, объясняющую, что происходит.

Смежные вопросы