Говнокомпилер ARM-GCC

AVR, ARM

Postby TS-Labs » Tue, 15.12.2015 07:42:38

Шедевр для потомков: ISR.
Code: Select all
0000044c <EXTI1>:
44c:   b508         push   {r3, lr}
...
478:   bd08         pop   {r3, pc}


Если кто не понял шутку, вот лопата:
clipboard.png
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby VBI » Tue, 15.12.2015 10:03:41

push de
pop hl
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby g0blinish » Tue, 15.12.2015 10:19:13

сигавно!
[x] No Screenshot
User avatar
g0blinish
Упырь говнофорума
 
Posts: 3641
Joined: Tue, 18.06.2013 10:59:01

Postby psb » Tue, 15.12.2015 13:42:41

а што не то? чучуть лишнего пушит?
User avatar
psb
 
Posts: 715
Joined: Tue, 30.12.2014 23:22:32

Postby TS-Labs » Tue, 15.12.2015 19:51:54

Чучуть лишнего сразу в двух аспектах:
1. R3 сохраняется на стек аппаратно, и если компилер его пушит - это просто ебаный стыд, я даже наверное напишу им в спортлото.
2. Он сохраняется задолго до того, когда вообще портится. Например, есть проверка условия, после которой возможен вызов функции, а возможен и не вызов. Логично было бы пушать перед вызовом.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Tue, 15.12.2015 19:53:17

VBI wrote:push de
pop hl

Нене, тут все как раз нормально: пушается Link Register, в котором адрес возврата, а попается РС.
Бредятина. И РС, и LR тоже аппаратно пушаются. Ваще какая-то хуйня. Есть мнение, что для функции не применились атрибуты типа ISR.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Tue, 15.12.2015 21:34:16

Ну да, в libstm32pp не прописаны атрибуты :ohno:
Code: Select all
void BC1_IRQ() __attribute__ ((interrupt ("IRQ")));

Пиздец, получилось ваще адово:
Code: Select all
00000188 <EXTI1>:
 188:   4668         mov   r0, sp
 18a:   f020 0107    bic.w   r1, r0, #7
 18e:   468d         mov   sp, r1
 190:   b501         push   {r0, lr}
 ...
 1a8:   e8bd 4001    ldmia.w   sp!, {r0, lr}
 1ac:   4685         mov   sp, r0
 1ae:   4770         bx   lr
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Tue, 15.12.2015 23:14:58

В общем, после нудного разбирательства я продолждаю щитать, что топик.
Суть саспенса: требуется ISR без единой лишней инструкции (важна скорость отработки по крайней мере в начальной фазе), использующий аппаратно запушиваемые реги (r0-r3) в начальной фазе, вызывающий во 2й фазе сложные функции, использующие многарегов, но чтобы пуш этих регов был собсна во 2й фазе. Решил так:
Code: Select all
  void BC1_IRQ() __attribute__ ((naked));
  void BC1_IRQ_epi() __attribute__ ((noinline));
  void BC1_IRQ()
  {
    asm(...);
    asm ("push {lr} \n");
    BC1_IRQ_epi();
    asm ("pop {pc} \n");
  }

Code: Select all
000004f4 <EXTI1>:
...
     50a:   b500         push   {lr}
     50c:   f7ff ffae    bl   46c <_ZN9interrupt11BC1_IRQ_epiEv>
     510:   bd00         pop   {pc}
.........
     46c:   b5f8         push   {r3, r4, r5, r6, r7, lr}
...
     4ce:   bdf8         pop   {r3, r4, r5, r6, r7, pc}
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Tue, 15.12.2015 23:18:00

То есть, __attribute__ ((naked)) для самого ISR обеспечивает отсутствие пролога/эпилога компилятора (а также и инструкции возврата, хехе, потому требуется bx lr/pop {pc} в конце), а __attribute__ ((noinline)) для "хвоста" обеспечивает оформление оного в виде отдельной подпрограммы, обвешанной требуемыми пушами.
Свинство какое-то...
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby TS-Labs » Sun, 20.12.2015 22:29:48

Продолжаем нашу популярную рубрику.
Вот такой безобидный код генерирует 5000байт неебического говнокода, содержащего какие-то эксепшены, хуепшены, стеки, хуеки, пиздец короче запредельный.
Code: Select all
bool (*f)();
main()
{
  while(1)
    f();
}

Но не спешите проклинать ублюдочных разрабов - они вам просто делают хорошо. Ведь от вызова функции по поинтеру до try...catch - всего один шаг, не правда ли?
Неблагодарные пользовали, которым такое щясьте нахуй не упало могут избавиться от него при помощи опции компилятора -fno-exceptions.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby psb » Mon, 21.12.2015 09:49:01

TS-Labs wrote:не правда ли?

не правда.
User avatar
psb
 
Posts: 715
Joined: Tue, 30.12.2014 23:22:32

Postby TS-Labs » Mon, 21.12.2015 13:22:47

<сарказм>
TS-Labs wrote:не правда ли?
</сарказм>
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56


Return to MCU

Who is online

Users browsing this forum: No registered users and 1 guest

x