簡體   English   中英

用零初始化大結構需要多少個 Cortex-M7 CPU 周期?

[英]How many Cortex-M7 CPU cycles can it take to initialize big structure with zeros?

我的結構很大,數組很少。 為簡單起見,讓我們考慮這樣的結構:

typedef struct {
    uint32_t data_count;
    uint8_t data[512];
    uint32_t error_count;
    uint8_t errors[512];
} measurements_t;

用零初始化 ~1kB 結構需要多少微控制器 CPU 周期?

我想知道是否應該用零初始化整個結構(在聲明后分配所需的數據)?

Cortex-M7 內核是否有任何匯編語言指令可以用零填充內存? 我不是匯編人員,我在本手冊中找不到任何內容,目前我無法訪問適當的編譯器來檢查編譯器生成的匯編。

measurements_t measurement_results = {0};    // initialization with all zeroes

// or

measurements_t measurement_results;          // no initialization
measurement_results.data_count = 0;
measurement_results.error_count = 0;

事實上,我的結構更復雜,層次很少,數據可能更多。

如果我只使用 {0} 對其進行初始化,以后管理代碼會更容易,但如果這在 STM32F7 上是循環昂貴的 - 我將不得不創建快速構造函數,僅在此類結構真正需要的地方放置零。

根據我的經驗,最快的方法是一個接一個地列出一長串 64 位存儲指令。

typedef struct {
    uint32_t data_count;
    uint8_t data[512];
    uint32_t error_count;
    uint8_t errors[512];
} measurements_t;


void zoo(measurements_t *m)
{
    uint64_t *x = (uint64_t *)m;
    #pragma GCC unroll sizeof(*m) / sizeof(*x)
    for(int i = 0; i < sizeof(*m) / sizeof(*x); i++)
        x[i] = 0;
}

https://godbolt.org/z/6Wv1dYxfP

使其更快地將代碼放入 ITCM 內存,如果可能,將結構放入 DTCM 內存。 它將地址和數據總線分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM