Ответ 1
Итак, после того, как через 10 часов была проведена отладка, я, наконец, заработал. Проблема была в компоновщике script. Однако это не было в разделе bss, которое я опубликовал, но в разделе "Текст и данные". Здесь работает script.
OUTPUT_FORMAT("elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_startup)
MEMORY
{
rom (rx) : ORIGIN = 0x00000000, LENGTH = 512K
ram (rwx) : ORIGIN = 0x10000000, LENGTH = 32K
}
/* Define the top our stack at the end of SRAM */
_end_stack = 0x10008000;
EXTERN(__interrupt_vector_table);
SECTIONS
{
.text :
{
/* Insert the interrupt vector table first */
__interrupt_vector_table = .;
*(.interrupt_vector_table)
/* Startup assembly */
*(.startup)
/* Rest of the code (C) */
*(.text) *(.text.*) *(.glue_7) *(.glue_7t)
*(.vfp11_veneer)
*(.ARM.extab* .gnu.linkonce.armextab.*)
*(.rodata) *(.rodata.*)
. = ALIGN(8);
_end_text = .;
_start_datai = .;
} >rom
.data :
{
_start_data = .;
*(vtable)
*(.data) *(.data.*)
. = ALIGN (8);
_end_data = .;
} >ram AT >rom
.data_init : { _end_datai = .; } >rom
__exidx_start = .;
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > rom
__exidx_end = .;
.bss :
{
_start_bss = .;
*(.bss)
*(COMMON)
} >ram
. = ALIGN(4);
_end_bss = .;
. = ALIGN(256);
_start_heap = .;
PROVIDE( __cs3_heap_start = _start_heap);
/* Linker wants .eh_frame section defined because of gcc 4.4.X bug,
* just discard it here. */
/DISCARD/ : { *(.eh_*) }
}
_end = .;
PROVIDE(end = .);
Мне также пришлось добавить некоторую инициализацию переменной в код инициализации:
extern unsigned int _start_data;
extern unsigned int _end_data;
extern unsigned int _start_datai;
extern unsigned int _end_datai;
void init(void) {
// (...) Other stuff
// Initialize Global Variables
uint32_t* data_begin = (uint32_t*) &_start_data;
uint32_t* data_end = (uint32_t*) &_end_data;
uint32_t* datai_begin = (uint32_t*) &_start_datai;
uint32_t* datai_end = (uint32_t*) &_end_datai;
while(data_begin < data_end)
{
*data_begin = *datai_begin;
data_begin++;
datai_begin++;
}
Эти две страницы были весьма полезными, хотя мне все еще было много, чтобы понять, что происходит: http://fun-tech.se/stm32/linker/index.php и http://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/473/t/44452.aspx?pi23648=1
Я надеюсь, что это может быть полезно для кого-то другого, испытывающего те же проблемы, с которыми я столкнулся.