2013-08-02 13 views
0

Сравнение двух микросхем Thumb-2 от двух разных производителей. Один Cortex M3, один A5. Гарантируют ли они компиляцию определенной части кода в один и тот же код?Будут ли микрофоны Thumb-2 ARM-Core от разных производителей обладать одинаковым кодедированием?

+0

все зависит от компилятора. Существуют различные варианты расширений большого пальца2 и в зависимости от того, какой и какой вариант вы сказали компилятору для использования, это то, что он будет использовать. Возможно, у компилятора есть специфические архитектуры, если-then-elses в генерации кода. Простой ответ заключается в том, чтобы «просто попробовать», а затем спросить переполнение стека, «почему это другое» или «почему это не так»? –

+0

производители чипов получают свои ядра от руки, обратите внимание, что у руки разные версии одного и того же ядра, поэтому в этот момент может быть два или три ядра коры головного мозга. и ЕСЛИ есть необходимость в изменении кода между ними (некоторая инструкция не работает или некоторая последовательность команд) и ЕСЛИ компилятор знает, что и так далее. –

+0

Также у вас никогда не будет гарантии того, что разные компиляторы будут генерировать один и тот же вывод с одного и того же входа для одной и той же цели. Даже разные версии одного и того же компилятора не имеют этой гарантии и не будут иметь разных сборок одной и той же версии компилятора, если в сборках есть разные варианты. Использование слова, гарантированного в вашем вопросе, почти автоматически приводит к НЕТ, никаких гарантий. –

ответ

0

так что здесь идет

fun.c

unsigned int fun (unsigned int x) 
{ 
    return(x); 
} 

addimm.c

extern unsigned int fun (unsigned int); 
unsigned int addimm (unsigned int x) 
{ 
    return(fun(x)+0x123); 
} 

для демонстрационных целей строительства для голого металла, на самом деле не функциональной программы, но он компилирует чистый и демонстрирует что я намерен продемонстрировать.

инструкция руки

arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=cortex-a5 -march=armv7-a -c addimm.c -o addimma.o 

разборка объекта, не связанная

00000000 <addimm>: 
    0: e92d4008 push {r3, lr} 
    4: ebfffffe bl 0 <fun> 
    8: e2800e12 add r0, r0, #288 ; 0x120 
    c: e2800003 add r0, r0, #3 
    10: e8bd8008 pop {r3, pc} 

палец родового (ARMV4 или v5 независимо по умолчанию было для этого компилятора сборки)

arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -c addimm.c -o addimmt.o 

00000000 <addimm>: 
    0: b508  push {r3, lr} 
    2: f7ff fffe bl 0 <fun> 
    6: 3024  adds r0, #36 ; 0x24 
    8: 30ff  adds r0, #255 ; 0xff 
    a: bc08  pop {r3} 
    c: bc02  pop {r1} 
    e: 4708  bx r1 

коры -a5, специфический

arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -mcpu=cortex-a5 -march=armv7-a -c addimm.c -o addimma5.o 

00000000 <addimm>: 
    0: b508  push {r3, lr} 
    2: f7ff fffe bl 0 <fun> 
    6: f200 1023 addw r0, r0, #291 ; 0x123 
    a: bd08  pop {r3, pc} 

cortex-a5 - это armv7-a, который поддерживает большой палец-2, так как добавляет немедленный результат и связан с двоичным размером, здесь нет оптимизации, 32 бита для большого пальца и 32 бита для большого пальца2. Но это всего лишь один пример, возможно, времена, когда thumb2 создает меньшие двоичные файлы, чем большой палец.

Cortex-м3

arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -mcpu=cortex-m3 -march=armv7-m -c addimm.c -o addimmm3.o 

00000000 <addimm>: 
    0: b508  push {r3, lr} 
    2: f7ff fffe bl 0 <fun> 
    6: f200 1023 addw r0, r0, #291 ; 0x123 
    a: bd08  pop {r3, pc} 

получают тот же результат, Cortex-a5. для этого простого примера машинный код для этого объекта тот же, такой же размер, когда он построен для cortex-a5 и cortex-m3

Теперь, если я добавлю бутстрап, основной и вызову эту функцию, и заполните эту функцию он призывает создать полную, связанную программу

00000000 <_start>: 
    0: f000 f802 bl 8 <notmain> 
    4: e7fe  b.n 4 <_start+0x4> 
    ... 

00000008 <notmain>: 
    8: 2005  movs r0, #5 
    a: f000 b801 b.w 10 <addimm> 
    e: bf00  nop 

00000010 <addimm>: 
    10: b508  push {r3, lr} 
    12: f000 f803 bl 1c <fun> 
    16: f200 1023 addw r0, r0, #291 ; 0x123 
    1a: bd08  pop {r3, pc} 

0000001c <fun>: 
    1c: 4770  bx lr 
    1e: 46c0  nop   ; (mov r8, r8) 

Мы получаем результат. Сама функция аддимита не изменилась. с Cortex-a5 вы должны иметь какой-то рычаг код, который затем переключается на большой палец, и, вероятно, связываясь с библиотеками и т.д., вы можете получить смесь руки и большого пальца, так

00000000 <_start>: 
    0: eb000000 bl 8 <notmain> 
    4: eafffffe b 4 <_start+0x4> 

00000008 <notmain>: 
    8: e92d4008 push {r3, lr} 
    c: e3a00005 mov r0, #5 
    10: fa000001 blx 1c <addimm> 
    14: e8bd4008 pop {r3, lr} 
    18: e12fff1e bx lr 

0000001c <addimm>: 
    1c: b508  push {r3, lr} 
    1e: f000 e804 blx 28 <fun> 
    22: f200 1023 addw r0, r0, #291 ; 0x123 
    26: bd08  pop {r3, pc} 

00000028 <fun>: 
    28: e12fff1e bx lr 

в целом больше двоичная, то addimm однако сама часть не изменилась.

, насколько связывая изменения размера объекта, посмотрите на этот пример

bootstrap.s

.thumb 

.thumb_func 
.globl _start 
_start: 
    bl notmain 
hang: b hang 

.thumb_func 
.globl dummy 
dummy: 
    bx lr 

.code 32 
.globl bounce 
bounce: 
    bx lr 

привет.с

void dummy (void ); 
void bounce (void ); 
void notmain (void) 
{ 
    dummy(); 
    bounce(); 
} 

смотрит на руку сборки notmain сам по себе, объект:

00000000 <notmain>: 
    0: e92d4800 push {fp, lr} 
    4: e28db004 add fp, sp, #4 
    8: ebfffffe bl 0 <dummy> 
    c: ebfffffe bl 0 <bounce> 
    10: e24bd004 sub sp, fp, #4 
    14: e8bd4800 pop {fp, lr} 
    18: e12fff1e bx lr 

в зависимости от того, что называть это и то, что он называет, компоновщик, возможно, придется добавить больше кода, чтобы иметь дело с предметы, которые определены вне объекта, от глобальных переменных внешних функций

00008000 <_start>: 
    8000: f000 f818 bl 8034 <__notmain_from_thumb> 

00008004 <hang>: 
    8004: e7fe  b.n 8004 <hang> 

00008006 <dummy>: 
    8006: 4770  bx lr 

00008008 <bounce>: 
    8008: e12fff1e bx lr 

0000800c <notmain>: 
    800c: e92d4800 push {fp, lr} 
    8010: e28db004 add fp, sp, #4 
    8014: eb000003 bl 8028 <__dummy_from_arm> 
    8018: ebfffffa bl 8008 <bounce> 
    801c: e24bd004 sub sp, fp, #4 
    8020: e8bd4800 pop {fp, lr} 
    8024: e12fff1e bx lr 

00008028 <__dummy_from_arm>: 
    8028: e59fc000 ldr ip, [pc] ; 8030 <__dummy_from_arm+0x8> 
    802c: e12fff1c bx ip 
    8030: 00008007 andeq r8, r0, r7 

00008034 <__notmain_from_thumb>: 
    8034: 4778  bx pc 
    8036: 46c0  nop   ; (mov r8, r8) 
    8038: eafffff3 b 800c <notmain> 
    803c: 00000000 andeq r0, r0, r0 

dummy_from_arm и notmain_from_thumb оба добавили, увеличение размера двоичного файла. каждый объект не изменился по размеру, но общий двоичный файл. bounce() был рукой для функции руки, без патчей, манекена() рукой на большой палец и notmain() большой палец на главную.

, так что у вас может быть объект cortex-m3 и объект cortex-a5, который, поскольку код в этом объекте идет, идентичен. Но полагаясь на то, с чем вы связываете их, что в конечном итоге что-то не так много между системой cortex-m3 и системой cortex-a5, вы можете увидеть больше или меньше кода, добавленного компоновщиком, для учета различий в системе, библиотек, конкретной операционной системы , и т. д. даже в том случае, если в двоичном коде вы помещаете объект, если он должен иметь дополнительную доступность, чем он может с помощью одной команды, тогда компоновщик добавит еще больше кода.

Это все специфические вещи gcc, каждая инструментальная цепочка будет решать каждую из этих проблем по-своему. Это характер зверя, когда вы используете модель объекта и линкера, очень хорошую модель, но компилятор, ассемблер и компоновщик должны работать вместе, чтобы обеспечить доступ к глобальным ресурсам при их соединении. не имеет ничего общего с ARM, эта проблема существует со многими/большинством процессорных архитектур, а цепочки связаны с этими проблемами в каждой привязке для каждой версии для каждой целевой архитектуры. Когда я сказал изменить размер объекта, что я действительно имел в виду, линкер может добавить больше кода в окончательный двоичный код, чтобы иметь дело с этим объектом и как он взаимодействует с другими.

+0

Спасибо за расширенный ответ! – nobby