Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmel SAM3U4
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4
aaarrr
Хм, и правда. Возможно, с ним какая-то засада, раз уж пришлось изворачиваться с DMADONE/BLKE. Не помню уже sad.gif
sonycman
Цитата(aaarrr @ Dec 22 2011, 16:56) *
Хм, и правда. Возможно, с ним какая-то засада, раз уж пришлось изворачиваться с DMADONE/BLKE. Не помню уже sad.gif

Односекторное чтение у меня работает вроде без проблем с XFRDONE.

А BLKE/DMADONE, устанавливаются после каждого сектора? sad.gif

Имхо, будет оптимальнее дергать проц по CBTC, когда не один сектор, а сразу цепочка обработалась, а на финише уже подождать XFRDONE.
Попробую...
aaarrr
Цитата(sonycman @ Dec 22 2011, 17:05) *
А BLKE/DMADONE, устанавливаются после каждого сектора? sad.gif

Я и работаю только с одним сектором.

Цитата(sonycman @ Dec 22 2011, 17:05) *
Имхо, будет оптимальнее дергать проц по CBTC, когда не один сектор, а сразу цепочка обработалась, а на финише уже подождать XFRDONE.
Попробую...

Попробуйте. Только нужно еще учитывать, что внутри цепочки могут возникнуть ошибки. С одиночной передачей несколько удобнее.
Посмотрел, как организована передача у меня: после инициализации ждем CBTC или тайм-аут данных (DTOE) + есть еще программный тайм-аут. После CBTC разрешаются DMADONE/BLKE.
sonycman
Вроде доделал драйвер HSMCI для FatFS.

Надо же, не все карточки MicroSD спецификации 2.0 поддерживают High Speed режим!
SanDisk 1GB в ответ на CMD6 вернула как поддерживаемую только default function для группы 1!
Function 1 (HS) не поддерживается... sad.gif

Скорости получились такие, при чтении\записи блоков по 64 сектора, Kingston SDHC 4GB Class 4:
Чтение: 18 MB/Sec, запись: 8,5 MB/Sec.

При этом кардридер с этой же карточкой показал более высокий результат:
Чтение: 19,6 MB/Sec, запись: 11,3 MB/Sec.

Если по чтению практически одинаково, то вот с записью большое отставание.
Возможно, ридер работает с блоками секторов гораздо большего размера, или используется какая-то оптимизация, вроде PRE-ERASE?
aaarrr
Цитата(sonycman @ Dec 28 2011, 20:34) *
Если по чтению практически одинаково, то вот с записью большое отставание.
Возможно, ридер работает с блоками секторов гораздо большего размера, или используется какая-то оптимизация, вроде PRE-ERASE?

Ну, не такая уж большая разница (особенно если учесть, что контроллеру вообще затруднительно будет "перепахивать" такие потоки). Возможно, используют большие блоки. С PRE-ERASE в свое время экспериментировал, но сколько-нибудь значимого влияния на скорость записи никогда не наблюдал.
sonycman
Цитата(aaarrr @ Dec 28 2011, 20:38) *
Ну, не такая уж большая разница (особенно если учесть, что контроллеру вообще затруднительно будет "перепахивать" такие потоки). Возможно, используют большие блоки. С PRE-ERASE в свое время экспериментировал, но сколько-нибудь значимого влияния на скорость записи никогда не наблюдал.

Да перепахивать-то особо будет не нужно, просто "закидывать" на карточку с компа по USB MSC.

Вернее всего рулят большие блоки по 128 секторов в ридере. Хотя при увеличении кол-ва секторов с 32 до 64 получил прирост на запись всего около одного мегабайта в секунду.

А может быть "тормозит" мой драйвер или атмеловский контроллер MCI, а в ридере более оптимальная аппаратная реализация...

ЗЫ: ах да, загрузка процессора при этом составила 4-5% под scmRTOS (96 МГц).
aaarrr
Да, USB - это, пожалуй, единственный сопоставимый по скорости интерфейс. При работе с картой силами самого процессора неизбежно вылезают потери на медленной внешней памяти (а внутренней ой как мало) и т.п.

В общем, я бы не стал убиваться за пару мегабайт в секунду sm.gif
sonycman
Цитата(aaarrr @ Dec 28 2011, 20:52) *
В общем, я бы не стал убиваться за пару мегабайт в секунду sm.gif

Согласен, тем более, пока не знаю, куда копать, вроде нигде нет лишних задержек...

Кстати, всё вроде нормально работает с XFRDONE, единственное, чтобы сигнал не проскакивал раньше времени, пришлось разрешать его прерывание только непосредственно после выдачи команды STOP_TRANSMISSION(CMD12).
aaarrr
Цитата(sonycman @ Dec 28 2011, 20:59) *
Кстати, всё вроде нормально работает с XFRDONE, единственное, чтобы сигнал не проскакивал раньше времени, пришлось разрешать его прерывание только непосредственно после выдачи команды STOP_TRANSMISSION(CMD12).

Да, это знакомо - прерывания лучше разрешать непосредственно перед тем, как они должны возникнуть. Удобством работы на прерываниях контроллер явно не отличается.
sonycman
С наступившим Новым годом всех! santa2.gif
Но работа продолжается.

Да, I2C у этого сэма привередливый, шумы ловит только так sad.gif
Повесил на пины ёмкости по 150пф, вроде стабильно стало.

И вопрос - можно ли SSC сконфигурировать в режиме I2S мастера так, чтобы контроллер сам формировал все три сигнала - BCLK, WS и DATA?
Что-то не получается пока sad.gif
aaarrr
Да, SSC можно заставить быть I2S-мастером. Вот пример (он, правда, от SAM7, да неважно):
Код
void ssc_start_i2s(void)
{
    AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST;

    AT91C_BASE_SSC->SSC_CMR = 16;    // MCK / 32

    // PERIOD: 32, STTDLY: 1, START: falling edge on TF, CKO: continuous, CKS: TK
    AT91C_BASE_SSC->SSC_TCMR = (15 << 24) | (1 << 16) | AT91C_SSC_START_FALL_RF | AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_CKS_DIV;
    // FSOS: negative pulse on TF, DATNB: 1, MSB first, 16 bits
    AT91C_BASE_SSC->SSC_TFMR = AT91C_SSC_FSOS_NEGATIVE | (15 << 16) | (1 << 8) | AT91C_SSC_MSBF | 15;

    ...

    AT91C_BASE_SSC->SSC_CR = AT91C_SSC_TXEN;
}
sonycman
Спасибо, вроде поехало!

Единственное, не понятно, что творится с пином TD, когда на нём нет данных.
Согласно полю DATDEF в TFMR, на пине должен быть 0.
Но его уровень плавно растёт до примерно половины напряжения питания. Явно работает пуллап.

Но почему, разве пин самопроизвольно переключается на вход? Попробовал сконфигурировать пины TK, TF, TD как выходы - на TF сигнал вообще пропал...
sonycman
Думается мне, что фича DATDEF в SAM3U не работает.
DATDEF в регистре SSC_TFMR равно нулю (если записать единичку - ничего не поменяется):
Нажмите для просмотра прикрепленного файла
Жёлтым - пин TF (WS с частотой 44.1 кГц), а зелёным - TD (данные).
Видно, что TD управляется, только когда на него непосредственно выставляются данные, в остальное время он "плавает" как вход, уровень подтягивается пуллапом... sad.gif
aaarrr
Насколько я помню, на SAM7 в режиме I2S такая же картина. Но в каких-то других режимах DATDEF все-таки точно работает. Мутна вода, как водится.
sonycman
Цитата(aaarrr @ Jan 2 2012, 00:00) *
Мутна вода, как водится.

Это точно sm.gif

Всё, достал меня I2C krapula.gif
Я, конечно, понимаю - длинные провода и всё такое - но когда мастер в виде SAM3U4 при малейшем шорохе на стороне сыпет NACKами и ARBLOSTами...
Навешал на шину ёмкостей под 300пф, вроде заработало стабильно, но стоило одновременно с передачей по I2C поработать с картой памяти на 24 мегабита/сек - снова ошибки, причём именно со стороны мастера - NACK, ARBLOST (какой арбитрейшн лост, ты же единственный мастер на шине!) или просто тупой зависон всего модуля с подтянутыми к земле данными и/или клоком, из которого можно выйти только сняв с контроллера питание... sad.gif

При этом если воткнуть другую карточку, более скоростную - на 48 мегабит/сек - всё снова стабильно.

Снижение скорости до черепашьего уровня никак не влияет на ситуацию.

На осциллограммах хорошо видно, как мастер перед ошибкой "режет" клок - ширина импульса высокого уровня становится во много раз меньше необходимой.
Что он там "ловит" не знаю, но такому неустойчивому дерьму просто необходимо было повесить на входа фильтр, а не гордо писать в мануале:
Цитата
Slope control and input filtering (Fast mode) Not Supported


Помнится, с LPC17xx тоже пришлось немного повозиться, но там были NACKи только от привередливого кодека (у которого, видимо, тоже по аналогии с сэмом отсутствовали фильтры на входе), но проблема быстро решилась а мастер работал безо всяких проблем.

Попробую тоже написать работу с I2C девайсами врукопашную, может, будет получше...

ЗЫ: так и хочется уже отказаться от неустойчивого I2C в пользу SPI, но подкупает малое кол-во проводников...
aaarrr
Забейте, батюшка, на I2C - заборете сейчас, так непременно сломается в будущем. Нервы дороже.
sonycman
Цитата(aaarrr @ Jan 2 2012, 15:28) *
Забейте, батюшка, на I2C - заборете сейчас, так непременно сломается в будущем. Нервы дороже.

Это применительно к I2C вообще, или только к сэму?

Последнее время у меня с I2C частенько выскакивают проблемы, может быть, из-за наличия рядом с проводниками других цепей с частотами в десятки МГц?
aaarrr
Только к сэмам. Скажем, на AVR совершенно замечательный TWI, хотя и называется так же.
А что касается влияния высокочастотных цепей, то это вопрос к трассировке.
sonycman
Цитата(aaarrr @ Jan 2 2012, 16:50) *
Только к сэмам. Скажем, на AVR совершенно замечательный TWI, хотя и называется так же.
А что касается влияния высокочастотных цепей, то это вопрос к трассировке.

Вот ведь позор то какой, на крошке AVR хороший TWI, а на крупных камнях - совсем никакой sad.gif
На девятых армах, интересно, как с этим дела?

Написал софтовый TWI, правда, пока без поддержки Clock Stretching и без фильтрации, и только в режиме мастера.
Но результат налицо - пока что ни одного глюка, убрал все кондёры с шины, и даже щупы осциллографа не мешают - ни одного чиха! sm.gif
aaarrr
На девятых такая же порнография. В последних железках не стал даже задействовать, так как результат немного предсказуем.
sonycman
Блин, решил сравнить код IAR с Keil, поставил последний MDK4.23 и столкнулся с проблемой на ровном месте.

Не могу прошить SAM3U4C, похоже, Кейл не положила необходимый загрузчик для двухбанкового флеш этого контроллера.
Запись либо виснет и выдаёт ошибку на этапе стирания, либо вываливается на этапе программирования...

Кто как решает эту проблему?

ЗЫ: в IAR делаю так - задаю один банк 0xE0000 - 0x1FFFFF и прошиваю без проблем.
aaarrr
Самбой его! Для сравнения ведь все равно, на самом деле.

Оговорюсь только, что сам этим продуктом (самбой то есть) пользоваться избегаю, ибо глюк на глюке и тормоз. Самописные программаторы выручают.
Хотя в случае SAM3U именно её и применял.
sonycman
Цитата(aaarrr @ Jan 5 2012, 19:41) *
Самбой его! Для сравнения ведь все равно, на самом деле.

Оговорюсь только, что сам этим продуктом (самбой то есть) пользоваться избегаю, ибо глюк на глюке и тормоз. Самописные программаторы выручают.
Хотя в случае SAM3U именно её и применял.

Спасибо, а я уже и не помню, когда в последний раз пользовался самбой sm.gif
Совсем забыл о её существовании...

Пришлось написать свой загрузчик для Кейла, точнее - модифицировать существующие, чтобы загрузка шла сразу в оба банка.
Там у них даже проект с исходниками загрузчиков есть, только немного подправить пришлось и адреса под себя изменить sm.gif

Вроде шить стало нормально, хотя и подвисает в процессе секунд на 15, безо всяких ошибок.
Помнится, старый MDK тоже страдал такой проблемой, ну да бог с ним.

А что я взялся - вчера взглянул поглубже в скомпилированный код МП3 декодера, функции Polyphase() - всё таки IAR до RealView пока не дотянулся по качеству кода.
Во первых, IAR сгенерил код длиннее, и стека при этом захапал аж 400 (!) байт под раскладывание аргументов цикла.
А у RealView код компактнее, быстрее по времени на 15% и стека гораздо меньше хавает.

Эх, теперь вот подумалось - а какого чёрта я на ИАР перебрался? sad.gif

Сорри за небольшой оффтоп sm.gif

ЗЫ: вот, к примеру, код цикла от IAR:
CODE


269 /* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */
270 coef = coefBase + 16;
\ 000002F6 5A98 LDR R0,[SP, #+360]
\ 000002F8 00F24002 ADDW R2,R0,#+64
271 vb1 = vbuf + 64;
\ 000002FC 04F20010 ADDW R0,R4,#+256
\ 00000300 0090 STR R0,[SP, #+0]
272 pcm += 2;
\ 00000302 5998 LDR R0,[SP, #+356]
\ 00000304 001D ADDS R0,R0,#+4
\ 00000306 0190 STR R0,[SP, #+4]
273
274 /* right now, the compiler creates bad asm from this... */
275 for (i = 15; i > 0; i--)
\ 00000308 0F20 MOVS R0,#+15
\ 0000030A 0B90 STR R0,[SP, #+44]
276 {
277 sum1L = sum2L = rndVal;
278 sum1R = sum2R = rndVal;
279
280 MC2S(0)
\ ??mp3_PolyphaseStereo_0:
\ 0000030C 52F8041B LDR R1,[R2], #+4
\ 00000310 52F8043B LDR R3,[R2], #+4
\ 00000314 5691 STR R1,[SP, #+344]
\ 00000316 0098 LDR R0,[SP, #+0]
\ 00000318 D0F800C0 LDR R12,[R0, #+0]
\ 0000031C 0A93 STR R3,[SP, #+40]
\ 0000031E 5C42 RSBS R4,R3,#+0
\ 00000320 5194 STR R4,[SP, #+324]
\ 00000322 0098 LDR R0,[SP, #+0]
\ 00000324 C56D LDR R5,[R0, #+92]
\ 00000326 2F95 STR R5,[SP, #+188]
\ 00000328 0991 STR R1,[SP, #+36]
\ 0000032A 1591 STR R1,[SP, #+84]
\ 0000032C 0098 LDR R0,[SP, #+0]
\ 0000032E D0F88050 LDR R5,[R0, #+128]
\ 00000332 2E95 STR R5,[SP, #+184]
\ 00000334 5093 STR R3,[SP, #+320]
\ 00000336 1494 STR R4,[SP, #+80]
\ 00000338 0098 LDR R0,[SP, #+0]
\ 0000033A D0F8DC30 LDR R3,[R0, #+220]
\ 0000033E 2D93 STR R3,[SP, #+180]
\ 00000340 4F91 STR R1,[SP, #+316]
281 MC2S(1)
\ 00000342 52F8041B LDR R1,[R2], #+4
\ 00000346 52F8043B LDR R3,[R2], #+4
\ 0000034A 4E91 STR R1,[SP, #+312]
\ 0000034C 0098 LDR R0,[SP, #+0]
\ 0000034E 4468 LDR R4,[R0, #+4]
\ 00000350 2C94 STR R4,[SP, #+176]
\ 00000352 0893 STR R3,[SP, #+32]
\ 00000354 5C42 RSBS R4,R3,#+0
\ 00000356 4D94 STR R4,[SP, #+308]
\ 00000358 0098 LDR R0,[SP, #+0]
\ 0000035A 856D LDR R5,[R0, #+88]
\ 0000035C 2B95 STR R5,[SP, #+172]
\ 0000035E 0791 STR R1,[SP, #+28]
\ 00000360 1391 STR R1,[SP, #+76]
\ 00000362 0098 LDR R0,[SP, #+0]
\ 00000364 D0F88450 LDR R5,[R0, #+132]
\ 00000368 2A95 STR R5,[SP, #+168]
\ 0000036A 4C93 STR R3,[SP, #+304]
\ 0000036C 1294 STR R4,[SP, #+72]
\ 0000036E 0098 LDR R0,[SP, #+0]
\ 00000370 D0F8D830 LDR R3,[R0, #+216]
\ 00000374 2993 STR R3,[SP, #+164]
\ 00000376 4B91 STR R1,[SP, #+300]
282 MC2S(2)
\ 00000378 52F8041B LDR R1,[R2], #+4
\ 0000037C 52F8043B LDR R3,[R2], #+4
\ 00000380 4A91 STR R1,[SP, #+296]
\ 00000382 0098 LDR R0,[SP, #+0]
\ 00000384 8468 LDR R4,[R0, #+8]
\ 00000386 2894 STR R4,[SP, #+160]
\ 00000388 0693 STR R3,[SP, #+24]
\ 0000038A 5C42 RSBS R4,R3,#+0
\ 0000038C 4994 STR R4,[SP, #+292]
\ 0000038E 0098 LDR R0,[SP, #+0]
\ 00000390 456D LDR R5,[R0, #+84]
\ 00000392 2795 STR R5,[SP, #+156]
\ 00000394 0591 STR R1,[SP, #+20]
\ 00000396 1191 STR R1,[SP, #+68]
\ 00000398 0098 LDR R0,[SP, #+0]
\ 0000039A D0F88850 LDR R5,[R0, #+136]
\ 0000039E 2695 STR R5,[SP, #+152]
\ 000003A0 4893 STR R3,[SP, #+288]
\ 000003A2 1094 STR R4,[SP, #+64]
\ 000003A4 0098 LDR R0,[SP, #+0]
\ 000003A6 D0F8D430 LDR R3,[R0, #+212]
\ 000003AA 2593 STR R3,[SP, #+148]
\ 000003AC 4791 STR R1,[SP, #+284]
283 MC2S(3)
\ 000003AE 52F8041B LDR R1,[R2], #+4
\ 000003B2 52F8043B LDR R3,[R2], #+4
\ 000003B6 4691 STR R1,[SP, #+280]
\ 000003B8 0098 LDR R0,[SP, #+0]
\ 000003BA C468 LDR R4,[R0, #+12]
\ 000003BC 2494 STR R4,[SP, #+144]
\ 000003BE 0493 STR R3,[SP, #+16]
\ 000003C0 5C42 RSBS R4,R3,#+0
\ 000003C2 4594 STR R4,[SP, #+276]
\ 000003C4 0098 LDR R0,[SP, #+0]
\ 000003C6 056D LDR R5,[R0, #+80]
\ 000003C8 2395 STR R5,[SP, #+140]
\ 000003CA 0391 STR R1,[SP, #+12]
\ 000003CC 0F91 STR R1,[SP, #+60]
\ 000003CE 0098 LDR R0,[SP, #+0]
\ 000003D0 D0F88C50 LDR R5,[R0, #+140]
\ 000003D4 2295 STR R5,[SP, #+136]
\ 000003D6 4493 STR R3,[SP, #+272]
\ 000003D8 4394 STR R4,[SP, #+268]
\ 000003DA 0098 LDR R0,[SP, #+0]
\ 000003DC D0F8D030 LDR R3,[R0, #+208]
\ 000003E0 2193 STR R3,[SP, #+132]
\ 000003E2 4291 STR R1,[SP, #+264]
284 MC2S(4)
\ 000003E4 52F8041B LDR R1,[R2], #+4
\ 000003E8 52F8043B LDR R3,[R2], #+4
\ 000003EC 4191 STR R1,[SP, #+260]
\ 000003EE 0098 LDR R0,[SP, #+0]
\ 000003F0 0469 LDR R4,[R0, #+16]
\ 000003F2 2094 STR R4,[SP, #+128]
\ 000003F4 0293 STR R3,[SP, #+8]
\ 000003F6 5C42 RSBS R4,R3,#+0
\ 000003F8 4094 STR R4,[SP, #+256]
\ 000003FA 0098 LDR R0,[SP, #+0]
\ 000003FC C56C LDR R5,[R0, #+76]
\ 000003FE 1F95 STR R5,[SP, #+124]
\ 00000400 0E91 STR R1,[SP, #+56]
\ 00000402 3F91 STR R1,[SP, #+252]
\ 00000404 0098 LDR R0,[SP, #+0]
\ 00000406 D0F89050 LDR R5,[R0, #+144]
\ 0000040A 1E95 STR R5,[SP, #+120]
\ 0000040C 3E93 STR R3,[SP, #+248]
\ 0000040E 3D94 STR R4,[SP, #+244]
\ 00000410 0098 LDR R0,[SP, #+0]
\ 00000412 D0F8CC30 LDR R3,[R0, #+204]
\ 00000416 1D93 STR R3,[SP, #+116]
\ 00000418 3C91 STR R1,[SP, #+240]
285 MC2S(5)
\ 0000041A 52F8041B LDR R1,[R2], #+4
\ 0000041E 52F8043B LDR R3,[R2], #+4
\ 00000422 3B91 STR R1,[SP, #+236]
\ 00000424 0098 LDR R0,[SP, #+0]
\ 00000426 4469 LDR R4,[R0, #+20]
\ 00000428 1C94 STR R4,[SP, #+112]
\ 0000042A 0D93 STR R3,[SP, #+52]
\ 0000042C 5C42 RSBS R4,R3,#+0
\ 0000042E 3A94 STR R4,[SP, #+232]
\ 00000430 0098 LDR R0,[SP, #+0]
\ 00000432 D0F848A0 LDR R10,[R0, #+72]
\ 00000436 0C91 STR R1,[SP, #+48]
\ 00000438 3991 STR R1,[SP, #+228]
\ 0000043A 0098 LDR R0,[SP, #+0]
\ 0000043C D0F89450 LDR R5,[R0, #+148]
\ 00000440 1B95 STR R5,[SP, #+108]
\ 00000442 3893 STR R3,[SP, #+224]
\ 00000444 3794 STR R4,[SP, #+220]
\ 00000446 0098 LDR R0,[SP, #+0]
\ 00000448 D0F8C830 LDR R3,[R0, #+200]
\ 0000044C 1A93 STR R3,[SP, #+104]
\ 0000044E 3691 STR R1,[SP, #+216]
286 MC2S(6)
\ 00000450 52F8049B LDR R9,[R2], #+4
\ 00000454 52F8045B LDR R5,[R2], #+4
\ 00000458 CDF8D490 STR R9,[SP, #+212]
\ 0000045C 0098 LDR R0,[SP, #+0]
\ 0000045E 8169 LDR R1,[R0, #+24]
\ 00000460 1991 STR R1,[SP, #+100]
\ 00000462 6942 RSBS R1,R5,#+0
\ 00000464 3491 STR R1,[SP, #+208]
\ 00000466 0098 LDR R0,[SP, #+0]
\ 00000468 436C LDR R3,[R0, #+68]
\ 0000046A 1893 STR R3,[SP, #+96]
\ 0000046C CDF8CC90 STR R9,[SP, #+204]
\ 00000470 0098 LDR R0,[SP, #+0]
\ 00000472 D0F89830 LDR R3,[R0, #+152]
\ 00000476 1793 STR R3,[SP, #+92]
\ 00000478 3295 STR R5,[SP, #+200]
\ 0000047A 3191 STR R1,[SP, #+196]
\ 0000047C 0098 LDR R0,[SP, #+0]
\ 0000047E D0F8C410 LDR R1,[R0, #+196]
\ 00000482 1691 STR R1,[SP, #+88]
\ 00000484 CDF8C090 STR R9,[SP, #+192]
287 MC2S(7)
\ 00000488 52F8043B LDR R3,[R2], #+4
\ 0000048C 52F804EB LDR LR,[R2], #+4
\ 00000490 0098 LDR R0,[SP, #+0]
\ 00000492 D0F81C80 LDR R8,[R0, #+28]
\ 00000496 046C LDR R4,[R0, #+64]
\ 00000498 0A98 LDR R0,[SP, #+40]
\ 0000049A 80FB0C01 SMULL R0,R1,R0,R12
\ 0000049E C3FB0401 SMLAL R0,R1,R3,R4
\ 000004A2 2F9E LDR R6,[SP, #+188]
\ 000004A4 099F LDR R7,[SP, #+36]
\ 000004A6 C7FB0601 SMLAL R0,R1,R7,R6
\ 000004AA 2C9E LDR R6,[SP, #+176]
\ 000004AC 089F LDR R7,[SP, #+32]
\ 000004AE C7FB0601 SMLAL R0,R1,R7,R6
\ 000004B2 2B9E LDR R6,[SP, #+172]
\ 000004B4 079F LDR R7,[SP, #+28]
\ 000004B6 C7FB0601 SMLAL R0,R1,R7,R6
\ 000004BA 289E LDR R6,[SP, #+160]
\ 000004BC 069F LDR R7,[SP, #+24]
\ 000004BE C7FB0601 SMLAL R0,R1,R7,R6
\ 000004C2 279E LDR R6,[SP, #+156]
\ 000004C4 059F LDR R7,[SP, #+20]
\ 000004C6 C7FB0601 SMLAL R0,R1,R7,R6
\ 000004CA 249E LDR R6,[SP, #+144]
\ 000004CC 049F LDR R7,[SP, #+16]
\ 000004CE C7FB0601 SMLAL R0,R1,R7,R6
\ 000004D2 239E LDR R6,[SP, #+140]
\ 000004D4 039F LDR R7,[SP, #+12]
\ 000004D6 C7FB0601 SMLAL R0,R1,R7,R6
\ 000004DA 209E LDR R6,[SP, #+128]
\ 000004DC 029F LDR R7,[SP, #+8]
\ 000004DE C7FB0601 SMLAL R0,R1,R7,R6
\ 000004E2 1F9E LDR R6,[SP, #+124]
\ 000004E4 0E9F LDR R7,[SP, #+56]
\ 000004E6 C7FB0601 SMLAL R0,R1,R7,R6
\ 000004EA 1C9E LDR R6,[SP, #+112]
\ 000004EC 0D9F LDR R7,[SP, #+52]
\ 000004EE C7FB0601 SMLAL R0,R1,R7,R6
\ 000004F2 0C9F LDR R7,[SP, #+48]
\ 000004F4 C7FB0A01 SMLAL R0,R1,R7,R10
\ 000004F8 199F LDR R7,[SP, #+100]
\ 000004FA C5FB0701 SMLAL R0,R1,R5,R7
\ 000004FE 189D LDR R5,[SP, #+96]
\ 00000500 C9FB0501 SMLAL R0,R1,R9,R5
\ 00000504 CEFB0801 SMLAL R0,R1,LR,R8
\ 00000508 10F10070 ADDS R0,R0,#+33554432
\ 0000050C 41F10001 ADC R1,R1,#+0
\ 00000510 CDE95401 STRD R0,R1,[SP, #+336]
\ 00000514 0098 LDR R0,[SP, #+0]
\ 00000516 D0F89C70 LDR R7,[R0, #+156]
\ 0000051A D0F8C050 LDR R5,[R0, #+192]
\ 0000051E CEF10006 RSB R6,LR,#+0
\ 00000522 2E98 LDR R0,[SP, #+184]
\ 00000524 1599 LDR R1,[SP, #+84]
\ 00000526 81FB0001 SMULL R0,R1,R1,R0
\ 0000052A C6FB0501 SMLAL R0,R1,R6,R5
\ 0000052E DDF8B490 LDR R9,[SP, #+180]
\ 00000532 149E LDR R6,[SP, #+80]
\ 00000534 C6FB0901 SMLAL R0,R1,R6,R9
\ 00000538 DDF8A890 LDR R9,[SP, #+168]
\ 0000053C 139E LDR R6,[SP, #+76]
\ 0000053E C6FB0901 SMLAL R0,R1,R6,R9
\ 00000542 DDF8A490 LDR R9,[SP, #+164]
\ 00000546 129E LDR R6,[SP, #+72]
\ 00000548 C6FB0901 SMLAL R0,R1,R6,R9
\ 0000054C DDF89890 LDR R9,[SP, #+152]
\ 00000550 119E LDR R6,[SP, #+68]
\ 00000552 C6FB0901 SMLAL R0,R1,R6,R9
\ 00000556 DDF89490 LDR R9,[SP, #+148]
\ 0000055A 109E LDR R6,[SP, #+64]
\ 0000055C C6FB0901 SMLAL R0,R1,R6,R9
\ 00000560 DDF88890 LDR R9,[SP, #+136]
\ 00000564 0F9E LDR R6,[SP, #+60]
\ 00000566 C6FB0901 SMLAL R0,R1,R6,R9
\ 0000056A DDF88490 LDR R9,[SP, #+132]
\ 0000056E 439E LDR R6,[SP, #+268]
\ 00000570 C6FB0901 SMLAL R0,R1,R6,R9
\ 00000574 DDF87890 LDR R9,[SP, #+120]
\ 00000578 3F9E LDR R6,[SP, #+252]
\ 0000057A C6FB0901 SMLAL R0,R1,R6,R9
\ 0000057E DDF87490 LDR R9,[SP, #+116]
\ 00000582 3D9E LDR R6,[SP, #+244]
\ 00000584 C6FB0901 SMLAL R0,R1,R6,R9
\ 00000588 DDF86C90 LDR R9,[SP, #+108]
\ 0000058C 399E LDR R6,[SP, #+228]
\ 0000058E C6FB0901 SMLAL R0,R1,R6,R9
\ 00000592 DDF86890 LDR R9,[SP, #+104]
\ 00000596 379E LDR R6,[SP, #+220]
\ 00000598 C6FB0901 SMLAL R0,R1,R6,R9
\ 0000059C DDF85C90 LDR R9,[SP, #+92]
\ 000005A0 339E LDR R6,[SP, #+204]
\ 000005A2 C6FB0901 SMLAL R0,R1,R6,R9
\ 000005A6 DDF85890 LDR R9,[SP, #+88]
\ 000005AA 319E LDR R6,[SP, #+196]
\ 000005AC C6FB0901 SMLAL R0,R1,R6,R9
\ 000005B0 C3FB0701 SMLAL R0,R1,R3,R7
\ 000005B4 10F10070 ADDS R0,R0,#+33554432
\ 000005B8 41F10001 ADC R1,R1,#+0
\ 000005BC CDE95201 STRD R0,R1,[SP, #+328]
\ 000005C0 2E98 LDR R0,[SP, #+184]
\ 000005C2 5099 LDR R1,[SP, #+320]
\ 000005C4 81FB0001 SMULL R0,R1,R1,R0
\ 000005C8 C3FB0501 SMLAL R0,R1,R3,R5
\ 000005CC 2D9D LDR R5,[SP, #+180]
\ 000005CE 4F9E LDR R6,[SP, #+316]
\ 000005D0 C6FB0501 SMLAL R0,R1,R6,R5
\ 000005D4 2A9D LDR R5,[SP, #+168]
\ 000005D6 4C9E LDR R6,[SP, #+304]
\ 000005D8 C6FB0501 SMLAL R0,R1,R6,R5
\ 000005DC 299D LDR R5,[SP, #+164]
\ 000005DE 4B9E LDR R6,[SP, #+300]
\ 000005E0 C6FB0501 SMLAL R0,R1,R6,R5
\ 000005E4 269D LDR R5,[SP, #+152]
\ 000005E6 489E LDR R6,[SP, #+288]
\ 000005E8 C6FB0501 SMLAL R0,R1,R6,R5
\ 000005EC 259D LDR R5,[SP, #+148]
\ 000005EE 479E LDR R6,[SP, #+284]
\ 000005F0 C6FB0501 SMLAL R0,R1,R6,R5
\ 000005F4 229D LDR R5,[SP, #+136]
\ 000005F6 449E LDR R6,[SP, #+272]
\ 000005F8 C6FB0501 SMLAL R0,R1,R6,R5
\ 000005FC 219D LDR R5,[SP, #+132]
\ 000005FE 429E LDR R6,[SP, #+264]
\ 00000600 C6FB0501 SMLAL R0,R1,R6,R5
\ 00000604 1E9D LDR R5,[SP, #+120]
\ 00000606 3E9E LDR R6,[SP, #+248]
\ 00000608 C6FB0501 SMLAL R0,R1,R6,R5
\ 0000060C 1D9D LDR R5,[SP, #+116]
\ 0000060E 3C9E LDR R6,[SP, #+240]
\ 00000610 C6FB0501 SMLAL R0,R1,R6,R5
\ 00000614 1B9D LDR R5,[SP, #+108]
\ 00000616 389E LDR R6,[SP, #+224]
\ 00000618 C6FB0501 SMLAL R0,R1,R6,R5
\ 0000061C 1A9D LDR R5,[SP, #+104]
\ 0000061E 369E LDR R6,[SP, #+216]
\ 00000620 C6FB0501 SMLAL R0,R1,R6,R5
\ 00000624 179D LDR R5,[SP, #+92]
\ 00000626 329E LDR R6,[SP, #+200]
\ 00000628 C6FB0501 SMLAL R0,R1,R6,R5
\ 0000062C 169D LDR R5,[SP, #+88]
\ 0000062E 309E LDR R6,[SP, #+192]
\ 00000630 C6FB0501 SMLAL R0,R1,R6,R5
\ 00000634 CEFB0701 SMLAL R0,R1,LR,R7
\ 00000638 10F10070 ADDS R0,R0,#+33554432
\ 0000063C 41F10001 ADC R1,R1,#+0
288
289 vb1 += 64;
\ 00000640 009D LDR R5,[SP, #+0]
\ 00000642 05F20017 ADDW R7,R5,#+256
\ 00000646 0097 STR R7,[SP, #+0]
290 *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS);
\ 00000648 CEF1000E RSB LR,LR,#+0
\ 0000064C 2746 MOV R7,R4
\ 0000064E 569C LDR R4,[SP, #+344]
\ 00000650 84FB0C45 SMULL R4,R5,R4,R12
\ 00000654 CEFB0745 SMLAL R4,R5,LR,R7
\ 00000658 2F9F LDR R7,[SP, #+188]
\ 0000065A 519E LDR R6,[SP, #+324]
\ 0000065C C6FB0745 SMLAL R4,R5,R6,R7
\ 00000660 2C9F LDR R7,[SP, #+176]
\ 00000662 4E9E LDR R6,[SP, #+312]
\ 00000664 C6FB0745 SMLAL R4,R5,R6,R7
\ 00000668 2B9F LDR R7,[SP, #+172]
\ 0000066A 4D9E LDR R6,[SP, #+308]
\ 0000066C C6FB0745 SMLAL R4,R5,R6,R7
\ 00000670 289F LDR R7,[SP, #+160]
\ 00000672 4A9E LDR R6,[SP, #+296]
\ 00000674 C6FB0745 SMLAL R4,R5,R6,R7
\ 00000678 279F LDR R7,[SP, #+156]
\ 0000067A 499E LDR R6,[SP, #+292]
\ 0000067C C6FB0745 SMLAL R4,R5,R6,R7
\ 00000680 249F LDR R7,[SP, #+144]
\ 00000682 469E LDR R6,[SP, #+280]
\ 00000684 C6FB0745 SMLAL R4,R5,R6,R7
\ 00000688 239F LDR R7,[SP, #+140]
\ 0000068A 459E LDR R6,[SP, #+276]
\ 0000068C C6FB0745 SMLAL R4,R5,R6,R7
\ 00000690 209F LDR R7,[SP, #+128]
\ 00000692 419E LDR R6,[SP, #+260]
\ 00000694 C6FB0745 SMLAL R4,R5,R6,R7
\ 00000698 1F9F LDR R7,[SP, #+124]
\ 0000069A 409E LDR R6,[SP, #+256]
\ 0000069C C6FB0745 SMLAL R4,R5,R6,R7
\ 000006A0 1C9F LDR R7,[SP, #+112]
\ 000006A2 3B9E LDR R6,[SP, #+236]
\ 000006A4 C6FB0745 SMLAL R4,R5,R6,R7
\ 000006A8 3A9F LDR R7,[SP, #+232]
\ 000006AA C7FB0A45 SMLAL R4,R5,R7,R10
\ 000006AE 199F LDR R7,[SP, #+100]
\ 000006B0 359E LDR R6,[SP, #+212]
\ 000006B2 C6FB0745 SMLAL R4,R5,R6,R7
\ 000006B6 189F LDR R7,[SP, #+96]
\ 000006B8 349E LDR R6,[SP, #+208]
\ 000006BA C6FB0745 SMLAL R4,R5,R6,R7
\ 000006BE C3FB0845 SMLAL R4,R5,R3,R8
\ 000006C2 14F10074 ADDS R4,R4,#+33554432
\ 000006C6 45F10005 ADC R5,R5,#+0
\ 000006CA 240D LSRS R4,R4,#+20
\ 000006CC 44EA0534 ORR R4,R4,R5, LSL #+12
\ 000006D0 A311 ASRS R3,R4,#+6
\ 000006D2 DC17 ASRS R4,R3,#+31
\ 000006D4 B4EBE33F CMP R4,R3, ASR #+15
\ 000006D8 1CBF ITT NE
\ 000006DA 84F4FE43 EORNE R3,R4,#0x7F00
\ 000006DE 83F0FF03 EORNE R3,R3,#0xFF
\ 000006E2 019C LDR R4,[SP, #+4]
\ 000006E4 2380 STRH R3,[R4, #+0]
291 *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS);
\ 000006E6 DDE95245 LDRD R4,R5,[SP, #+328]
\ 000006EA 240D LSRS R4,R4,#+20
\ 000006EC 44EA0534 ORR R4,R4,R5, LSL #+12
\ 000006F0 A311 ASRS R3,R4,#+6
\ 000006F2 DC17 ASRS R4,R3,#+31
\ 000006F4 B4EBE33F CMP R4,R3, ASR #+15
\ 000006F8 1CBF ITT NE
\ 000006FA 84F4FE43 EORNE R3,R4,#0x7F00
\ 000006FE 83F0FF03 EORNE R3,R3,#0xFF
\ 00000702 019C LDR R4,[SP, #+4]
\ 00000704 6380 STRH R3,[R4, #+2]
292 *(pcm + 2*2*i + 0) = ClipToShort((int)SAR64(sum2L, (32-CSHIFT)), DEF_NFRACBITS);
\ 00000706 DDE95445 LDRD R4,R5,[SP, #+336]
\ 0000070A 240D LSRS R4,R4,#+20
\ 0000070C 44EA0534 ORR R4,R4,R5, LSL #+12
\ 00000710 A311 ASRS R3,R4,#+6
\ 00000712 DC17 ASRS R4,R3,#+31
\ 00000714 B4EBE33F CMP R4,R3, ASR #+15
\ 00000718 1CBF ITT NE
\ 0000071A 84F4FE43 EORNE R3,R4,#0x7F00
\ 0000071E 83F0FF03 EORNE R3,R3,#0xFF
\ 00000722 0B9C LDR R4,[SP, #+44]
\ 00000724 019D LDR R5,[SP, #+4]
\ 00000726 25F83430 STRH R3,[R5, R4, LSL #+3]
293 *(pcm + 2*2*i + 1) = ClipToShort((int)SAR64(sum2R, (32-CSHIFT)), DEF_NFRACBITS);
\ 0000072A 000D LSRS R0,R0,#+20
\ 0000072C 40EA0130 ORR R0,R0,R1, LSL #+12
\ 00000730 8011 ASRS R0,R0,#+6
\ 00000732 C117 ASRS R1,R0,#+31
\ 00000734 B1EBE03F CMP R1,R0, ASR #+15
\ 00000738 1CBF ITT NE
\ 0000073A 81F4FE40 EORNE R0,R1,#0x7F00
\ 0000073E 80F0FF00 EORNE R0,R0,#0xFF
\ 00000742 0B99 LDR R1,[SP, #+44]
\ 00000744 019B LDR R3,[SP, #+4]
\ 00000746 03EBC101 ADD R1,R3,R1, LSL #+3
\ 0000074A 4880 STRH R0,[R1, #+2]
294 pcm += 2;
\ 0000074C 0198 LDR R0,[SP, #+4]
\ 0000074E 001D ADDS R0,R0,#+4
\ 00000750 0190 STR R0,[SP, #+4]
295 }
\ 00000752 0B98 LDR R0,[SP, #+44]
\ 00000754 401E SUBS R0,R0,#+1
\ 00000756 0B90 STR R0,[SP, #+44]
\ 00000758 0128 CMP R0,#+1
\ 0000075A BFF6D7AD BGE.W ??mp3_PolyphaseStereo_0

а вот RealView:
CODE


/* main convolution loop: sum1L = samples 1, 2, 3, ... 15 sum2L = samples 31, 30, ... 17 */
;;;270 coef = coefBase + 16;
;;;271 vb1 = vbuf + 64;
;;;272 pcm += 2;
000272 1d05 ADDS r5,r0,#4
000274 f1020440 ADD r4,r2,#0x40 ;270
000278 f5017180 ADD r1,r1,#0x100 ;271
;;;273
;;;274 /* right now, the compiler creates bad asm from this... */
;;;275 for (i = 15; i > 0; i--) {
00027c f05f060f MOVS.W r6,#0xf
|L2.640|
;;;276 sum1L = sum2L = rndVal;
;;;277 sum1R = sum2R = rndVal;
;;;278
;;;279 MC2S(0)
000280 f8547b04 LDR r7,[r4],#4
000284 f8d19000 LDR r9,[r1,#0]
000288 f8548b04 LDR r8,[r4],#4
00028c 469b MOV r11,r3
00028e 46e6 MOV lr,r12
000290 fbc9be08 SMLAL r11,lr,r9,r8
000294 f8d1a05c LDR r10,[r1,#0x5c]
000298 4662 MOV r2,r12
00029a 4618 MOV r0,r3
00029c fbc90207 SMLAL r0,r2,r9,r7
0002a0 fbcabe07 SMLAL r11,lr,r10,r7
0002a4 f1c80900 RSB r9,r8,#0
0002a8 fbca0209 SMLAL r0,r2,r10,r9
0002ac f8cde038 STR lr,[sp,#0x38]
0002b0 f8cdb050 STR r11,[sp,#0x50]
0002b4 f8cd901c STR r9,[sp,#0x1c]
0002b8 e9cd2003 STRD r2,r0,[sp,#0xc]
0002bc f8d19080 LDR r9,[r1,#0x80]
0002c0 469a MOV r10,r3
0002c2 4662 MOV r2,r12
0002c4 fbc9a208 SMLAL r10,r2,r9,r8
0002c8 f8d100dc LDR r0,[r1,#0xdc]
0002cc 469b MOV r11,r3
0002ce 46e6 MOV lr,r12
0002d0 fbc9be07 SMLAL r11,lr,r9,r7
0002d4 f8dd901c LDR r9,[sp,#0x1c]
0002d8 fbc0a207 SMLAL r10,r2,r0,r7
0002dc fbc0be09 SMLAL r11,lr,r0,r9
0002e0 f8cda020 STR r10,[sp,#0x20]
0002e4 920a STR r2,[sp,#0x28]
0002e6 e9cdeb01 STRD lr,r11,[sp,#4]
;;;280 MC2S(1)
0002ea f8548b04 LDR r8,[r4],#4
0002ee 684f LDR r7,[r1,#4]
0002f0 f8549b04 LDR r9,[r4],#4
0002f4 f8dde038 LDR lr,[sp,#0x38]
0002f8 f8ddb050 LDR r11,[sp,#0x50]
0002fc e9dd2003 LDRD r2,r0,[sp,#0xc]
000300 fbc7be09 SMLAL r11,lr,r7,r9
000304 f8d1a058 LDR r10,[r1,#0x58]
000308 fbc70208 SMLAL r0,r2,r7,r8
00030c f1c90700 RSB r7,r9,#0
000310 fbcabe08 SMLAL r11,lr,r10,r8
000314 fbca0207 SMLAL r0,r2,r10,r7
000318 f8cde038 STR lr,[sp,#0x38]
00031c f8cdb050 STR r11,[sp,#0x50]
000320 9707 STR r7,[sp,#0x1c]
000322 e9cd2003 STRD r2,r0,[sp,#0xc]
000326 f8d17084 LDR r7,[r1,#0x84]
00032a f8dda020 LDR r10,[sp,#0x20]
00032e 9a0a LDR r2,[sp,#0x28]
000330 e9ddeb01 LDRD lr,r11,[sp,#4]
000334 fbc7a209 SMLAL r10,r2,r7,r9
000338 f8d100d8 LDR r0,[r1,#0xd8]
00033c fbc7be08 SMLAL r11,lr,r7,r8
000340 9f07 LDR r7,[sp,#0x1c]
000342 fbc0a208 SMLAL r10,r2,r0,r8
000346 fbc0be07 SMLAL r11,lr,r0,r7
00034a f8cda020 STR r10,[sp,#0x20]
00034e 920a STR r2,[sp,#0x28]
000350 e9cdeb01 STRD lr,r11,[sp,#4]
;;;281 MC2S(2)
000354 f8548b04 LDR r8,[r4],#4
000358 688f LDR r7,[r1,#8]
00035a f8549b04 LDR r9,[r4],#4
00035e f8dde038 LDR lr,[sp,#0x38]
000362 f8ddb050 LDR r11,[sp,#0x50]
000366 e9dd2003 LDRD r2,r0,[sp,#0xc]
00036a fbc7be09 SMLAL r11,lr,r7,r9
00036e f8d1a054 LDR r10,[r1,#0x54]
000372 fbc70208 SMLAL r0,r2,r7,r8
000376 f1c90700 RSB r7,r9,#0
00037a fbcabe08 SMLAL r11,lr,r10,r8
00037e fbca0207 SMLAL r0,r2,r10,r7
000382 f8cde038 STR lr,[sp,#0x38]
000386 f8cdb050 STR r11,[sp,#0x50]
00038a 9707 STR r7,[sp,#0x1c]
00038c e9cd2003 STRD r2,r0,[sp,#0xc]
000390 f8d17088 LDR r7,[r1,#0x88]
000394 f8dda020 LDR r10,[sp,#0x20]
000398 9a0a LDR r2,[sp,#0x28]
00039a e9ddeb01 LDRD lr,r11,[sp,#4]
00039e fbc7a209 SMLAL r10,r2,r7,r9
0003a2 f8d100d4 LDR r0,[r1,#0xd4]
0003a6 fbc7be08 SMLAL r11,lr,r7,r8
0003aa 9f07 LDR r7,[sp,#0x1c]
0003ac fbc0a208 SMLAL r10,r2,r0,r8
0003b0 fbc0be07 SMLAL r11,lr,r0,r7
0003b4 f8cda020 STR r10,[sp,#0x20]
0003b8 920a STR r2,[sp,#0x28]
0003ba e9cdeb01 STRD lr,r11,[sp,#4]
;;;282 MC2S(3)
0003be f8548b04 LDR r8,[r4],#4
0003c2 68cf LDR r7,[r1,#0xc]
0003c4 f8549b04 LDR r9,[r4],#4
0003c8 f8dde038 LDR lr,[sp,#0x38]
0003cc f8ddb050 LDR r11,[sp,#0x50]
0003d0 e9dd2003 LDRD r2,r0,[sp,#0xc]
0003d4 fbc7be09 SMLAL r11,lr,r7,r9
0003d8 f8d1a050 LDR r10,[r1,#0x50]
0003dc fbc70208 SMLAL r0,r2,r7,r8
0003e0 f1c90700 RSB r7,r9,#0
0003e4 fbcabe08 SMLAL r11,lr,r10,r8
0003e8 fbca0207 SMLAL r0,r2,r10,r7
0003ec f8cde038 STR lr,[sp,#0x38]
0003f0 f8cdb050 STR r11,[sp,#0x50]
0003f4 9707 STR r7,[sp,#0x1c]
0003f6 e9cd2003 STRD r2,r0,[sp,#0xc]
0003fa f8d1708c LDR r7,[r1,#0x8c]
0003fe f8dda020 LDR r10,[sp,#0x20]
000402 9a0a LDR r2,[sp,#0x28]
000404 e9ddeb01 LDRD lr,r11,[sp,#4]
000408 fbc7a209 SMLAL r10,r2,r7,r9
00040c f8d100d0 LDR r0,[r1,#0xd0]
000410 fbc7be08 SMLAL r11,lr,r7,r8
000414 9f07 LDR r7,[sp,#0x1c]
000416 fbc0a208 SMLAL r10,r2,r0,r8
00041a fbc0be07 SMLAL r11,lr,r0,r7
00041e f8cda020 STR r10,[sp,#0x20]
000422 920a STR r2,[sp,#0x28]
000424 e9cdeb01 STRD lr,r11,[sp,#4]
;;;283 MC2S(4)
000428 f8548b04 LDR r8,[r4],#4
00042c 690f LDR r7,[r1,#0x10]
00042e f8549b04 LDR r9,[r4],#4
000432 f8dde038 LDR lr,[sp,#0x38]
000436 f8ddb050 LDR r11,[sp,#0x50]
00043a e9dd2003 LDRD r2,r0,[sp,#0xc]
00043e fbc7be09 SMLAL r11,lr,r7,r9
000442 f8d1a04c LDR r10,[r1,#0x4c]
000446 fbc70208 SMLAL r0,r2,r7,r8
00044a f1c90700 RSB r7,r9,#0
00044e fbcabe08 SMLAL r11,lr,r10,r8
000452 fbca0207 SMLAL r0,r2,r10,r7
000456 f8cde038 STR lr,[sp,#0x38]
00045a f8cdb050 STR r11,[sp,#0x50]
00045e 9707 STR r7,[sp,#0x1c]
000460 e9cd2003 STRD r2,r0,[sp,#0xc]
000464 f8d17090 LDR r7,[r1,#0x90]
000468 f8dda020 LDR r10,[sp,#0x20]
00046c 9a0a LDR r2,[sp,#0x28]
00046e e9ddeb01 LDRD lr,r11,[sp,#4]
000472 fbc7a209 SMLAL r10,r2,r7,r9
000476 f8d100cc LDR r0,[r1,#0xcc]
00047a fbc7be08 SMLAL r11,lr,r7,r8
00047e 9f07 LDR r7,[sp,#0x1c]
000480 fbc0a208 SMLAL r10,r2,r0,r8
000484 fbc0be07 SMLAL r11,lr,r0,r7
000488 f8cda020 STR r10,[sp,#0x20]
00048c 920a STR r2,[sp,#0x28]
00048e e9cdeb01 STRD lr,r11,[sp,#4]
;;;284 MC2S(5)
000492 f8548b04 LDR r8,[r4],#4
000496 e9dd2003 LDRD r2,r0,[sp,#0xc]
00049a f8549b04 LDR r9,[r4],#4
00049e 694f LDR r7,[r1,#0x14]
0004a0 f8dde038 LDR lr,[sp,#0x38]
0004a4 f8ddb050 LDR r11,[sp,#0x50]
0004a8 f8d1a048 LDR r10,[r1,#0x48]
0004ac fbc7be09 SMLAL r11,lr,r7,r9
0004b0 fbc70208 SMLAL r0,r2,r7,r8
0004b4 f1c90700 RSB r7,r9,#0
0004b8 fbcabe08 SMLAL r11,lr,r10,r8
0004bc fbca0207 SMLAL r0,r2,r10,r7
0004c0 f8cde038 STR lr,[sp,#0x38]
0004c4 f8cdb050 STR r11,[sp,#0x50]
0004c8 9707 STR r7,[sp,#0x1c]
0004ca e9cd2003 STRD r2,r0,[sp,#0xc]
0004ce f8d17094 LDR r7,[r1,#0x94]
0004d2 f8dda020 LDR r10,[sp,#0x20]
0004d6 9a0a LDR r2,[sp,#0x28]
0004d8 e9ddeb01 LDRD lr,r11,[sp,#4]
0004dc fbc7a209 SMLAL r10,r2,r7,r9
0004e0 f8d100c8 LDR r0,[r1,#0xc8]
0004e4 fbc7be08 SMLAL r11,lr,r7,r8
0004e8 9f07 LDR r7,[sp,#0x1c]
0004ea fbc0a208 SMLAL r10,r2,r0,r8
0004ee fbc0be07 SMLAL r11,lr,r0,r7
0004f2 f8cda020 STR r10,[sp,#0x20]
0004f6 920a STR r2,[sp,#0x28]
0004f8 e9cdeb01 STRD lr,r11,[sp,#4]
;;;285 MC2S(6)
0004fc f8547b04 LDR r7,[r4],#4
000500 f8d1a018 LDR r10,[r1,#0x18]
000504 f8548b04 LDR r8,[r4],#4
000508 f8dde038 LDR lr,[sp,#0x38]
00050c f8ddb050 LDR r11,[sp,#0x50]
000510 e9dd2003 LDRD r2,r0,[sp,#0xc]
000514 fbcabe08 SMLAL r11,lr,r10,r8
000518 f8d19044 LDR r9,[r1,#0x44]
00051c fbca0207 SMLAL r0,r2,r10,r7
000520 f1c80a00 RSB r10,r8,#0
000524 fbc9020a SMLAL r0,r2,r9,r10
000528 fbc9be07 SMLAL r11,lr,r9,r7
00052c f8cda01c STR r10,[sp,#0x1c]
000530 e9cd2003 STRD r2,r0,[sp,#0xc]
000534 f8cde038 STR lr,[sp,#0x38]
000538 f8cdb050 STR r11,[sp,#0x50]
00053c f8d1a098 LDR r10,[r1,#0x98]
000540 f8dde020 LDR lr,[sp,#0x20]
000544 980a LDR r0,[sp,#0x28]
000546 e9dd9b01 LDRD r9,r11,[sp,#4]
00054a fbcae008 SMLAL lr,r0,r10,r8
00054e f8d120c4 LDR r2,[r1,#0xc4]
000552 fbcab907 SMLAL r11,r9,r10,r7
000556 f8dd801c LDR r8,[sp,#0x1c]
00055a fbc2e007 SMLAL lr,r0,r2,r7
00055e fbc2b908 SMLAL r11,r9,r2,r8
000562 f8cde020 STR lr,[sp,#0x20]
000566 900a STR r0,[sp,#0x28]
000568 e9cd9b01 STRD r9,r11,[sp,#4]
;;;286 MC2S(7)
00056c f8547b04 LDR r7,[r4],#4
000570 f8d1a01c LDR r10,[r1,#0x1c]
000574 f8548b04 LDR r8,[r4],#4
000578 f8dde038 LDR lr,[sp,#0x38]
00057c f8ddb050 LDR r11,[sp,#0x50]
000580 e9dd2003 LDRD r2,r0,[sp,#0xc]
000584 fbcabe08 SMLAL r11,lr,r10,r8
000588 f8d19040 LDR r9,[r1,#0x40]
00058c fbca0207 SMLAL r0,r2,r10,r7
000590 f1c80a00 RSB r10,r8,#0
000594 fbc9be07 SMLAL r11,lr,r9,r7
000598 fbc9020a SMLAL r0,r2,r9,r10
00059c f8cde038 STR lr,[sp,#0x38]
0005a0 f8cdb050 STR r11,[sp,#0x50]
0005a4 f8cda01c STR r10,[sp,#0x1c]
0005a8 e9cd2003 STRD r2,r0,[sp,#0xc]
0005ac e9dd9b01 LDRD r9,r11,[sp,#4]
0005b0 f8d1a09c LDR r10,[r1,#0x9c]
0005b4 f8d120c0 LDR r2,[r1,#0xc0]
0005b8 fbcab907 SMLAL r11,r9,r10,r7
0005bc f8dde020 LDR lr,[sp,#0x20]
0005c0 980a LDR r0,[sp,#0x28]
;;;287
;;;288 vb1 += 64;
0005c2 f5017180 ADD r1,r1,#0x100
0005c6 fbcae008 SMLAL lr,r0,r10,r8 ;286
0005ca f8dda01c LDR r10,[sp,#0x1c] ;286
0005ce fbc2e007 SMLAL lr,r0,r2,r7 ;286
0005d2 fbc2b90a SMLAL r11,r9,r2,r10 ;286
0005d6 4680 MOV r8,r0 ;286
0005d8 e9dd2003 LDRD r2,r0,[sp,#0xc]
;;;289 *(pcm + 0) = ClipToShort((int)SAR64(sum1L, (32-CSHIFT)), DEF_NFRACBITS);
0005dc 0d00 LSRS r0,r0,#20
0005de ea403002 ORR r0,r0,r2,LSL #12
0005e2 1180 ASRS r0,r0,#6
0005e4 17c2 ASRS r2,r0,#31
0005e6 ebb23fe0 CMP r2,r0,ASR #15
0005ea bf1c ITT NE
0005ec f64770ff MOVNE r0,#0x7fff
0005f0 4050 EORNE r0,r0,r2
0005f2 8028 STRH r0,[r5,#0]
;;;290 *(pcm + 1) = ClipToShort((int)SAR64(sum1R, (32-CSHIFT)), DEF_NFRACBITS);
0005f4 ea4f521b LSR r2,r11,#20
0005f8 ea423009 ORR r0,r2,r9,LSL #12
0005fc 1180 ASRS r0,r0,#6
0005fe 17c2 ASRS r2,r0,#31
000600 ebb23fe0 CMP r2,r0,ASR #15
000604 bf1c ITT NE
000606 f64770ff MOVNE r0,#0x7fff
00060a 4050 EORNE r0,r0,r2
00060c 8068 STRH r0,[r5,#2]
;;;291 *(pcm + 2*2*i + 0) = ClipToShort((int)SAR64(sum2L, (32-CSHIFT)), DEF_NFRACBITS);
00060e 9814 LDR r0,[sp,#0x50]
000610 9a0e LDR r2,[sp,#0x38]
000612 0d00 LSRS r0,r0,#20
000614 ea403002 ORR r0,r0,r2,LSL #12
000618 1180 ASRS r0,r0,#6
00061a 17c2 ASRS r2,r0,#31
00061c ebb23fe0 CMP r2,r0,ASR #15
000620 bf1c ITT NE
000622 f64770ff MOVNE r0,#0x7fff
000626 4050 EORNE r0,r0,r2
000628 f8250036 STRH r0,[r5,r6,LSL #3]
;;;292 *(pcm + 2*2*i + 1) = ClipToShort((int)SAR64(sum2R, (32-CSHIFT)), DEF_NFRACBITS);
00062c ea4f521e LSR r2,lr,#20
000630 ea423008 ORR r0,r2,r8,LSL #12
000634 1180 ASRS r0,r0,#6
000636 17c2 ASRS r2,r0,#31
000638 ebb23fe0 CMP r2,r0,ASR #15
00063c bf1c ITT NE
00063e f64770ff MOVNE r0,#0x7fff
000642 4050 EORNE r0,r0,r2
000644 eb0502c6 ADD r2,r5,r6,LSL #3
;;;293 pcm += 2;
000648 1d2d ADDS r5,r5,#4
00064a 1e76 SUBS r6,r6,#1
00064c 8050 STRH r0,[r2,#2] ;292
00064e 2e00 CMP r6,#0
000650 f73fae16 BGT |L2.640|

sonycman
В общем, декодирование MP3 занимает на 5-10% больше времени процессора на коде от ИАРа.
Не очень критично, конечно, учитывая, что кроме более качественной генерации кода благодаря RealView Кейлу предложить нечего...
В остальном там мрак какойто sm.gif

ЗЫ: не могу удержаться, вот ещё небольшое сравнение.
Такой совсем простенький цикл, и результат его компиляции при макс. настройках оптимизации:
Код
    if (gb < 6)
    {
        es = 6 - gb;
        for (i = 0; i < 32; i++) buf[i] >>= es;
    }

RealView - O3 Optimize for time, скромненько так, со вкусом развернув только на пару итераций:
CODE

;;;155 if (gb < 6)
000006 9b0d LDR r3,[sp,#0x34]
000008 2200 MOVS r2,#0 ;154
00000a 2b06 CMP r3,#6
00000c da0e BGE |L1.44|
;;;156 {
;;;157 es = 6 - gb;
00000e f1c30206 RSB r2,r3,#6
;;;158 for (i = 0; i < 32; i++) buf[i] >>= es;
000012 1f03 SUBS r3,r0,#4
000014 f04f0c10 MOV r12,#0x10
|L1.24|
000018 685c LDR r4,[r3,#4]
00001a 4114 ASRS r4,r4,r2
00001c 605c STR r4,[r3,#4]
00001e 689c LDR r4,[r3,#8]
000020 4114 ASRS r4,r4,r2
000022 f8434f08 STR r4,[r3,#8]!
000026 f1bc0c01 SUBS r12,r12,#1
00002a d1f5 BNE |L1.24|


и ИАР, высокая оптимизация режим баланса - аж слёзы на глаза наворачиваются crying.gif
CODE


155 if (gb < 6)
\ 00000010 0628 CMP R0,#+6
\ 00000012 27DA BGE.N ??mp3_FDCT32_0
156 {
157 es = 6 - gb;
\ 00000014 C0F10600 RSB R0,R0,#+6
\ 00000018 0090 STR R0,[SP, #+0]
158 for (i = 0; i < 32; i++) buf[i] >>= es;
\ 0000001A 1046 MOV R0,R2
\ 0000001C 0421 MOVS R1,#+4
\ ??mp3_FDCT32_1:
\ 0000001E 0368 LDR R3,[R0, #+0]
\ 00000020 009C LDR R4,[SP, #+0]
\ 00000022 2341 ASRS R3,R3,R4
\ 00000024 0360 STR R3,[R0, #+0]
\ 00000026 4368 LDR R3,[R0, #+4]
\ 00000028 009C LDR R4,[SP, #+0]
\ 0000002A 2341 ASRS R3,R3,R4
\ 0000002C 4360 STR R3,[R0, #+4]
\ 0000002E 8368 LDR R3,[R0, #+8]
\ 00000030 009C LDR R4,[SP, #+0]
\ 00000032 2341 ASRS R3,R3,R4
\ 00000034 8360 STR R3,[R0, #+8]
\ 00000036 C368 LDR R3,[R0, #+12]
\ 00000038 009C LDR R4,[SP, #+0]
\ 0000003A 2341 ASRS R3,R3,R4
\ 0000003C C360 STR R3,[R0, #+12]
\ 0000003E 0369 LDR R3,[R0, #+16]
\ 00000040 009C LDR R4,[SP, #+0]
\ 00000042 2341 ASRS R3,R3,R4
\ 00000044 0361 STR R3,[R0, #+16]
\ 00000046 4369 LDR R3,[R0, #+20]
\ 00000048 009C LDR R4,[SP, #+0]
\ 0000004A 2341 ASRS R3,R3,R4
\ 0000004C 4361 STR R3,[R0, #+20]
\ 0000004E 8369 LDR R3,[R0, #+24]
\ 00000050 009C LDR R4,[SP, #+0]
\ 00000052 2341 ASRS R3,R3,R4
\ 00000054 8361 STR R3,[R0, #+24]
\ 00000056 C369 LDR R3,[R0, #+28]
\ 00000058 009C LDR R4,[SP, #+0]
\ 0000005A 2341 ASRS R3,R3,R4
\ 0000005C C361 STR R3,[R0, #+28]
\ 0000005E 2030 ADDS R0,R0,#+32
\ 00000060 491E SUBS R1,R1,#+1
\ 00000062 DCD1 BNE.N ??mp3_FDCT32_1

с размахом так, развернул половину цикла, но это ладно, а вот зачем было каждый раз перед каждым сдвигом подгружать со стёка константную его величину?

Это просто фэйспалмище какой-то... cranky.gif

Они ещё пишут в релиз ноутс последнего ИАРа про оптимизацию кода для C-M3\4.

Быстрый код под ИАРом? Не, не слышал sm.gif
aaarrr
Цитата(sonycman @ Jan 7 2012, 00:52) *
Не очень критично, конечно, учитывая, что кроме более качественной генерации кода благодаря RealView Кейлу предложить нечего...

По-моему, кодогенератор и библиотеки - это 90% продукта минимум (10% оставим отладчику, так и быть) sm.gif Поэтому всем и рекомендую RVCT.
sonycman
Цитата(aaarrr @ Jan 7 2012, 01:04) *
По-моему, кодогенератор и библиотеки - это 90% продукта минимум (10% оставим отладчику, так и быть) sm.gif Поэтому всем и рекомендую RVCT.

А кроме Кейла, есть ещё свежие продукты на базе RV?
aaarrr
RVDS 4.1, DS-5.
sonycman
Цитата(aaarrr @ Jan 7 2012, 01:21) *
RVDS 4.1, DS-5.

Спасибо, в закромах вроде первый есть, попробую sm.gif
KRS
sonycman,
в закромах есть просто свежий Arm Compiler и от RVCT и более свежий от DS-5
sonycman
Цитата(KRS @ Jan 7 2012, 05:35) *
в закромах есть просто свежий Arm Compiler и от RVCT и более свежий от DS-5

Спасибо, но чисто компилер я могу взять и от Кейла.
Мне надо IDE с дебаггером, так как кейловский у меня глючит.

Ну, как и ожидалось, ни RVDS4.1, ни DS-5 не пошли.
Первый выдаёт какую-то маловразумительную ошибку лаунчера, а у второго не может запуститься Эклипс, жалуется, что не запускается Ява машина.
Я уже переставил яв версий 5, 6 и 7, хз что ему ещё надо.

При этом новый Эклипс для C\C++ работает ОК.
KRS
Цитата(sonycman @ Jan 7 2012, 15:05) *
Мне надо IDE с дебаггером, так как кейловский у меня глючит.

так можно IAR использовать, ELF то EABI, правда не знаю как с отладочной информацией, а вот линкером IAR функции компилированные RVCT я линковал.
отладчик все равно нельзя использовать он дружит только с ARM родными ICE! правда DS-5 может и с GDB сервером.

Цитата(sonycman @ Jan 7 2012, 15:05) *
а у второго не может запуститься Эклипс, жалуется, что не запускается Ява машина.

там свой эклипс и джава своя! (она потом даже в панеле управления видна, у меня доп. пакеты пытались на нее встать)
aaarrr
Странно, 4.1 у меня успешно работает. Причем даже на домашней машине, где до сих пор стоит XP SP1.
sonycman
Цитата(KRS @ Jan 7 2012, 23:35) *
отладчик все равно нельзя использовать он дружит только с ARM родными ICE! правда DS-5 может и с GDB сервером.

Понятно, тогда большого смысла для меня тут нет, имеется только J-Link.

Цитата
там свой эклипс и джава своя! (она потом даже в панеле управления видна, у меня доп. пакеты пытались на нее встать)

Да, внутри есть папка с явой, потыкал по эксешникам, эффекта никакого не получил.
При запуске eclipse.exe из состава DS-5 получаю ошибку Could not create the Java virtual machine.
То есть яву он, по видимому, находит, но запустить не может.

Может, какой-то конфликт с установленным софтом\новой версией явы?
Но что-то не хочется ничего сносить sm.gif

Цитата(aaarrr @ Jan 7 2012, 23:38) *
Странно, 4.1 у меня успешно работает. Причем даже на домашней машине, где до сих пор стоит XP SP1.

А на Win7 x64 не пробовали ставить?

Ошибка вот такая:
Цитата
Error code: LAUNCHER-11

armenv returned with error(s).

Command was:
"C:\Program Files\ARM\Utilities\Installer\2.3\220\win_32-pentium\armenv.exe" -r "C:\Program Files\ARM" -p RVDS Contents 4.1 107 -v platform "win_32-pentium" -v extras_dir "professional\" -v encryption "none" -v regime "rel" -v capability "professional" --exec "C:\Users\Вован\Application Data\ARM\ARM Workbench IDE\4.0\launcher-win_32-pentium.exe"

Note this may be the expected behaviour if the target process returned with error

Пробовал запускать launcher-win_32-pentium.exe напрямую, опять ошибка с ява машиной как и у DS-5 sad.gif

Ладно, спасибо, потом поковыряю ещё, может, что и получится.
aaarrr
На Вована ругается. Создайте пользователя с латинским именем.
sonycman
Цитата(aaarrr @ Jan 8 2012, 00:04) *
На Вована ругается. Создайте пользователя с латинским именем.

Мелькнула такая мысль, куча софта не любит кириллицу, но это вроде седьмой винды это не должно касаться?
Надо попробовать, в любом случае.
sm.gif
aaarrr
Цитата(sonycman @ Jan 8 2012, 00:07) *
Мелькнула такая мысль, куча софта не любит кириллицу, но это вроде седьмой винды это не должно касаться?

Про семерку ничего не скажу, но на XP на эти грабли наступал точно.
KRS
Цитата(sonycman @ Jan 8 2012, 00:00) *
Понятно, тогда большого смысла для меня тут нет, имеется только J-Link.

IMHO тогда точно лучше всего IAR использовать, отладчик там хороший! и поддержка JLINK хорошая.
Да и компилер в целом один из лучших, ну бывают иногда задвиги с оптимизацией, но обычно в следующих версиях лечится.
А критические функции можно и другим компилером компилить, линкуется сейчас все без проблем.

Кстати в новых версиях IAR уже GNU asm макросы есть.

А отладчик в RV4.1 - КМВ который это же монстр просто sm.gif
sonycman
Надо бы запустить USB HS.
Посмотрел пример на базе атмеловской библиотеки - вроде работает, и неплохие скорости даже без включения High Speed режима карты памяти.
Но как-то у них всё монструозно, библиотека какая-то, терпеть всё это не могу, буду писать свой код для MSD, за основу возьму костяк MSD от STM32.

Первое впечатление от атмеловского HS USB контроллера очень хорошее, и расписано всё довольно подробно, и интерфейс довольно удобный.

Интересно реализован доступ к банкам памяти под эндпоинты - в виде 64 килобайтового логического адресного пространства для каждой точки.
Самой двухпортовой памяти для точек, конечно, меньше, около 4 килобайт, получается просто ремап этой памяти на 64 кб регионы.

Но каким именно образом записывать\считывать эту память?
В тексте память эндпоинтов называют как FIFO - значит ли это, что можно устанавливать указатель на любое слово 64 кб региона и при этом будет считываться слово из хвоста FIFO \ записываться слово на вершину FIFO?
Или нужно точно позиционировать указатель на нужный банк внутри региона?
aaarrr
Цитата(sonycman @ Jan 8 2012, 15:22) *
Или нужно точно позиционировать указатель на нужный банк внутри региона?

Судя по Figure 39-4 - нужно. Впрочем, с UPDHS не разбирался, так что это только предположение.
sonycman
Цитата(aaarrr @ Jan 8 2012, 16:31) *
Судя по Figure 39-4 - нужно. Впрочем, с UPDHS не разбирался, так что это только предположение.

Впрочем, при использовании DMA этим вопросом не стоит задаваться - в конфигурации DMA даже нет поля для значения адреса ФИФО, всё автоматом.

А обычные FS модули или модули HS больших процессоров (ARM9) отличаются от оного в SAM3?
Интересно, этот модуль новый или использовался в других "камнях"?
aaarrr
Цитата(sonycman @ Jan 8 2012, 17:18) *
Интересно, этот модуль новый или использовался в других "камнях"?

Скорее всего, он идентичен таковому в SAM9R(L).

upd: нет, не идентичен, но очень похож.
sonycman
Ну что же, запустил USB HS и MSD, основываясь на атмельских библиотечных примерах, идущих с Кейл.
Перепахал и адаптировал под себя код, поражающий своей монструозностью и количеством файлов - из 100500 надо бы, чтобы было всего несколько.

Библиотека, кстати, по крайней мере её часть, касаемая USB и MSD, отличается весьма неплохим качеством и структурированностью, не то, что было в аналогичной ситуации у STM32.

Скорости MSD получились хорошие - на SDHC карту 4GB 4 класса чтение около 14.9 MB/s и запись 11.5 MB/s.
Максимально приблизился к практическому потолку этой карточки sm.gif

Блин, после USB FS это как самолёт истребитель рядом с телегой с деревянными колёсами laughing.gif
И при этом HS трансивер встроенный! Молодцы, Атмел!
aaarrr
Цитата(sonycman @ Jan 17 2012, 14:35) *
Скорости MSD получились хорошие - на SDHC карту 4GB 4 класса чтение около 14.9 MB/s и запись 11.5 MB/s.
Максимально приблизился к практическому потолку этой карточки sm.gif

Достойно, да sm.gif
sonycman
Цитата(aaarrr @ Jan 17 2012, 15:07) *
Достойно, да sm.gif

Не без Вашей помощи! Спасибо a14.gif
Rst7
QUOTE
ЗЫ: не могу удержаться, вот ещё небольшое сравнение.
Такой совсем простенький цикл, и результат его компиляции при макс. настройках оптимизации:


Отвечу тут (дабы у новичков не плодить оффтопа). Накопали Вы в интернетах обычный для интернетов говнокод. Миллионы локальных переменных в стеке. Если бы это было написано вменяемо (c оглядкой ограниченное количество регистровых переменных), то и было бы все красиво:

CODE
void foo(int gb, int *buf)
{
  int es;
  int i;
  if (gb < 6)
    {
        es = 6 - gb;
        for (i = 0; i < 32; i++) buf[i] >>= es;
    }
}


CODE

SECTION `.text`:CODE:NOROOT(1)
THUMB
// 25 void foo(int gb, int *buf)
// 26 {
// 27 int es;
// 28 int i;
// 29 if (gb < 6)
foo:
CMP R0,#+6
BGE.N ??foo_0
// 30 {
// 31 es = 6 - gb;
RSB R0,R0,#+6
// 32 for (i = 0; i < 32; i++) buf[i] >>= es;
MOVS R2,#+4
??foo_1:
LDR R3,[R1, #+0]
ASRS R3,R3,R0
STR R3,[R1, #+0]
LDR R3,[R1, #+4]
ASRS R3,R3,R0
STR R3,[R1, #+4]
LDR R3,[R1, #+8]
ASRS R3,R3,R0
STR R3,[R1, #+8]
LDR R3,[R1, #+12]
ASRS R3,R3,R0
STR R3,[R1, #+12]
LDR R3,[R1, #+16]
ASRS R3,R3,R0
STR R3,[R1, #+16]
LDR R3,[R1, #+20]
ASRS R3,R3,R0
STR R3,[R1, #+20]
LDR R3,[R1, #+24]
ASRS R3,R3,R0
STR R3,[R1, #+24]
LDR R3,[R1, #+28]
ASRS R3,R3,R0
STR R3,[R1, #+28]
ADDS R1,R1,#+32
SUBS R2,R2,#+1
BNE.N ??foo_1
// 33 }
// 34 }
??foo_0:
BX LR ;; return
sonycman
Цитата(Rst7 @ Jan 20 2012, 14:33) *
Отвечу тут (дабы у новичков не плодить оффтопа). Накопали Вы в интернетах обычный для интернетов говнокод. Миллионы локальных переменных в стеке. Если бы это было написано вменяемо (c оглядкой ограниченное количество регистровых переменных), то и было бы все красиво:

Я понял, что такой код получился в контексте функции, у которой много локальных переменных.
Однако внутри цикла величина сдвига является константой, и непонятно, почему компилер не понял этого простого факта и решил подгружать эту величину каждый раз, в один и тот же регистр, который никак после этого не модифицируется...

Явный прокол, которого нет у RV.
Rst7
QUOTE
Явный прокол, которого нет у RV.


Там зато есть другие. Компиляторы, которые пытаются решить все за человека часто несут фигню.

Вообще для любого компилятора есть глубокий смысл делать следующее.

Вот пример некрасивого (но обычного) кода:
CODE
int es;

void foo(int gb, int *buf)
{
  int i;
  if (gb < 6)
    {
        es = 6 - gb;
        for (i = 0; i < 32; i++) buf[i] >>= es;
    }
}


Кодегенерация в IAR
CODE

SECTION `.bss`:DATA:REORDER:NOROOT(2)
// 26 int es;
es:
DS8 4
// 27

SECTION `.text`:CODE:NOROOT(1)
THUMB
// 28 void foo(int gb, int *buf)
// 29 {
// 30 int i;
// 31 if (gb < 6)
foo:
CMP R0,#+6
BGE.N ??foo_0
// 32 {
// 33 es = 6 - gb;
LDR.N R2,??DataTable1
RSB R0,R0,#+6
STR R0,[R2, #+0]
// 34 for (i = 0; i < 32; i++) buf[i] >>= es;
MOVS R0,#+32
??foo_1:
LDR R3,[R1, #+0]
LDR R12,[R2, #+0]
ASR R3,R3,R12
STR R3,[R1], #+4
SUBS R0,R0,#+1
BNE.N ??foo_1
// 35 }
// 36 }
??foo_0:
BX LR ;; return
// 37


Loop unrolling отключил, чтобы не загромождать листинг. Как видите, постоянно читается переменная из ОЗУ. Если бы переменная es была в стеке, было бы то же самое - это Вы сами видели.

Правильный код выглядит так:
CODE
void foo_goot(int gb, int *buf)
{
  int i;
  if (gb < 6)
    {
        int t =es = 6 - gb;
        for (i = 0; i < 32; i++) buf[i] >>= t;
    }
}

CODE

// 38 void foo_goot(int gb, int *buf)
// 39 {
// 40 int i;
// 41 if (gb < 6)
foo_goot:
CMP R0,#+6
BGE.N ??foo_goot_0
// 42 {
// 43 int t =es = 6 - gb;
RSB R0,R0,#+6
LDR.N R2,??DataTable1
STR R0,[R2, #+0]
// 44 for (i = 0; i < 32; i++) buf[i] >>= t;
MOVS R2,#+32
??foo_goot_1:
LDR R3,[R1, #+0]
ASRS R3,R3,R0
STR R3,[R1], #+4
SUBS R2,R2,#+1
BNE.N ??foo_goot_1
// 45 }
// 46 }
??foo_goot_0:
BX LR ;; return


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

Очень зря забили на ключевое слово register, я считаю.

Мой опыт говорит вот что. TCP-стек, который я делал, представляет из себя единственную функцию (это обработчик прерываний). Так вот только IAR нормально раскладывает все по регистрам (все локальные переменные туда помещаются) и стек не используется. Другие компиляторы не справляются - начинается откладывание локальных переменных в стек и, естественно, полный ахтунг в коде.
sonycman
Цитата(Rst7 @ Jan 20 2012, 15:16) *
Вот пример некрасивого (но обычного) кода...

Но почему переменная - количество сдвига - вычитывается из памяти каждый цикл?
Она ведь не volatile и не изменяется за время цикла, какой в этом глубокий смысл?
kostyan
Народ, кто писал в этой теме по поводу "батарейного отсека" для SAM3U отзовитесь плиз!

Напоролись на траблу, что если плата на основе сабжа лежит с неделю на столе без питания, после подачи последнего впадает в ступор! Решили отказаться от литиевой батарейки на ноге VDDBU, а запитать её собственно с VDDIO. Тут другая проблема: теперь плата ресетится долго, порядка 2х секунд, как будто при каждом подключении питания происходит внешний ресет по NRSTB. При наличии же литиевой батарейки плата ресетился по подаче питания очень быстро.

Это как то можно забороть?

В мануале написано:

"VDDBU must be supplied before or at the same time than VDDIO
and VDDCORE". Если запитывать VDDBU раньше чем остальные ноги требующие питаня, то получится "быстрый" ресет? Или "медленный старт" - это фича камня, и жизнь прожита зря?
aaarrr
Сталкивался. Батарейный блок действительно склонен к зависанию. Медленный старт - увы, фича. В моем случае она просто оказалась не критичной.
Какая ревизия кристалла у Вас?

Цитата(kostyan @ Jan 31 2012, 19:42) *
Если запитывать VDDBU раньше чем остальные ноги требующие питаня, то получится "быстрый" ресет?

Не получится: сбросом как раз заведует блок, питающийся от VDDBU. А сам по себе он стартует медленно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.