|
|
  |
keil 4.21 __asm inline-функции |
|
|
|
Jun 6 2012, 15:48
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515

|
Добрый день! подскажите,как в тексте программы на С вставить ассемблерную инструкцию.Именно вставить,а не вызвать ассемблерную функцию. Нужно что-то типа оператора inline в Паскале....Пробовал через конструкцию static __asm __inline FUNC()....и через __forceinline и через #pragma inline-компилятор упорно генерит вызов,в окне дизассемблера вижу BL.W func....может все дело в т.н. embrdded assembler для процессоров Cortex M3?
|
|
|
|
|
Jun 6 2012, 16:12
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(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); }
|
|
|
|
|
Jun 6 2012, 18:36
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515

|
Цитата(aaarrr @ Jun 6 2012, 20:19)  Для Cortex'ов inline asm в RVCT не поддерживается. Да вот я тоже склоняюсь к этому мнению.Жаль....хотя функции из файла cm3_core.h и cm3_intrins.h почему-то вставляются..что-то тут явно нас православных нае...вают...Ну да ладно,что-нибудь придумаем))
|
|
|
|
|
Jun 6 2012, 18:57
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(romas2010 @ Jun 6 2012, 22:36)  Да вот я тоже склоняюсь к этому мнению. Это не мое мнение, а вполне документированное ограничение. Цитата(romas2010 @ Jun 6 2012, 22:36)  Жаль....хотя функции из файла cm3_core.h и cm3_intrins.h почему-то вставляются.. Так то intrinsics, а не асм.
|
|
|
|
|
Jun 8 2012, 09:34
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(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 линкер их жрет (иногда только байт в заголовке надо поправить)
|
|
|
|
|
Jun 9 2012, 19:29
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(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 сервер.
|
|
|
|
|
Jun 10 2012, 10:01
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
У меня что четверка, что пятерка показали идентичную производительность. Для сравнение результаты с 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, тем сильнее глючит.
|
|
|
|
|
Jun 11 2012, 07:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Цитата А почему не -O3? На реальных алгоритмах -O3 приводит к сильному раздуванию кода и часто - стека. Что на кристаллах с медленной 128бит флешкой и кешем неблагоприятно сказывается на производительности. Речь идеот конкретно о Cortex-M3 и личном опыте. Раньше иногда включал -ftree-vectorize, но потом и от этого отказался(в rvct вроде тоже что-то подобное есть), проще ручками делать циклы, не (особо) нуждающиеся в векторизации/раскрутке. Цитата GNUC похоже до сих пор генерит самый большой по размеру код. (но иногда быстрый) для ARM7 в 2009 году: http://electronix.ru/forum/index.php?showtopic=68880на счет размера согласен. по производительности все равны +-, сейчас уже 2012 год как ни как  Цитата там один байт в заголовке надо поправить (а то стоит что EABI, но приватный) после жрет. Но надо быть аккуратным с библиотеками. спасибо, попробую. а библиотеки не юзаю практически Цитата А как заставить кейл отлаживать gcc-шный elf? Как для этого проект настраивать? кормим elf да и все. только надо компилить с -gdwarf-2 -gstrict-dwarf иначе может не видеть debug-символов. как настроить: http://www.keil.com/support/docs/2310.htm
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|