谢谢 金色的梦想 的解答.
问题1:金色的回答已经很准确了.但楼主存在理解上的错误.这里读取CTRL的16位用于判断是否完成计数.注意这个第16位,是在计数时间到,才被硬件置1的,所以在没到达之前,一直是0.所以在完成之前,无论你读多少次都没关系了.
当计数时间到之后,该位被硬件置1,则肯定可以被读到一次(也只能被读一次).在读到该位为1之后,!(temp&1<<16)就为0了.从而退出do while循环.
所以,不存在你说的死循环.
问题2:这一步其实是防止CTRL的0位被意外的关闭,从而导致的死循环无法退出的问题.你去掉也是可以的.只要能保证CTRL没有被其他程序意外修改就可以.
谢谢 金色的梦想 的解答.
问题1:金色的回答已经很准确了.但楼主存在理解上的错误.这里读取CTRL的16位用于判断是否完成计数.注意这个第16位,是在计数时间到,才被硬件置1的,所以在没到达之前,一直是0.所以在完成之前,无论你读多少次都没关系了.
当计数时间到之后,该位被硬件置1,则肯定可以被读到一次(也只能被读一次).在读到该位为1之后,!(temp&1<<16)就为0了.从而退出do while循环.
所以,不存在你说的死循环.
问题2:这一步其实是防止CTRL的0位被意外的关闭,从而导致的死循环无法退出的问题.你去掉也是可以的.只要能保证CTRL没有被其他程序意外修改就可以.
举报