Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: keil 4.21 __asm inline-функции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
romas2010
Добрый день! подскажите,как в тексте программы на С вставить ассемблерную инструкцию.Именно вставить,а не вызвать ассемблерную функцию. Нужно что-то типа оператора inline в Паскале....Пробовал через конструкцию static __asm __inline FUNC()....и через __forceinline и через #pragma inline-компилятор упорно генерит вызов,в окне дизассемблера вижу BL.W func....может все дело в т.н. embrdded assembler для процессоров Cortex M3?
kovigor
Цитата(romas2010 @ Jun 6 2012, 18:48) *
Добрый день! подскажите,как в тексте программы на С вставить ассемблерную инструкцию.Именно вставить,а не вызвать ассемблерную функцию. Нужно что-то типа оператора inline в Паскале....Пробовал через конструкцию static __asm __inline FUNC()....и через __forceinline и через #pragma inline-компилятор упорно генерит вызов,в окне дизассемблера вижу BL.W func....может все дело в т.н. embrdded assembler для процессоров Cortex M3?


Если строка одна, то можно так:

CODE

AT91C_BASE_PMC->PMC_SCDR = 0x00000001; //Выключить Processor Clock
sbz = 0;

__asm{MCR p15, 0, sbz, c7, c0, 4}

Normal_Power_Mode();
AT91C_BASE_PIOC->PIO_CODR = 0x00000010; //И зажигаем светодиод


А если много строк, то вот так:

CODE
/* computes x/R == x (mod N) via Montgomery Reduction */
void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp)
{
fp_digit *_c, *tmpm, mu;
signed int oldused, x, y, pa;

/* bail if too large */
if (m->used > (FP_SIZE/2)) return;

/* now zero the buff */
memset(gl_c, 0, sizeof gl_c);
pa = m->used;

/* copy the input */
oldused = a->used;
for (x = 0; x < oldused; x++) gl_c[x] = a->dp[x];

MONT_START;

for (x = 0; x < pa; x++){fp_digit cy = 0;
/* get Mu for this round */
LOOP_START;
_c = gl_c + x;
tmpm = m->dp;
y = 0;

for (; y < pa; y++){//INNERMUL;
fp_digit t_h, t_l;
__asm{umull t_l,t_h,mu,*tmpm++
adds t_l,t_l,_c[0]
adc t_h,t_h,0
adds t_l,t_l,cy
adc t_h,t_h,0
mov _c[0],t_l
mov cy,t_h
}
//fp_word t;
//t = ((fp_word)_c[0] + (fp_word)cy) +
// (((fp_word)mu) * ((fp_word)*tmpm++));
//_c[0] = t;
//cy = (t >> 32);
++_c;
}
LOOP_END;
while (cy){PROPCARRY;
++_c;
}
}

/* now copy out */
_c = gl_c + pa;
tmpm = a->dp;
for (x = 0; x < pa+1; x++) *tmpm++ = *_c++;

for (; x < oldused; x++) *tmpm++ = 0;

MONT_FINI;

a->used = pa+1;
fp_clamp(a);

/* if A >= m then A = A - m */
if (fp_cmp_mag (a, m) != FP_LT) s_fp_sub (a, m, a);
}
aaarrr
Для Cortex'ов inline asm в RVCT не поддерживается.
romas2010
Цитата(aaarrr @ Jun 6 2012, 20:19) *
Для Cortex'ов inline asm в RVCT не поддерживается.


Да вот я тоже склоняюсь к этому мнению.Жаль....хотя функции из файла cm3_core.h и cm3_intrins.h почему-то вставляются..что-то тут явно нас православных нае...вают...Ну да ладно,что-нибудь придумаем))
aaarrr
Цитата(romas2010 @ Jun 6 2012, 22:36) *
Да вот я тоже склоняюсь к этому мнению.

Это не мое мнение, а вполне документированное ограничение.

Цитата(romas2010 @ Jun 6 2012, 22:36) *
Жаль....хотя функции из файла cm3_core.h и cm3_intrins.h почему-то вставляются..

Так то intrinsics, а не асм.
KRS
Возьмите IAR (там даже GNU макросы) он поддерживает.
Или Arm compiler toolchain 5.xx
MK2
Цитата(KRS @ Jun 6 2012, 22:36) *
Или Arm compiler toolchain 5.xx


Arm compiler toolchain это же DS-5, они насколько знаю не поддерживают М3, их аудитория А8,А9...
KRS
Цитата(MK2 @ Jun 8 2012, 13:18) *
Arm compiler toolchain это же DS-5, они насколько знаю не поддерживают М3, их аудитория А8,А9...

поддерживает! он все ядра поддерживает.
я еще RVCT компилером (от RVDS 4.1 не от keil, от keil он был какой то убогий) собирал некоторые файлы, а потом IAR linker их "жрал" без проблем сейчас же все EABI!
и от 5.xx смотрел как компилит, у него оптимизатор хорош! Но линковать не пробовал, пока без надобности было. Но elf стандартный, IAR линкер их жрет (иногда только байт в заголовке надо поправить)
MK2
KRS
т.е. в DS-5 можно полностью собрать и отладить проект под М3 ?
что вы можете сказать про среду (удобство, доставаемость, возможности отладки)?
KRS
Цитата(MK2 @ Jun 9 2012, 10:06) *
KRS
т.е. в DS-5 можно полностью собрать и отладить проект под М3 ?
что вы можете сказать про среду (удобство, доставаемость, возможности отладки)?

я как то начинал тему
http://electronix.ru/forum/index.php?showtopic=74134&hl=
среда удобная на eclipse.
сейчас уже версия 5.10. (пишут что отладчик доработали что ядро линукса можно отлаживать)
Я правда давно ее уже не смотрел, но beagleboard цеплялась на ура. Т.е. поставил и за 5 минут сделал Hellow world! Отладчик через gdbserver тоже хорошо работал! (со стороны компа в eclipse не gdb).

Но с разработкой под Cortex-M3 IMHO будут проблемы - нет .h файлов и т.п. железный отладчик ARM поддерживает только свой! Можно правда попробовать через GDB сервер.
brag
У меня что четверка, что пятерка показали идентичную производительность. Для сравнение результаты с gcc привожу. это все на медленном stm32f105, +-пару секунд будет если весь код сместить на 2-4 байта из за особенностей работы кеша в stm.

CODE
rvct 4.1 894 -O2 -Otime
sizе=0002c338
MP3 Time: 38
TWF Time: 23
CRC32 Time: 16

armcc 5.01.64 -O2 -Otime
size=0002c330
MP3 Time: 38
TWF Time: 23
CRC32 Time: 16

gcc-4.7.1-RC -O2
size=0002d2c0
Time: 41
TWF Time: 20
CRC32 Time: 12


gcc линкер файлы от rvct не хавает.. пришлось изрядно повозится, чтобы собрать все через родной - в проекте есть несколько модулей, где должны использоватся одни и те же исходные файлы, одни и те же функции, но при этом их должно быть не одна копия.
На пример есть загрузчик и программа. Оба должны использовать функцию printf(), при этом у каждого должна быть своя копия printf(). И все это в одном выходном файле - попробуй заставь линкер корректно работать при этом.

rvct4 не понимает 64битных операций(на пример U64 t; int s; ... t<<=s), вызывает какие-то библиотечные функции(которых ессно в голом rvct нету), в то время, как gcc генерит оптимальный код на месте.
Вообще качество кода у gcc выше с большей вероятностю. Там, где rvct нагенерил кучу мусора(на пример алгоритм twofish) и занял много стека, gcc все сделал гораздо красивее. Хотя бывает на оборот, но гораздо реже. Странно, родной компилер ведь...

А так для отладки юзаю keil, компилю gcc. gdb+Eclipse глючит жестоко, и чем новее версия gdb,gcc, тем сильнее глючит.
aaarrr
А почему не -O3?
KRS
Цитата(brag @ Jun 10 2012, 14:01) *
gcc линкер файлы от rvct не хавает..

там один байт в заголовке надо поправить (а то стоит что EABI, но приватный) после жрет. Но надо быть аккуратным с библиотеками.


GNUC похоже до сих пор генерит самый большой по размеру код. (но иногда быстрый)
для ARM7 в 2009 году: http://electronix.ru/forum/index.php?showtopic=68880
_Артём_
Цитата(brag @ Jun 10 2012, 13:01) *
А так для отладки юзаю keil, компилю gcc. gdb+Eclipse глючит жестоко, и чем новее версия gdb,gcc, тем сильнее глючит.

А как заставить кейл отлаживать gcc-шный elf?
Как для этого проект настраивать?
brag
Цитата
А почему не -O3?

На реальных алгоритмах -O3 приводит к сильному раздуванию кода и часто - стека. Что на кристаллах с медленной 128бит флешкой и кешем неблагоприятно сказывается на производительности. Речь идеот конкретно о Cortex-M3 и личном опыте.
Раньше иногда включал -ftree-vectorize, но потом и от этого отказался(в rvct вроде тоже что-то подобное есть), проще ручками делать циклы, не (особо) нуждающиеся в векторизации/раскрутке.

Цитата
GNUC похоже до сих пор генерит самый большой по размеру код. (но иногда быстрый)
для ARM7 в 2009 году: http://electronix.ru/forum/index.php?showtopic=68880

на счет размера согласен. по производительности все равны +-, сейчас уже 2012 год как ни как sm.gif

Цитата
там один байт в заголовке надо поправить (а то стоит что EABI, но приватный) после жрет. Но надо быть аккуратным с библиотеками.

спасибо, попробую. а библиотеки не юзаю практически

Цитата
А как заставить кейл отлаживать gcc-шный elf?
Как для этого проект настраивать?

кормим elf да и все. только надо компилить с -gdwarf-2 -gstrict-dwarf иначе может не видеть debug-символов.
как настроить: http://www.keil.com/support/docs/2310.htm
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.