Tanggapan pada Masalah Scatter File di Proyek ARM7

Tanggapan pada Masalah Scatter File di Proyek ARM7

=====================================================

Pengembangan aplikasi berbasis ARM7 memerlukan penggunaan scatter file untuk mengatur lokasi dan ukuran area eksekusi. Dalam proyek saya, saya memiliki masalah ketika mencoba membuat scatter file yang sesuai dengan aplikasi.

Masalah

Saya mendapatkan error berikut saat mencoba membuat aplikasi:
.\Builds\Outfile.axf: error: L6031U: Could not open scatter description file .\Builds\Outfile.sct: No such file or directory

Pada bagian "Options for Target" dan klik pada tab Linker, field "scatter file" berisi nilai sebagai berikut: .\Builds\Outfile.sct. Saya memiliki salah satu baris di string kontrol linker sebagai berikut:
C:\Keil\ARM\RV31\LIB\RTX_ARM_L.LIB –strict –scatter ".\Builds\Outfile.sct"

Saya juga memiliki file "Outfile47" dengan ekstensi "Windows Script Component". Apakah ini scatter file?

Mengatasi Masalah Scatter File

Saya mencoba menyelesaikan masalah ini dengan mengembangkan scatter file yang sesuai. Berikut adalah kode scatter file saya:
ROOT 0x00020200 0x000DFDFC
{
ITCM 0x00020200
{
ssw01fiq.o (Startup, +First)
startup.o (+RO)
ssw01irq.o (+RO)
}

EXEC_REST +0
{

  • (+RO)
    }

DTCM 0x00400000 {startup.o (StartOfRAM, +First)}

SCT +0x348
{
ibmp_slot.o* (+ZI);
}

INIT_CALL +0
{

  • (INIT)
    }

SRAM +0
{

  • (+RW, +ZI)
    startup.o* (DummyStack, +Last)
    }

JUSTAFTERRAM 0x00410000
{
startup.o* (JustAfterRAM)
}

JUSTAFTERROM 0x00100000
{
startup.o* (JustAfterROM)
}
}

Menambahkan Region Eksekusi Baru

Saya ingin menambahkan region eksekusi baru yang disebut INIT_CALL dan kemudian mendefinisikan pointer ke fungsi init pada source code. Saya menggunakan makro seperti berikut:

typedef int (*_init_fn) (void);
#define component_init(__fn) static _init_fn fn __attribute__((section ("INIT"))) = __fn

Pada salah satu file .c, saya menggunakan definisi ini untuk menginisialisasi fungsi init.

component_init(productUiInitialize);
void dump_fn()
{
 printf("Here we have, fn=0x%08X, addr=0x%08X\n", fn, &fn);
}

Pada file .c lainnya, saya melakukan hal yang sama:

extern int productUiInitialize(void);
_init_fn *test = (_init_fn *)0x00400F78;
void do_init_calls( void )
{
 dump_fn();
 printf("FUNC=0x%08X, INITCALL=0x%08X, ADDR=0x%08X\n",productUiInitialize, *test, test);
}

Keluaran yang Aneh

Pada akhirnya, saya mendapatkan keluaran yang aneh. Saya melihat bahwa pointer saya tidak diinisialisasi dengan benar dan memiliki nilai NULL. Kemudian, saya melihat bahwa jika saya menggunakan const dalam definisi pointer, maka nilai addr adalah 0x00400F78 dan value adalah alamat productUiInitialize. Namun, pada file .c lainnya, nilai test adalah 0x00400F78, tapi ketika saya mendereferensinya, saya mendapatkan NULL (saya mengharapkan memiliki productUiInitialize).

Jawaban

Saya menemukan bahwa jika saya mempertahankan section INIT di dalam SRAM, maka aplikasi berfungsi seperti yang diharapkan. Namun, saya tidak tahu cara mengenakan alamat awal dan ukuran section ini. Saya juga mendapatkan hasil yang aneh ketika saya menginisialisasi variabel dengan nilai 0x00400F78.

Pertanyaan

Saya memiliki dua pertanyaan:

  1. Apa penyebab behavior ini? Mengapa pointer tidak diinisialisasi dengan benar jika saya mempertahankan section INIT di dalam SRAM?
  2. Bagaimana cara mengenakan alamat awal dan ukuran section ini?

Solusi

Saya masih belum menemukan solusi yang tepat untuk masalah ini. Saya harap dapat mendapatkan jawaban dari komunitas pengembang ARM7.

Terima kasih atas perhatian Anda!

Leave a comment