Переписал свою ось с системы команд ARM на Thumb (оставив ARM там, где это необходимо: начало инициализации, первичные обработчики прерываний и подпрограммы управления прерываниями). При одинаковом функционале (собственно ядро, драйверы GPIO и UART плюс тестовая задача на Аде; на Thumb переведено только ядро без упомянутых модулей, а драйверы и задача оставлены на ARM) размер кода сократился с 13772 байтов до 10156. Соотношение размеров модулей ядра, которые целиком были переписаны с АРМы на Тумбу, можно увидеть по выдержкам из карт памяти, созданных компоновщиком:
Код:
0x00000b04 0x0000016c Code RO 22 KERNEL common.o
0x00000dac 0x00000096 Code RO 29 KERNEL io.o
0x00000f44 0x00000070 Code RO 38 KERNEL memory.o
0x00000fb4 0x00000040 Code RO 41 KERNEL scheduler.o
0x00000ff4 0x00000114 Code RO 44 KERNEL signals.o
0x00001108 0x00000174 Code RO 47 KERNEL svc_handler.o
0x0000127c 0x000002b8 Code RO 50 KERNEL svc_io.o
0x00001534 0x00000020 Code RO 53 KERNEL svc_misc.o
0x00001554 0x000000dc Code RO 56 KERNEL svc_signals.o
0x00001630 0x000002a8 Code RO 59 KERNEL svc_sync.o
0x000018d8 0x000000dc Code RO 62 KERNEL svc_timer.o
0x000019b4 0x00000334 Code RO 65 KERNEL sync.o
0x00001ce8 0x000000bc Code RO 68 KERNEL tasks.o
0x00001da4 0x00000064 Code RO 71 KERNEL threads.o
Код:
0x000012bc 0x0000025c Code RO 16 KERNEL common.o
0x00001638 0x000000c8 Code RO 29 KERNEL io.o
0x00001700 0x000000c4 Code RO 38 KERNEL memory.o
0x000017c4 0x00000060 Code RO 41 KERNEL scheduler.o
0x00001824 0x000001dc Code RO 44 KERNEL signals.o
0x00001a2c 0x000001b8 Code RO 56 KERNEL svc_handler.o
0x00001be4 0x00000404 Code RO 59 KERNEL svc_io.o
0x00001fe8 0x00000030 Code RO 62 KERNEL svc_misc.o
0x00002018 0x00000104 Code RO 65 KERNEL svc_signals.o
0x0000211c 0x00000330 Code RO 68 KERNEL svc_sync.o
0x0000244c 0x000000fc Code RO 71 KERNEL svc_timer.o
0x00002548 0x000004b0 Code RO 74 KERNEL sync.o
0x000029f8 0x00000134 Code RO 77 KERNEL tasks.o
0x00002b2c 0x00000060 Code RO 80 KERNEL threads.o
Имеем 6020 байтов для ARM и 4294 для Thumb. При использовании Thumb-2 код становится ещё немного короче, поскольку можно использовать все регистры процессора, проще работать с константами и т.п. Например, в Thumb нельзя выполнить логическую операцию между регистром и константой, её надо сначала загрузить в другой регистр, ну а в Thumb-2 -- можно. Правда, при этом код команды займёт не 2 байта, а 4, но это всё равно выгодней хотя б потому, что придётся выполнить одну команду, а не две или даже три (в Thumb константа может быть загружена лишь в младший байт регистра, а в Thumb-2 с этим посвободнее: байтовую константу можно поместить, начиная с любого разряда регистра, плюс есть несколько особых возможностей загрузки, например, можно сразу загрузить 0000FFFF, хотя сама по себе константа в коде команды занимает байт).