我正在做一个简单的程序,它在传入的传输上读取UART缓冲区(S0BUF),然后在按下按钮时通过UART将其传回。 我使用的是Nordic Semiconductor nRF24LE1芯片。
我使用C工作,当我使用其中一个R0-R7寄存器时,我可以使用它。 我想要做的是使用可重定位的字节而不是普通的R寄存器。
以下是一段可行的代码。
UART_ISR: ; (Store incoming transmission in R0)
JNB RI0, UART_ISR_A
MOV R0, S0BUF
SETB P00
CLR RI0
JMP UART_ISR_END
UART_ISR_A:
SETB P01
CLR TI0
UART_ISR_END:
RETI
Main:
MOV A, P2
XRL A, #0x0FE
JZ Main_Case_A
XRL A, #(0x0FE XOR 0x0FD)
JZ Main_Case_B
...
Main_Case_A:
MOV S0BUF, R0
SJMP Main
但是,如果我做了以下更改(标有< --- THIS),它将无法工作。我知道我在这个片段中遗漏了一些片段和内容,但我不想要多行。
?DT?Data segment data ; <--- THIS
rseg ?DT?Data ; <--- THIS
RX_Message: ds 1 ; <--- THIS
UART_ISR: ; (Store incoming transmission in R0)
JNB RI0, UART_ISR_A
MOV RX_Message, S0BUF ; <-- THIS
SETB P00
CLR RI0
JMP UART_ISR_END
UART_ISR_A:
SETB P01
CLR TI0
UART_ISR_END:
RETI
Main:
MOV A, P2
XRL A, #0x0FE
JZ Main_Case_A
XRL A, #(0x0FE XOR 0x0FD)
JZ Main_Case_B
...
Main_Case_A:
MOV S0BUF, RX_Message ; <--- AND THIS
SJMP Main
它汇总了所有内容而没有任何警告或错误,但结果却不一样。
我想要的是让汇编器/链接器决定在哪里放置我的RX_Message字节。 如果我查看列表文件,我可以看到它将它分配给地址0x00,这对我来说很好,因为我没有在任何地方使用R0 ..但我假设如果我在某处使用R0,它会将我的RX_Message地址设置为0x01(或其他东西)......但这并没有发生。
我错过了什么?或者我做错了吗?
答案 0 :(得分:0)
解.. 堆栈当然涉及,因为我正在使用中断(没有提到,因为我认为这不重要。添加一些代码来重新定位堆栈解决了问题。虽然我希望链接器不会有将我的RX_Message标签放在堆栈的默认地址上..