保护填充从 STM32F429I 中的 SRAM 读取的缓冲区

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

我正在尝试使用 stm32F4 在下降中断时从总线系统读取缓冲区。问题是我需要在主循环中处理数据,并且我不需要任何延迟,下降中断发生在 500ns,我不想错过任何数据。因此,禁用启用中断在这里不会有任何好处。

我正在寻找一种方法来减少延迟,并且不会错过任何中断。 这是我的方法:

在主循环中:

    while (1)
    {
        if(iowr_set)
        {
            iowr_set = 0;
              for (int i = 0; i < BUFFER_SIZE; i++)
              {
                  processData(aRxBuffer[i]);
              }

        }
}

中断:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {


    if (GPIO_Pin == GPIO_PIN_6) { // IORD

        HAL_SRAM_Read_16b(&hsram1, (uint32_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR), aRxBuffer, BUFFER_SIZE);

        iowr_set = 1;
    }
}

声明:

#define BUFFER_SIZE         ((uint32_t)0x0100)
#define WRITE_READ_ADDR     ((uint32_t)0x0800)

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
SRAM_HandleTypeDef hsram1;
FMC_NORSRAM_TimingTypeDef SRAM_Timing;

/* Read/Write Buffers */
volatile uint16_t aRxBuffer[BUFFER_SIZE];
c embedded stm32 interrupt
1个回答
0
投票

您的STM32F429可以以180MHz的最大时钟速度运行。这意味着,假设每条指令需要一个时钟周期,您可以在 1us 内执行 180 条指令,或在 500ns 内执行 90 条指令。

您的目标是在 500 纳秒内处理 256 个字节,即 64 个 32 位字。所以你需要能够处理 90 条指令中的 64 个字。

让我们想象一下,当时你只是想从记忆中读出这些单词。因此,让我们将代码简化为这样:

#include <stdint.h>

void read_data(uint32_t * data)
{
    for (int i = 0; i < 256; ++i)
    {
        volatile uint32_t datum = data[i];
        // No processing
    }
}

这段代码甚至可以读取 90 条指令中的 64 个字吗?可能不会。看起来像这样的简单方法每个字需要大约 4 条指令。 https://godbolt.org/z/MarW37qvq

您可以展开循环,也许(只是也许)能够以所需的速度从 RAM 中读取数据。但这是在根本没有进行任何处理的情况下。 最重要的是,您需要调用

HAL_SRAM_Read_16b()

,这本身可能需要数百甚至数千个时钟周期。而且您正在使用中断,这会增加更多开销。

你想做的事情基本上是不可能的。您需要降低数据速率,或者忍受丢失一些数据的情况。

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