Unter Linux ist die cmd-Datei die Link-Befehlsdatei, die die Konfigurationsinformationen des Linkers speichert und als Befehlsdatei bezeichnet werden kann. Die Funktion der cmd-Datei besteht darin, anzugeben, wie das Programm verknüpft werden soll. Die cmd-Datei besteht aus zwei Teilen: MEMORY und SECTIONS: MEMERY wird verwendet, um den Namen, die Startadresse und die Länge jedes Speicherblocks zu definieren. SECTIONS wird hauptsächlich verwendet, um zu beschreiben, welches Segment welchem Segment des Speicherplatzes zugeordnet ist.
cmd-Dateien sind Linker-Befehlsdateien und enden mit dem Suffix .cmd.
Der professionelle Name von CMD ist Linker-Konfigurationsdatei, in der die Konfigurationsinformationen des Linkers gespeichert sind. Wir nennen sie kurz Befehlsdatei. Wie aus dem Namen hervorgeht, besteht der Zweck dieser Datei darin, anzugeben, wie das Programm verknüpft werden soll.
Dann wissen wir, dass beim Schreiben eines TI-DSP-Programms das Programm in viele Segmente wie Text, BSS usw. unterteilt werden kann und jedes Segment eine andere Rolle hat. Beim eigentlichen Ablauf im Film ist auch der Schauplatz ein anderer. Beispielsweise sollte Textcode im Allgemeinen im Flash platziert werden, während BSS-Variablen im RAM platziert werden sollten. usw. Bei verschiedenen Chips sind jedoch die Start- und Endadressen jedes Speichers unterschiedlich. Darüber hinaus weiß der Linker nicht, wo in welchem Speicher der Benutzer einen bestimmten Abschnitt platzieren möchte, insbesondere einen benutzerdefinierten Abschnitt. Um dem Linker die Zuweisung des zu verwendenden internen Speicherplatzes des Chips und den spezifischen Speicherort jedes Programmabschnitts mitzuteilen, muss eine Konfigurationsdatei, also eine CMD-Datei, geschrieben werden. Die
cmd-Datei besteht aus zwei Teilen: MEMORY (d. h.: Speicher) und SECTIONS (d. h.: Segmente). MEMERY wird verwendet, um den Namen, die Startadresse und die Länge jedes Speicherblocks zu definieren. Abschnitte werden hauptsächlich verwendet, um zu beschreiben, welches Segment welchem Segment des Speicherplatzes zugeordnet ist. Der Speicher kann in PAGE0 (Programmspeicherplatz) und PAGE1 (Datenspeicherplatz) unterteilt werden, PAGE (dh: Frame).
Die oben genannten Segmente können in zwei Kategorien unterteilt werden: initialisierte Segmente und nicht initialisierte Segmente. Das initialisierte Segment enthält die eigentlichen Anweisungen und Daten und wird im Programmspeicherbereich gespeichert. Das nicht initialisierte Segment reserviert nur den Adressraum der Variablen. Das nicht initialisierte Segment hat keinen echten Inhalt. Daten werden während der Ausführung des Programms in die Variable geschrieben und im Datenspeicherbereich gespeichert. In der C-Sprache gibt es viele definierte Segmente, z. B. „.text“, „.const“ und „.system“. Für diese definierten Segmente gibt es viele Erklärungen dazu im Internet, daher werde ich hier nicht näher darauf eingehen. In diesem Artikel erfahren Sie als Nächstes, wie Sie als Benutzer selbst Segmente definieren.
Kommentare können in die cmd-Datei geschrieben werden, umgeben von „/*“ und „*/“, aber „//“ ist nicht zulässig, was sich von der C-Sprache unterscheidet.
Um cmd-Dateien zu schreiben, müssen wir zwei Pseudoanweisungen MEMORY und SECTIONS verwenden (muss großgeschrieben werden).
Die Syntax von MEMORY und SECTION finden Sie online. In diesem Artikel werden die Inhalte von MEMORY und SECTION anhand konkreter Beispiele erläutert.
Erklären Sie SPEICHER anhand der vom Autor verwendeten cmd-Datei von F28335.
MEMORY { PAGE 0: /* Program Memory */ /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */ RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */ RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */ RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */ RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */ ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */ ZONE7A : origin = 0x0200000, length = 0x00FC00 /* XINTF zone 7 - program space */ FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */ FLASHG : origin = 0x308000, length = 0x008000 /* on-chip FLASH */ FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */ FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */ FLASHD : origin = 0x320000, length = 0x008000 /* on-chip FLASH */ FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */ FLASHA : origin = 0x338000, length = 0x007F80 /* on-chip FLASH */ CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */ BEGIN : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */ CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */ OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */ ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */ IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */ IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */ FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */ ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */ RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */ VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */ PAGE 1 : /* Data Memory */ /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */ /* Registers remain on PAGE1 */ BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */ RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */ RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */ RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */ RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */ RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */ ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */ FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */ }
Sie können sehen, dass MEMORY normalerweise PAGE0 enthält und PAGE1 in PAGE0 den Speicherplatz mit einer Startadresse von 0x008000 und einer Speicherplatzlänge von 0x001000 darstellt. Auf die gleiche Weise können wir die Bedeutung anderer Speicherplatznamen kennen.
Beim Vergleich des TI28335-Chipdatenhandbuchs (nur ein Teil davon wurde abgefangen) können wir erkennen, dass das Schreiben der obigen cmd-Datei auf dem Speicherzuordnungsabschnitt des TI28335-Chipdatenhandbuchs basiert. Wir können auch auf den Abschnitt zur Speicherzuordnung im Chipdatenhandbuch verweisen, um die cmd-Datei zu schreiben.
Als nächstes erklärt der Autor den in ABSCHNITT enthaltenen Inhalt. Am Beispiel der cmd-Datei von F28335 können Sie sehen, dass ABSCHNITT verschiedene Abschnittsnamen enthält. Nehmen Sie als Beispiel „.text“ ist das nach der Kompilierung generierte binäre Befehlscodesegment. Sie können sehen, dass wir den Inhalt in „.text“ zur Speicherung zuordnen und sich FLASHA in PAGE0 im SPEICHER befindet.
Die RAM-Funktionen in ABSCHNITT beziehen sich auf den Start von 28335. Ihr Kern besteht darin, den Benutzercode beim Einschalten und Ausführen über den „Bootstrap“ von FLASH zu lesen, ihn im RAM zu speichern und im RAM auszuführen, wodurch das Problem gelöst wird Aufgrund der langsamen ROM-Lese- und Schreibgeschwindigkeit ist es schwierig, das Problem des Datenverlusts zu lösen, wenn Hochgeschwindigkeits-Smartchips und RAM an Leistung verlieren.
Benutzerdefiniertes SegmentÜbergeben Sie #pragma DATA_SECTION (Funktionsname oder globaler Variablenname, „benutzerdefinierter Segmentname im Datenraum“) oder #pragma CODE_SECTION (Funktionsname oder globaler Variablenname, „benutzerdefinierter Segmentname im Programmraum“). Benutzerdefiniertes Segment Namen können implementiert werden, um Speicherplatz frei zuzuweisen.
#pragma DATA_SECTION (für Variablen)
#pragma CODE_SECTION (für Funktionen)
但使用以上指令时需注意:不能在函数体内声明必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化。
下面结合实际使用例子来具体讲解:
#pragma DATA_SECTION(FFT_output, "FFT_buffer1"); float FFT_output[FFT_SIZE];
笔者声明了一个数据段,段名为FFT_buffer1,段的内容在变量FFT_ouput里。而声明后才定义变量FFT_output的大小。
我们如果想要使用这个自定义的段,接下来我们还要在CMD文件的SECTION中指定FFT_buffer1的存储空间。
FFT_buffer1 : > RAML4, PAGE = 1
通过以上几条语句,笔者实现了将变量的内容存放入指定的RAML4存储空间的操作。
从上可以得出,当全局变量所占内存过大时,我们可以通过自定义段选择有所余裕的存储空间的方式,从而来解决内存不足的问题。
Das obige ist der detaillierte Inhalt vonWelche Funktion hat die cmd-Datei unter Linux?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!