[英]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.