[英]How to embed a bin file in a C program
我正在嘗試在 C 程序中的特定 flash memory 地址中嵌入 a.bin 文件(我正在使用 IAR IDE)。 I have found a guide that gives some help on how to do this using.incbin in C code ( http://elm-chan.org/junk/32bit/binclude.html ) and also an example on Git Hub ( https:/ /github.com/kuopinghsu/incbin )但是他們的解釋有點稀疏,我真的很想要一個分步指南,因為我是新手。
我已經完成了徹底的谷歌搜索,但我找不到任何這樣做的東西。 如果有人能指出我錯過的指南的方向或發布簡短摘要,我將不勝感激。
如果您 go 在 linker 選項對話框(項目>選項>鏈接器>輸入)中輸入選項卡,則可以添加原始圖像輸入文件。 對於每個文件,您可以指定一個開始符號(在您的 C 代碼中引用)、一個 elf 部分名稱(在您的 linker 配置中引用)和任何 alignment 要求。 為了確保圖像包含在最終應用程序中,即使您的 C 代碼沒有按名稱引用它,您還需要在保留框中添加開始符號。 一個例子如下所示。
要將圖像放置在 flash 中的特定位置,您需要編輯 linker 配置文件以將部分的內容(在我的示例中為.mybin
)放置在所需的地址。 例如,如果您想將其放置在地址0x9000
中,則將以下行添加到您的.icf
文件中。
place at address mem:0x9000 { ro section .mybin };
簡單且獨立於工具鏈的方法是從二進制數據生成 C 代碼(或匯編)代碼數組,然后以正常方式編譯並將其鏈接到您的代碼。
編寫你自己的工具來做到這一點是微不足道的,但已經有工具可以為你做到這一點。 例如, SRecord工具套件包括此功能:
srec_cat mybinary.bin -bin -o mybinary.c -C-Array mybinary -INClude
將生成兩個包含格式代碼的文件(省略的示例 - 您的 output 會有所不同):
mybinary.c
/* http://srecord.sourceforge.net/ */
const unsigned char mybinary[] =
{
0xC0, 0x91, 0x00, 0x20, 0xA5, 0x01, 0x00, 0x08, 0xB1, 0x11, 0x00, 0x08,
...
0x31, 0x31, 0x30, 0x31, 0x30, 0x30, 0x2E, 0x30, 0x31, 0x2E, 0x30, 0x35,
0x2E, 0x30, 0x30, 0x00,
};
const unsigned long mybinary_termination = 0x00000185;
const unsigned long mybinary_start = 0x00000000;
const unsigned long mybinary_finish = 0x00004000;
const unsigned long mybinary_length = 0x00004000;
#define MYBINARY_TERMINATION 0x00000185
#define MYBINARY_START 0x00000000
#define MYBINARY_FINISH 0x00004000
#define MYBINARY_LENGTH 0x00004000
我的二進制文件
#ifndef SRC_BOOTLOADER_H
#define SRC_BOOTLOADER_H
extern const unsigned long bin_bootloader_termination;
extern const unsigned long bin_bootloader_start;
extern const unsigned long bin_bootloader_finish;
extern const unsigned long bin_bootloader_length;
extern const unsigned char bin_bootloader[];
#endif /* SRC_BOOTLOADER_H */
SRecord 工具復雜而神秘,但非常強大,可用於各種二進制和 object 文件轉換和操作。 如果您更喜歡只做這一項工作的更簡單的東西,那么“二進制到 C 代碼”是一個合適的搜索詞。 我過去專門使用的示例:
它們都生成與上面大致相似的代碼。
如果您需要在特定位置定位二進制文件,則需要使用工具鏈特定方法修改生成的代碼。 例如對於 IAR:
#pragma location=0x8020000
const unsigned char mybinary[] =
{...} ;
或者
const unsigned char mybinary[] @ 0x8020000 =
{...} ;
同樣,您可以在用戶定義的 linker 部分中找到數據 - 允許 linker 確定位置:
const unsigned char mybinary[] @ "BIN_SECTION" =
{...} ;
跨工具鏈的語法不同。
一般來說,除非數據要通過一些獨立鏈接的代碼代碼訪問,或者將獨立於代碼進行修補/更新,否則無需將數據定位為特定位置,您應該讓 linker 定位它以便在工具鏈和運行時環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.