有没有办法让汇编中的程序暂停 1 秒钟,然后让它恢复正常流程?我正在通过串口编程聊天,但由于某种原因,当我在其中一个程序上键入字符串时,另一个程序并不总是将它作为单个字符串接收;有时它将整个打印出来,但有时它只显示一个部分,并立即意识到还有更多字符串要接收并将其打印为第二个字符串。我想要做的是停止程序一秒钟左右,所以它可以确保它接收到整个字符串,而不仅仅是它的一部分。
5 回答
对于 80x86;如果操作系统类似于 MS-DOS 或“无”,那么您需要在执行 HLT(以节省电力)时循环轮询 BIOS 的“自午夜以来的滴答声”。要获得“自午夜以来的滴答声” ,请int 0x1A
使用ah=0x00
. 一秒大约是 18 个滴答声。翻转时要非常小心 - 如果您不小心并且在午夜之前执行“expiry_time = now + 1 seconds”,那么您可能会永远等待,您应该采取if(expiry_time >= 0x001800B0) expiry_time -= 0x001800B0
措施防止这种情况发生。
如果操作系统是现代的(Windows、OS X、Linux、FreeBSD 等),那么您想告诉操作系统的调度程序运行其他任务 1 秒(以避免无缘无故地占用 CPU 时间);你要么必须找到适当的(特定于操作系统的)API 来做到这一点,要么找到某种库来链接它为你做的。
我不是在回答问题本身,而是在回答:
从不(我的意思是从不!)为这样的目标使用时间延迟!这是非常、非常、非常糟糕的设计。串口通信是基于字符流的。正确设计的程序(无论使用何种语言)必须处理流而不需要任何时间延迟。
是的,
使用 GOTO 和 NOPS。
或创建一个包含 nop 的循环并在满足特定条件时将其转义。或者创建一个 GOTO 标签一堆 nop
startover
nop
nop
nop
nop
nop
nop
nop
nop
GOTO startover // this wil run forever! you need an escape condition
是的,您可以获取系统时钟,然后循环检查是否在获得时间后过了一秒...
如果您使用 x86 程序集,这可能会有所帮助:https ://softwareengineering.stackexchange.com/questions/134084/assembly-instructions-execution-time
或者你可以做一个很长的循环来暂停......第二个我不太推荐,但它可能适合你的需要
似乎问题来自缓冲。等待可能很好,但您必须回答“多少次?”这一主要问题。事实上,你并不知道。通常在 ASM 中,我们使用中断或等待“直到设置一个标志”。但只有“等待一定的秒数”似乎不是正确的选择(我 100% 同意 johnfound!)
建议:在发送端程序中,将数据缓存到 CR/LF 后再发送。在接收器上,等到 CR/LF 显示。还可以查看串行缓冲区指针(IN 和 OUT)以查看开始和结束指针的位置,这可能会提供一些解释正在发生的事情的信息。