簡體   English   中英

如何通過顯式節存儲將字符串文字傳遞給函數

[英]How to pass a string literal to a function with explicit section storage

如果您之前曾問過這個問題,請原諒,但我找不到類似的問題。

問題是這樣的:對於某個微控制器,我需要選擇的字符串文字位於默認.rodata節以外的其他節中。 “其他”部分將放入閃存中(一次只能讀取4個字節,因此不能自由使用,該功能需要了解這一事實),而.rodata部分將被復制到ram很有用,因為可以讀取ram時沒有對齊限制,但是它的大小非常有限。

我現在使用的構造是這樣的:

#define roflash __attribute__((section(".flash.rodata"))) __attribute__((aligned(sizeof(char*))))  

static roflash const char literal[] = "text";

(+當然是對加載程序腳本的修改)。

這按預期工作。 但這意味着對於每個字符串處理函數,我都會這樣調用:

static roflash const char literal[] = "text";
do_something(literal);

聖杯是可以將兩者結合為一個“黑匣子”構造的東西,因此我可以編寫do_something_roflash("text") ;

我猜可能是帶有#define和代碼塊的東西,因此可以重復使用相同的變量名。 但是后來我陷入了困境,因為某些函數具有可變數量的參數,所以這樣的事情將不起作用:

#define function_roflash(s) { \
static roflash const char str[] = s; \
function_roflash_implementation(s); \
}

實際上,我想我需要一個可變參數#define,這存在嗎?

其他解決方案也非常受歡迎。

謝謝。

一個有點通用的GCC可變參數宏的想法是:

#define roflash(func, str, ...) { \
    static roflash const char s[] = str; \
    func(s, __VA_ARGS__); \
}

僅使用一個宏,您就可以支持許多接受一個字符串常量作為第一個參數的函數:

roflash(printf, "%d", 42);
roflash(do_something, "text");
roflash(obj.write, "text");
roflash(obj->write, "text");

暫無
暫無

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

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