如何让我的地址添加到每个中断函数中?

问题描述 投票:0回答:1

首先,我使用的是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

地址仍为0x21001000第二张图片

地址仍为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)

写错了1f

它将地址更改为我从未设置过的另一个地址。

c pointers embedded interrupt cortex-m
1个回答
0
投票

您的第一个示例似乎不会增加

ramstoreaddr
,因为
ramstoreaddr
被定义为局部变量,因此每次执行
UARTRXHandler
时都会重新初始化。

您的第二个示例将

ramstoreaddr
定义为静态变量,因此它将在
UARTRXHandler
的范围之外保持其值。 我怀疑每次
ramstoreaddr
收到一个字符时
UARTRXHandler
都会增加 sizeof(uint32_t) 。 您打算将地址增加 4 个字节吗?

您可能误解了第二个示例的 RAM 信号。 看看函数的反汇编从第一个示例到第二个示例有何变化。 第一个示例可能将

ramstoreaddr
保留在 CPU 寄存器中,因此不会从 RAM 中读取该值。 第二个示例可能有更多不同的指令,用于在写入该地址之前从 RAM 中读取
ramstoreaddr
的值。 也许额外的 RAM 访问会混淆您的解释。

为什么你要尝试通过查看 RAM 信号来调试它? 使用调试器工具会更容易

© www.soinside.com 2019 - 2024. All rights reserved.