Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сви прерывания в gcc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
vova7890
Долго искал метод запуска сви на гсс, и недавно нашёл одно единственное решение - инлайновая функция с асм встакой. Так вот оно прокатывает когда есть фиксированное количество аргументов, а вот как быть с переменным? К примеру у меня есть функция sprintf(char *dst, char *mft, ...) под номером сви 22, как сделать вызов сви на такое? Вот как я делаю с фиксированным количеством аргументов.

Код
static inline long do_SWI1( const int swi_num,
    long par0)
{
    long ret_val;

    asm volatile (
        "mov r0, %2 \n\t" \
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num), "r" (par0)
        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );

    return ret_val;
}


В асм вставку можно передавать ва_листы? :-D
rezident
А в документации разве не описаны правила передачи параметров в/из функции? Кроме того, в очередной раз уведомляю, что асм-овые вставки в Си крайне не рекомендуются. Рекомендуется писать отдельные функции полностью на асм и использовать их в проекте именно как внешние функции. Для этого нужно всего лишь почитать документацию на компилятор.
vova7890
че это не рекомендуется? А че лучше будет когда при вызове сви сначало будет BL на функцию вызова сви (при этом мучая стек, будет передавать параметры), потом сам сви? Не слишком ли много этапов получится? Как раз таки инлайновый вызов будет куда лучше, для 208 мгц. Документацию читал, ничего подобного не находил, иначе б не спрашивал же.
rezident
Цитата(vova7890 @ Nov 21 2010, 01:02) *
Как раз таки инлайновый вызов будет куда лучше, для 208 мгц.
А кто вам мешает попросить компилятор проинлайнить эту асм-овую функцию? В то же время, оформив ее именно как отдельную функцию, вы не будете вводить компилятор в заблуждение и мешать ему оптимизировать другое окружение той функции, куда вы инлайните асм.
AHTOXA
rezident, gcc умеет оптимизировать asm-вставки.

vova7890, а может просто посмотреть дизассемблер вызова функции с переменным числом аргументов?
vova7890
Цитата(AHTOXA @ Nov 21 2010, 00:40) *
rezident, gcc умеет оптимизировать asm-вставки.

vova7890, а может просто посмотреть дизассемблер вызова функции с переменным числом аргументов?


та я знаю как оно пашет просто, напримересли будет 3 аргумента то можно стек не трогать, а если 10 то нужно через стек передавать. Вот застрял я на том что не знаю как сказать гсс что нужно переменные пихать в регисты/стек для вставки.

К примеру иар их инлайнит, если дофига аргументов то он сохраняет стек и передаёт параметры уже через стек
vova7890
Похоже это невозможно, или никто не знает crying.gif
vova7890
блин, и тип double неправильно передаётя... Короче беда с этими свишками на гсс, сделали б как на иаре прагму #pragma swi_number ...
klen
Цитата(vova7890 @ Nov 22 2010, 10:59) *
блин, и тип double неправильно передаётя... Короче беда с этими свишками на гсс, сделали б как на иаре прагму #pragma swi_number ...


нада подумать! наверняко можно и как обычно наверное красиво и просто но не очевидно.
по сути задача сводится как мне представляется к формированию стека и регистров вызывающими параметрами, номер swi никак к этому не относится - это часть команды а не данные в стеке.
vova7890
да вот уже 4-й день никак не придумаю... видимо по человечески сделать не получится. Нагомнокодить и будет скорость хромать
Сергей Борщ
QUOTE (vova7890 @ Nov 25 2010, 12:41) *
да вот уже 4-й день никак не придумаю... видимо по человечески сделать не получится. Нагомнокодить и будет скорость хромать
В чем конкретно сложность? Порядок передачи параметров известен. "обычный" printf разбирает параметры в процессе выполнения - что вам мешает подсмотреть и сделать точно так же?
vova7890
КАК РАЗОБРАТЬ ЭТИ ПАРАМЕРТЫ ДЛЯ АСМ ВСТАВКИ!!!!!!!!!!! 100тый раз уже говорю...
Сергей Борщ
QUOTE (vova7890 @ Nov 25 2010, 15:36) *
КАК РАЗОБРАТЬ ЭТИ ПАРАМЕРТЫ ДЛЯ АСМ ВСТАВКИ!!!!!!!!!!!
Зачем их разбирать в асм-вставке? Вам их надо передать в неизменном виде той функции, которая получит управление после swi. То есть не трогать их вообще. "Я так думаю".
что-то вроде
CODE
static inline int sprintf(char *dst, char *mft, ...)
{
    int ret_val;
    static int const swi_num = 22;
    asm volatile (
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num)
        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );
    return ret_val;
}
vova7890
А вы думаете я так не пробывал? Не совсем так но что то подобное делал, гсс вообще не обращает внимание на использоване функции тупо втыкает в код swi 22 и все безовсяких параметров и прочего, вот в этом то и беда... Я в пичали! biggrin.gif

шото даже кажется что это уже или баги гсс, или ещё чтото...
vova7890
Вот что происходит:

Код
  char *temp = (char*)malloc(128);
  zeromem(temp, 128);
  sprintfa(temp, "%s %s", "Hello", "world"); // ваш вариант функции

  ShowMSG (1, (int)temp);
  mfree(temp);
  
  maincsm_onclose(0);


Код
.text:000004C8                 EXPORT start
.text:000004C8 start
.text:000004C8                 STMFD   SP!, {R4,R5,LR}
.text:000004CC                 MOV     R5, #0x80; 'А'
.text:000004D0                 MOV     R0, R5
.text:000004D4                 SWI     0x14
.text:000004D8                 MOV     R4, R0
.text:000004DC                 MOV     R0, R4
.text:000004E0                 MOV     R1, R5
.text:000004E4                 SWI     0x11D
.text:000004E8                 SWI     0x16                ; вот она просто втыкнутая в код свишка
.text:000004EC                 MOV     R5, R0
.text:000004F0                 MOV     R5, #1
.text:000004F4                 MOV     R0, R5
.text:000004F8                 MOV     R1, R4
.text:000004FC                 SWI     0x148
.text:00000500                 MOV     R5, R0
.text:00000504                 MOV     R0, R4
.text:00000508                 BL      sub_8
.text:0000050C                 BL      sub_474
.text:00000510                 MOV     R0, #0
.text:00000514                 LDMFD   SP!, {R4,R5,PC}


я ещё думал такой вариант типа это оптимизатор смотрит что параметры не юзаются и выкидывает их, пробовал различные атрибуты оптимизации к вставке шото тоже ничего не выходит sad.gif
Сергей Борщ
QUOTE (vova7890 @ Nov 26 2010, 09:39) *
я ещё думал такой вариант типа это оптимизатор смотрит что параметры не юзаются и выкидывает их
Вот я тоже об этом думал. А если попробовать так:
CODE
static inline int sprintfa(char *dst, char *mft, ...)
{
    int ret_val;
    static int const swi_num = 22;
    asm volatile (
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num), "m" (dst), "m" (mft), "memory"
        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );
    return ret_val;
}

vova7890
Код
.text:00000560                 EXPORT start
.text:00000560 start
.text:00000560
.text:00000560 var_10          = -0x10
.text:00000560
.text:00000560                 STMFD   SP!, {R4,R5,LR}
.text:00000564                 MOV     R5, #0x80; 'А'
.text:00000568                 SUB     SP, SP, #4
.text:0000056C                 MOV     R0, R5
.text:00000570                 SWI     0x14
.text:00000574                 MOV     R4, R0
.text:00000578                 MOV     R0, R4
.text:0000057C                 MOV     R1, R5
.text:00000580                 SWI     0x11D
.text:00000584                 STR     R4, [SP,#0x10+var_10]
.text:00000588                 SWI     0x16
.text:0000058C                 MOV     R5, R0
.text:00000590                 MOV     R5, #1
.text:00000594                 MOV     R0, R5
.text:00000598                 MOV     R1, R4
.text:0000059C                 SWI     0x148
.text:000005A0                 MOV     R5, R0
.text:000005A4                 MOV     R0, R4
.text:000005A8                 SWI     0x15
.text:000005AC                 BL      sub_50C
.text:000005B0                 MOV     R0, #0
.text:000005B4                 ADD     SP, SP, #4
.text:000005B8                 LDMFD   SP!, {R4,R5,PC}

Код
static inline int sprintfa(char *dst, char *mft, ...)
{
    int ret_val;
    static int const swi_num = 22;
    asm volatile (
        "swi %1    \n\t" \
        "mov %0, r0 \n\t" \
        :    "=r" (ret_val)
        :    "n" (swi_num), "m" (dst)                                    // ругалось на  "memory" что нету "memory"(аргумент)
        :    "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc"
    );
    return ret_val;
}
vova7890
Я пробовал уже наверно все что можно, спасибо конечно всем кто помогает, но ничего не выходит... sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.