首先,我使用的是arm cm3核心芯片,我的代码功能是Shift操作。例如,UART接收“f0”,将“0f”保存到相应地址。代码如下。
void UARTRXHandler(void) {
volatile uint32_t *ramstoreaddr = RAM_START_ADDR ;
unsigned char rxchar;
uint32_t ch;
if (uart_GetRxIRQStatus(UART) != 0) { // 检查接收中断状态 Check the receiving interrupt status
rxchar = uart_ReceiveChar(UART); // 从 UART 接收字符 Receives characters from UART
uart_ClearRxIRQ(UART); // 清除接收中断标志 Clear the receive interrupt flag
ch = ((rxchar & 0x0F) << 4 ) | ((rxchar & 0xF0) >> 4 );
*ramstoreaddr = ch; // 存储字符到内存 Stores characters to memory
ramstoreaddr++;
}
这是我接收rxd数据时的中断函数。 理论上,当rxd的数据到来时,它会跳转到中断函数,而“ramstoreaddr”不会改变。
顺便说一下,RAM_START_ADDR也在另一个头文件中定义了。
#define RAM_START_ADDR (volatile uint32_t *)0x21001000
当rxd发送“0f”然后“1f”“2f”“3f”时,地址仍然保持在0x21001000。(你可以在图片中看到它)
rxd 来自测试平台,它可以正确发送“0f”“1f”“2f”“3f”。
地址仍然是第一张图片的0x21001000你可以在ADDR中看到1000,它指的是0x21001000
我尝试在同一个 c 文件中对函数进行声明和初始化,如下所示:
volatile uint32_t *ramstoreaddr = RAM_START_ADDR ;
void UARTRXHandler(void) {
unsigned char rxchar;
uint32_t ch;
if (uart_GetRxIRQStatus(UART) != 0) { // 检查接收中断状态 Check the receiving interrupt status
rxchar = uart_ReceiveChar(UART); // 从 UART 接收字符 Receives characters from UART
uart_ClearRxIRQ(UART); // 清除接收中断标志 Clear the receive interrupt flag
ch = ((rxchar & 0x0F) << 4 ) | ((rxchar & 0xF0) >> 4 );
*ramstoreaddr = ch; // 存储字符到内存 Stores characters to memory
ramstoreaddr++;
}
结果变成图片这样,没有处理好。
写错了f大家可以看图,和上图对比一下,HWDATA的“f”之后,变成了0,HADDR是4,应该写在0x21001000(HADDR里是1000)
它将地址更改为我从未设置过的另一个地址。
您的第一个示例似乎不会增加
ramstoreaddr
,因为 ramstoreaddr
被定义为局部变量,因此每次执行 UARTRXHandler
时都会重新初始化。
您的第二个示例将
ramstoreaddr
定义为静态变量,因此它将在 UARTRXHandler
的范围之外保持其值。 我怀疑每次 ramstoreaddr
收到一个字符时 UARTRXHandler
都会增加 sizeof(uint32_t) 。 您打算将地址增加 4 个字节吗?
您可能误解了第二个示例的 RAM 信号。 看看函数的反汇编从第一个示例到第二个示例有何变化。 第一个示例可能将
ramstoreaddr
保留在 CPU 寄存器中,因此不会从 RAM 中读取该值。 第二个示例可能有更多不同的指令,用于在写入该地址之前从 RAM 中读取 ramstoreaddr
的值。 也许额外的 RAM 访问会混淆您的解释。
为什么你要尝试通过查看 RAM 信号来调试它? 使用调试器工具会更容易。