所以我创建了两个名为read_character和output_character的子程序,它们基本上只通过uART输出你在PuTTy屏幕上键入的内容。这两个子程序继续循环,以便在屏幕上显示您键入的内容。基本上是输入和输出。
我需要帮助创建另外两个名为read_string和output_string的子程序,它们将利用上述两个函数(read_character和output_character)在用户输入字符串后显示字符串。就像用户输入字符串并点击ENTER一样,我的显示应该将字符串返回给用户。
以下是我创建的子程序:
U0LSR EQU 0x14 ; UART0 Line Status Register
register EQU 0xE000C000
read_character
LDR r0, =0xE000C014 ;load the flag register to r0
LDRB r1, [r0] ;load byte from r0 to r1
BIC r1, r1, #0xFFFFFFFE ; bit clear and keep the first bit to check RDR
CMP r1, #0 ;compare to 0
BEQ read_character ;if 0 go back to read_character
LDR r6, =register ;if not 0, then continue and save what is in 0xE000C000 in r6
LDR r2, [r6]
;if 1 => read the byte from recieve register
;stop
output_character
LDR r0, =0xE000C014 ;load the flag register to r0
LDRB r1, [r0] ;load the byte
BIC r1, r1, #0xFFFFFFDF ;bit clear and keep the 5th bit, which is the THRE bit
MOV r1, r1, LSR #4 ;right shift to set the fifth bit as first
CMP r1, #0 ;compare to 0
BEQ output_character
LDR r6, =register
STR r2, [r6]
B read_character ;branch back to read_character to read and transmit next character
LDMFD sp!, {lr}
BX lr
答案 0 :(得分:0)
我猜你当前的程序是一个简单的无限循环,只需取输入字符并将其放在UART的输出FIFO上。
您想要对新程序做什么需要做几件事。
read_character
需要循环自身,直到检测到ENTER。查看ASCII表,了解ENTER的编码方式。
此外,read_character
现在必须将其数据存储在某处,直到按下ENTER键。
一种可能的方法是写入特定的内存位置,递增每次写入。你如何选择这样的记忆位置?该位置有哪些要求?
但是,您现在需要一种方法来与output_character
进行通信,无论是字符列表的结尾还是您收到的字符数。
什么时候应该突破循环并继续output_character
?会有什么副作用?
output_character
以从便笺簿位置读取一个字符并前进一个字节,直到它到达列表末尾,或者您发送的字符数等于您收到的数量。你怎么能轻易做到这一点?查看提示的ARM寻址模式。
循环回read_character
,需要重置哪些值,为什么?