我正在嘗試在 C 程式中的特定閃存地址處嵌入一個 .bin 檔案(我使用的是 IAR IDE)。我找到了一個指南,它提供了一些關于如何在 C 代碼中使用 .incbin 來做到這一點的幫助(
要將影像放置在閃存中的特定位置,您需要編輯聯結器組態檔以將部分(.mybin在我的示例中)的內容放置在所需的地址處。例如,如果您想將它放在 address 中0x9000,請將以下行添加到您的 .icf-file.txt 中。
place at address mem:0x9000 { ro section .mybin };
uj5u.com熱心網友回復:
簡單且獨立于工具鏈的方法是從二進制資料生成 C 代碼(或匯編)陣列,然后以正常方式編譯并將其鏈接到您的代碼。
撰寫您自己的工具來做到這一點是微不足道的,但已經有一些工具可以為您做到這一點。例如,SRecord工具套件包括此功能:
srec_cat mybinary.bin -binary -o mybinary.c -C-Array mybinary -INClude
將生成兩個包含表單代碼的檔案(省略示例 - 您的輸出會有所不同):
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
mybinary.h
#ifndef SRC_MYBINARY_H
#define SRC_MYBINARY_H
extern const unsigned long mybinary_termination;
extern const unsigned long mybinary_start;
extern const unsigned long mybinary_finish;
extern const unsigned long mybinary_length;
extern const unsigned char mybinary[];
#endif /* SRC_MYBINARY_H*/
SRecord 工具復雜而神秘,但非常強大,可用于各種二進制和目標檔案的轉換和操作。如果您更喜歡只完成這項作業的更簡單的東西,那么“二進制到 C 代碼”是一個合適的搜索詞。我過去專門用過的例子:
- https://www.segger.com/free-utilities/bin2c/
- https://sourceforge.net/projects/bin2c/
它們都生成與上述大致相似的代碼。
如果您需要在特定位置定位二進制文??件,您將需要使用您的工具鏈特定方法修改生成的代碼。例如對于 IAR:
#pragma location=0x8020000
const unsigned char mybinary[] =
{...} ;
或者
const unsigned char mybinary[] @ 0x8020000 =
{...} ;
同樣,您可以在用戶定義的聯結器部分中定位資料 - 允許聯結器確定:
const unsigned char mybinary[] @ "BIN_SECTION" =
{...} ;
不同工具鏈的語法有所不同。我還沒有嘗試過,但 SRecord-C-Array過濾器具有?POSTfix string和?PREfix string修飾符,可用于在生成中添加工具鏈特定的擴展(如果經常修改二進制檔案,這很方便)。然而,IAR 語法沒有很好的定義,所有的例子都是這樣的:
<type> <symbol> @<location> = <initialiser> ;
“中綴”不是前綴或后綴也是如此。可能是這樣:
<type> <symbol> = <initialiser> @<location> ;
是有效的,但就我所知,手冊沒有正式指定語法,而且我沒有測驗工具。如果確實有效,那么:
srec_cat mybinary.bin -binary -o mybinary.c -C-Array mybinary -INClude -POSTfix "@ 0x8020000"
const unsigned char mybinary[] =
{...} @ 0x8020000 ;
對于聯結器部分位置:
-POSTfix `@ "BIN_SECTION"`
如果此語法不起作用,您可以撰寫自己的工具來修改生成的代碼,并將兩者作為自定義構建步驟運行以實作自動化,或者使用文本處理工具(例如sed插入位置資訊)。例如:
sed 's/mybinary\[\] =/mybinary\[\] @ 0x8020000 =/' mybinary.c
在 mybinary.c 中替換char mybinary[] =為char mybinary[] @ 0x8020000 =
通常,除非資料要由一些獨立鏈接的代碼代碼訪問,或者將獨立于代碼進行修補/更新,否則沒有必要將資料定位在特定位置,您應該讓聯結器定位它以在工具鏈和運行時環境。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/381531.html
下一篇:是什么導致CPU在此函式中掛起?
