簡體   English   中英

如何在 C 程序中嵌入 bin 文件

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

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