Как использовать глобальную переменную во встроенной сборке в компиляторе Greenhills?

Я хочу использовать глобальную переменную во встроенной сборке.

asm(" LDR R0,g_TsInitStackPointerAddress");

Здесь g_TsInitStackPointerAddress — глобальная переменная. При компиляции ошибок не показывает.

Но при подключении выдает следующую ошибку

[elxr] (ошибка) вне диапазона: 0x1001326 (без знака) не помещается в 12 бит при выполнении типа перемещения R_ARM_POOL (4) по адресу 0x10013e0 из InitStack+0x20 (drv.o(.text)+0x1a4) в g_TsInitStackPointerAddress +0x0 ((ОБЫЧНЫЙ)+0xb6)

Здесь мое имя функции — InitStack, а имя файла — drv. Я не могу понять ошибку.

Используемый процессор: Cortex R4
Компилятор: Greenhills


person suraj    schedule 26.06.2012    source источник
comment
Кажется, ваша переменная слишком мала? Возможно, вам следует проверить размер регистра R0 и размер вашей переменной.   -  person RedX    schedule 26.06.2012


Ответы (1)


Получил решение

__asm("g_TsInitStackPointerAddress_a: DCD g_TsInitStackPointerAddress");

Дайте этот оператор внутри этой функции, тогда он примет эту переменную во встроенной сборке.

person suraj    schedule 29.06.2012
comment
Я считаю, что более безопасный способ сделать это — использовать псевдоинструкцию ldr=, как показано здесь: blogs.arm.com/software-enablement/ Это позволит ассемблеру решить, где разместить постоянный пул (например, после окончания функции), а не заставлять вас размещать его вручную самостоятельно. - person Quuxplusone; 05.02.2013