починил. добавил таргет специально для m0, штатном варианте из транка компиллер знает что у процесора набор команд tрumb2, но линкеру передает либы с таргетам в которм инструкции tрumb1, что как мы убедились приводит к выташниваю декодера команд ЦПУ.... его реакция ожидаема - "моя твоя команды непонимать"...
использовались для теста значимые по ключики для нашего сдучая
-std=c++14 -D__CORTEX_M0__ -D__STM32F030F4P6__ -DSTM32F030x6 -D__STM32F0XX__ -DARM_MATH_CM0 -mcpu=cortex-m0 -mfloat-abi=soft -mthumb -Ofast -fomit-frame-pointer -finline-functions -ffunction-sections -fdata-sections -fgraphite -funroll-loops -flto=8 -ffat-lto-objects ...... и так дале проектоспецефичное
исходник для теста
CODE
#include "appdefs.h"
volatile int8_t a8 = 8;
volatile int8_t b8 = 3;
volatile int16_t a16 = 8;
volatile int16_t b16 = 3;
volatile int32_t a32 = 8;
volatile int32_t b32 = 3;
volatile int64_t a64 = 4000000000;
volatile int64_t b64 = 3;
int main(void)
{
while (1)
{
NOP();
NOP();
a8 = (a8 * b8) / ( a8 - b8 );
NOP();
a16 = (a16 * b16) / ( a16 - b16 );
NOP();
a32 = (a32 * b8) / ( a32 - b32 );
NOP();
a64 = (a64 * b64) / ( a64 - b64 );
NOP();
}
}
код из под компилятора кому интересно
CODE
int main(void)
{
while (1)
{
NOP();
8000366: 1c00 adds r0, r0, #0
NOP();
8000368: 1c00 adds r0, r0, #0
a8 = (a8 * b8) / ( a8 - b8 );
800036a: 465e mov r6, fp
800036c: 4a41 ldr r2, [pc, #260]; (8000474 <ResetHandler+0x3b4>)
800036e: 4c41 ldr r4, [pc, #260]; (8000474 <ResetHandler+0x3b4>)
8000370: 7830 ldrb r0, [r6, #0]
8000372: 7813 ldrb r3, [r2, #0]
8000374: 7837 ldrb r7, [r6, #0]
8000376: 7826 ldrb r6, [r4, #0]
8000378: b241 sxtb r1, r0
800037a: b27a sxtb r2, r7
800037c: b258 sxtb r0, r3
800037e: b273 sxtb r3, r6
8000380: 4348 muls r0, r1
8000382: 1ad1 subs r1, r2, r3
8000384: f000 f9e2 bl 800074c <__aeabi_idiv>
8000388: 465d mov r5, fp
800038a: b2c0 uxtb r0, r0
800038c: 7028 strb r0, [r5, #0]
NOP();
800038e: 1c00 adds r0, r0, #0
a16 = (a16 * b16) / ( a16 - b16 );
8000390: 4f39 ldr r7, [pc, #228]; (8000478 <ResetHandler+0x3b8>)
8000392: 4e3a ldr r6, [pc, #232]; (800047c <ResetHandler+0x3bc>)
8000394: 4938 ldr r1, [pc, #224]; (8000478 <ResetHandler+0x3b8>)
8000396: 4a39 ldr r2, [pc, #228]; (800047c <ResetHandler+0x3bc>)
8000398: 883c ldrh r4, [r7, #0]
800039a: 8833 ldrh r3, [r6, #0]
800039c: 880d ldrh r5, [r1, #0]
800039e: 8817 ldrh r7, [r2, #0]
80003a0: b224 sxth r4, r4
80003a2: b218 sxth r0, r3
80003a4: b22e sxth r6, r5
80003a6: b23b sxth r3, r7
80003a8: 1af1 subs r1, r6, r3
80003aa: 4360 muls r0, r4
80003ac: f000 f9ce bl 800074c <__aeabi_idiv>
80003b0: 4931 ldr r1, [pc, #196]; (8000478 <ResetHandler+0x3b8>)
80003b2: b280 uxth r0, r0
80003b4: 8008 strh r0, [r1, #0]
NOP();
80003b6: 1c00 adds r0, r0, #0
a32 = (a32 * b8) / ( a32 - b32 );
80003b8: 4642 mov r2, r8
80003ba: 4d2e ldr r5, [pc, #184]; (8000474 <ResetHandler+0x3b4>)
80003bc: 4e30 ldr r6, [pc, #192]; (8000480 <ResetHandler+0x3c0>)
80003be: 782f ldrb r7, [r5, #0]
80003c0: 6810 ldr r0, [r2, #0]
80003c2: 6814 ldr r4, [r2, #0]
80003c4: 6831 ldr r1, [r6, #0]
80003c6: b27b sxtb r3, r7
80003c8: 4358 muls r0, r3
80003ca: 1a61 subs r1, r4, r1
80003cc: f000 f9be bl 800074c <__aeabi_idiv>
80003d0: 4645 mov r5, r8
80003d2: 6028 str r0, [r5, #0]
NOP();
80003d4: 1c00 adds r0, r0, #0
a64 = (a64 * b64) / ( a64 - b64 );
80003d6: 4657 mov r7, sl
80003d8: 4648 mov r0, r9
80003da: 464c mov r4, r9
80003dc: 6841 ldr r1, [r0, #4]
80003de: 6800 ldr r0, [r0, #0]
80003e0: 683a ldr r2, [r7, #0]
80003e2: 687b ldr r3, [r7, #4]
80003e4: f000 fa38 bl 8000858 <__aeabi_lmul>
80003e8: 6826 ldr r6, [r4, #0]
80003ea: 6867 ldr r7, [r4, #4]
80003ec: 4655 mov r5, sl
80003ee: 0032 movs r2, r6
80003f0: 682c ldr r4, [r5, #0]
80003f2: 686d ldr r5, [r5, #4]
80003f4: 003b movs r3, r7
80003f6: 1b12 subs r2, r2, r4
80003f8: 41ab sbcs r3, r5
80003fa: f000 fa09 bl 8000810 <__aeabi_ldivmod>
80003fe: 464a mov r2, r9
8000400: 6010 str r0, [r2, #0]
8000402: 6051 str r1, [r2, #4]
NOP();
8000404: 1c00 adds r0, r0, #0
8000406: e03d b.n 8000484 <ResetHandler+0x3c4>
вот свежак с добавленным отдельным таргеом сортех-m0.
http://www.klen.org/Files/DevTools/x86_64-...03_CAMPANULA.7z!!! ИСПРАВЛЕНО: архив похерен с связи с более свежей сборкой под темже именем, смотри следующее сообщение !!
есть еще возможность сделать отдельно еще для
cortex-m0.small-multiply
cortex-m0plus
cortex-m0plus.small-multiply
m0plus jn m0 по командам ничем не отличается - поэтому можно кормить также . отдельно заведено в связи с тем что разный конвеер и оптимизатор по разному планирует поток инструкций выжимая из онвеера скорость. код совместимый.
по ядрам cortex-m0.small-multiply и cortex-m0plus.small-multiply . это про то что есть модификация с вырезанным модулем умножения. цитата:
Цитата
Some configurations of the Cortex-M0 and Cortex-M1 come with a high latency
multiplier. Small multiplier means using add/sub/shift instructions to replace the mul
instruction for the MCU that has no fast multiplier.
под это ну уж совсем говноЦПУ я добавлю в сборку поддерку в следующий раз.
внимание!!! если собрать текущей сборкрй с ключиками cortex-m0 то нагенерятся умножения которых в цпу cortex-m0.small-multiply нет, и будет как облом. нада подождать до следующей сборки или отнести на помойку микросхемку.
to _3m
попробуье свежак с ключем -mcpu=cortex-m0, должно звзлететь. как сказал выше cortex-m0здгы протяну пожже.
решил отныне собирать компиллер с поддержкой русского языка, у кого линукс с русской локалью - будет матом ругатся а не по аглицки! это мои ответные НАТО санкции
Сообщение отредактировал klen - Dec 3 2015, 22:36
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!