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