Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Загадочное поведение SAM7S64 & IAR 4.40a
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sgrig
Имеется проект с несколькими прерываниями: UARTы, ADC, PIO, таймеры и TWI.
Поскольку TWI у SAMa не имеет PDC, а на на нем висят графический индикатор, FRAM и RTC, то есть обмен достаточно интенсивный, я сделал "подкачку байтов" в прерывании. Прерывание короткое, с максимальным приоритетом, так как TWI у SAMa не любит пауз на шине.
Вызов прерываний сделан с использованием Сstartup.s79.

Теперь самое интересное:
- компилю проект с уровнем оптимизации Medium (здесь и далее по тексту: code или size - один хрен). Устройство устойчиво работает сутками, то есть все пучком.
- повышаю уровень оптимизации до High. Короткий всплеск активности на шине TWI и все погибает. Даже индикатор мертв, программа циклит в совершенно левом месте. Думаю, хрен с ним, у IAR-а всегда были такие проблемы при макс. оптимизации. Но:
- снижаю уровень оптимизации до Low. Индикатор работает, а при обмене с FRAM и RTC идут периодические сбои. Но в целом изделие работает.
- отключаю оптимизацию, поведение как в предыдущем случае + через некотое время (час-два) TWI переходит в режим самоудовлетворения - по шине хреначит беспорядочная передача, не прекращающаяся даже при остановке процессора.

Вопрос: как к этому относиться и, главное, кто виноват? Сижу не первый день, свои варианты закончились.
Может кто-нибудь выскажет соображения? Буду рад любой идее.
zltigo
Цитата(sgrig @ Jul 20 2006, 13:34) *
Вопрос: как к этому относиться и, главное, кто виноват?

1.Относится к этому следует плохо.
2.Виноват в этом обычно программист неясно выразивший свою мысль компилятору, который тоже, увы,
не совершенен, особенно в предугадании последствий.
3.Локализуйте поблемный кусок включая/отключая оптимизацию на части проекта и локализовав, думайте над более однозначным написанием куска программы.
4. Ну и в качестве надежды на чудо - используйте свежий компилятор:
IAR ARM ANSI C/C++ Compiler V4.40A-P060613/W32
__________________________________^^^^^^^^^
sgrig
1 и 2 - полностью согласен, хотя не могу понять вариант с правильным "угадыванием" именно в среднем положении.
А 3-им путем я уже иду, но проект большой, файлов много, а сбои редки. Экстенсивный путь, боюсь, до отпуска не управлюсь.
beer_warrior
1.Вы все возможное пообъявляли как volatile?
У меня были случаи когда код выделывал кренделя, даже если переменная в прерывании не менялась. Просто инитилась в самом начале.
2.Написать обработчик аварийных ситуаций, в случае проблем, вылететать и инитить TWI заново.

PS Откуда они этот макроселл взяли? Я пока не столкнулся, думал что там наследник АВРовского, еще и продвинутый(как USART с SPI). А как посмотрел, за голову схватился.
zltigo
Цитата(sgrig @ Jul 20 2006, 13:52) *
хотя не могу понять вариант с правильным "угадыванием" именно в среднем положении.

Просто проблема не одна а несколько, хоть и приводят к универсальному результату варианту "не работает". При отключеной оптимизации, если не используется какая-либо система позволяющая делить
недостающие ресурсы, у Вас просто все "захлебывается" и какой-то кусок начинает жить исключительно
своими проблемами.



Цитата(beer_warrior @ Jul 20 2006, 14:04) *
1.Вы все возможное пообъявляли как volatile?

Фу, какой моветон :-( Зачем-же "все возможное" - нужно только "нужное" :-)
beer_warrior
Цитата
Фу, какой моветон :-( Зачем-же "все возможное" - нужно только "нужное" :-)

А вы точно знаете, что точно "нужное", а что "ненужное"?
Тай отож smile.gif
Тем более собака порылась в оптимизаторе smile.gif
zltigo
Цитата(beer_warrior @ Jul 20 2006, 14:35) *
А вы точно знаете, что точно "нужное", а что "ненужное"?

Ну так я :-) а если серьезно, то нужно думать, после чего, естественно, буду и знать нужное.
Если думать о нюансах взаимопонимания с компилятором прямо в процессе написания, оно как-то
легко и непринужденно получается.
sgrig
Цитата(zltigo @ Jul 20 2006, 18:09) *
Просто проблема не одна а несколько, хоть и приводят к универсальному результату варианту "не работает". При отключеной оптимизации, если не используется какая-либо система позволяющая делить недостающие ресурсы, у Вас просто все "захлебывается" и какой-то кусок начинает жить исключительно своими проблемами.

Да, возможно Вы правы. Скорее всего, какая-нибудь глупая ошибка, причем, совсем не там, где ищешь.


Цитата(beer_warrior @ Jul 20 2006, 14:04) *
1.Вы все возможное пообъявляли как volatile?

Нет, я так объявляю только те переменные, которые модифицируются в исключениях (прерываниях) и используются в основной программе или же в других исключениях (прерываниях).
IgorKossak
Цитата(zltigo @ Jul 20 2006, 13:42) *
4. Ну и в качестве надежды на чудо - используйте свежий компилятор:
IAR ARM ANSI C/C++ Compiler V4.40A-P060613/W32
__________________________________^^^^^^^^^

Это именно компилятор или очередной патч для full версии?
На сайле IAR пишется, что он не становится на eval.
zltigo
Цитата(IgorKossak @ Jul 21 2006, 12:46) *
Это именно компилятор или очередной патч для full версии?
На сайле IAR пишется, что он не становится на eval.

Патч в виде совершенно автономного компилятора :-). Работает при наличии лицензии на full компилятор ЛЮБОЙ версии. Ну очень любезно со стороны IAR :-)
d__
Гы-гы-гы! Еще одна жертва ИАРа...
zltigo
Цитата(d__ @ Jul 22 2006, 12:52) *
Гы-гы-гы!

Всегда приятно смотреть на смеющегося человека, даже если это "смех без причины..."
ig_z
Цитата(zltigo @ Jul 21 2006, 16:26) *
Патч в виде совершенно автономного компилятора :-). Работает при наличии лицензии на full компилятор ЛЮБОЙ версии. Ну очень любезно со стороны IAR :-)


Вы можете сбросить на фтп вашу лицензию? У себя нашел только
EWARM Version: 2.1_WIN standalone license (dongled) (no:1000-005-880-9779)
но с ней не работает, т.к. это dongled лицензия. А генераторы делают лицензии для евалюшн версий
zltigo
Цитата(ig_z @ Jul 24 2006, 16:18) *
А генераторы делают лицензии для евалюшн версий

Я пользую:
2.1_WIN\0EWARM\0\0....

Готовый выложил в первоначальную ветку:
http://electronix.ru/forum/index.php?showt...mp;#entry137296
d__
Да бросьте этот ИАР аб землю и плюньте на него слюной! Поставьте нормальный ARM Ltd. компилер и он никогда не ударит вам ножом в спину!
zltigo
Цитата(d__ @ Jul 25 2006, 12:00) *
Да бросьте этот ИАР аб землю и плюньте на него слюной!

Пластинка становится несколько заезженной. Вам не показалось?
d__
Про заезженость пластинки вы расскажите кому либо другому, кто не переходил с ИАРа в середине проекта на АРМ Лтд. из-за неимоверной глючности первого и невозможности включить хоть малейшую оптимизацию...
zltigo
Цитата(d__ @ Jul 26 2006, 10:03) *
из-за неимоверной глючности первого и невозможности включить хоть малейшую оптимизацию...

Я с Вами лично не знаком и пожалуйста не принимайте это близко к сердцу. Но обычно такие проблемы возникают с ЛЮБЫМ компилятором в 99% только в случае, если программист не может ясно выразить свою мысль. В таком случае поведение компиляторов начинает отличаться, и отнюдь не факт,
что возлюбленный вами компилятор так-же удачно догадается о Ваших намерениях в другом проекте.
Ваши метания на другой компилятор только подтверждают в моих глазах тот факт, что понимание того, что Вы пишите, Вами пока невелико :-(. Огорчает то, что вместо анализа сложившийся ситуации во всем был обвинен компилятор и эти "обвинения" сейчас с упорством достойным лучшего применения широко разбрасываются Вами на просторах форума.
Ошибки встречаются в любом компиляторе.
Имея за плечами два десятка лет общения с разнообразными "C" компиляторами, я при активнейшем использовании в течении последних 9 месяцев IAR компилятора в том числе и при портировании на ARM платформу значительного числа своих предыдущих наработок с проблемами не встретился. Наступил только на одну явную ошибку компилятора, которая была локализована (вместо поиска другого компилятора) за, примерно, 20 минут. Причем в следующей версии компилятора эта ошибка (согласно честно ведущегося перечня исправленных ошибок) была устранена. Оптимизация всегда используется максимальная или по производительности или по размеру (для некоторых кусков кода). К качеству полученного кода у меня "претензии" минимальные:
- мог-бы шире пользоватся условным выполнением команд вместо JUMP;
- есть тяготение даже в ARM mode к использованию непосредственных значений в поле команды
в диапазоне характерном для Thumb mode.

Глобальная оптимизация вполне достойна, как минимум, если попытаться улучшить результат руками,
потеть придется явно не пропорционально достигнутому результату.

P.S.
IDE от IAR (впочем, как и любаяя другая) меня не интересует в принципе и ее я обсуждать не собираюсь.
ig_z
Цитата(d__ @ Jul 26 2006, 10:03) *
Про заезженость пластинки вы расскажите кому либо другому, кто не переходил с ИАРа в середине проекта на АРМ Лтд. из-за неимоверной глючности первого и невозможности включить хоть малейшую оптимизацию...


Имхо вы слишком категоричны в высказываниях. "глючности и невозможность" - звучит как то слишком фантастично.

За последние несколько лет активной работы с иарарм и иар430 в моем репозитории было всего 5 багов. В последних версиях осталось всего два. Оба связаны с шаблонами, которые практически никем не применяются. Да и то, одну ошибку и ошибкой назвать трудно - просто разночтения стандарта у ИАР и Мелкософта. Это приводит к неудобству ведения общих исходников и только.

Другое дело, что с ИАРом тяжело контачить по поводу багов, по крайней мере все мои обращения остались без ответа. Возможно, потому, что я у них ничего не покупал. Лицензионные кустомеры говорят, что суппорт работае вполне оперативно.
d__
А почему бы вам не рассказать о том как IAR ARM страдал падучей болезнью при входе и выходе из режима отладки, которую поправили только в версии 4.3. А его знаменитое неубирающееся окошко "не могу прочитать R0-R14" от которого спасает только ЦТРЛ_АЛТ_ДЕЛ? Оно до сих пор еще не поправлено! При чем оно умудряется выскакивать даже при использовании ДЖЕЙЛИНКА! Конечно если писать программки типа "мама мыла раму" или лед блинк то ему равных нет, а вот предьявите пожалуйста хоть одну серьезную программу ну хотя-бы кил на 200-300 сделаную на ИАР АРМЕ! Тогда и поговорим...
vet
"кил" чего, простите? исходников? так это совсем немного.

Использую EWARM 4.20 (+J-Link) для работы с SAM7S128, доволен вполне; пресловутые болезни обходят стороной.
_Sam_
Цитата
Поскольку TWI у SAMa не имеет PDC, а на на нем висят графический индикатор, FRAM и RTC, то есть обмен достаточно интенсивный, я сделал "подкачку байтов" в прерывании.

Прерывание от TWI или от чего-то другого? Сколько у вас всего прерываний задействовано?
Может попробовать сделать тестовую программку с подкачкой без использования прерываний?
Если будет тот же эффект, значит прерывание тут не причём.
zltigo
Цитата(d__ @ Jul 27 2006, 10:51) *
А почему бы вам не рассказать о том как

А потому, что я уже РАНЕЕ написал:
Цитата
P.S.
IDE от IAR (впочем, как и любаяя другая) меня не интересует в принципе и ее я обсуждать не собираюсь.

Растолковываю - меня интересуют только компиляторы. "родными" IDE не пользуюсь и пользоваться не буду ввиду cуществования более приспособленного для профессиональной работы инструментария. Мое мнение об IDE "компиляторов" вообще и об IDE IARа в часности Вы можете найти на этом форуме.
Внутрисхемным отладчиком пользуюсь крайне редко и переживу почти любой.
Только как соотносится IDE IAR с качеством РАНЕЕ критикуемой Вами генерации компилятором кода я
не понял.

Цитата
предьявите пожалуйста хоть одну серьезную программу ну хотя-бы кил на 200-300 сделаную на ИАР АРМЕ! Тогда и поговорим...

Насколько я понимаю, это вариант бессмерного аргумента Паниковского: "А ты кто такой?".
Потом что будет? "Поезжайте в Киев и спросите, кем до революции был Паниковский, нет вы поезжайте и спросите!"?

Ну а на разговор я не нарывался, но абсолютно ламерский треп, надеюсь, ответил.
d__
Очень приятно иметь дело с человеком утруждающим себя подробным растолковыванием всяческих мелочей этим бестолковым ламерам. Так все-таки покажите пожалуйста реально работающую программу (особенно в реальном масштабе времени) обьемом 200 и более килобайт бинарного ВЫХОДНОГО кода компилятора ИАР.
zltigo
Цитата(d__ @ Jul 27 2006, 15:47) *
Так все-таки покажите пожалуйста реально работающую программу (особенно в реальном масштабе времени) обьемом 200 и более килобайт бинарного ВЫХОДНОГО кода компилятора ИАР.

А какая принципиальная разница 200K, или 2 по 100K, или 999 по 99K.
Если Вам любопытно, то суммарный объем наработанный за 9 месяцев по 6 девайсам много превосходит 200K СОБСТВЕННОРУЧНО написанного "реалтаймового" кода.

1. Если Вы полагаете, что хоть какой-то компилятор способен заниматься хоть какой-то разумной оптимизацией в пределах ОДНИМ куском написанного кода размером 200K, то это просто детская наивность.
2. Я находясь в здравом не писал, не пишу и не буду писать ничего ОДНИМ куском, что будет выливаться в ОБЪЕКТНЫЙ код более чем несколько десятков килобайт.
3. Или у Вас претензии к линкеру от IAR? Вроде нет - катятся бочки на оптимизацию...
4. Если о моей способности писать программы превышающий магический размер 200K embedded кода, то отвечаю - способен и писал под x86 платформу.

Надеюсь, я доходчиво и без "аргументов" типа:
Цитата
Да бросьте ..... аб землю и плюньте на него слюной!

объяснил, почему представление или не представление "программы" размером 200K просто ни о чем ни свидетельствует? И почему я ранее написал, что не могу могу воспринять сие "требование" иначе чем
Цитата
вариант бессмерного аргумента Паниковского: "А ты кто такой?".
sgrig
Огромное спасибо за проявленное внимание, но компилятор абсолютно не виноват.
Была абсолютно ламерская ошибка человека (то бишь меня), 20 лет работавшего с 8-миразрядниками и впервые воспользовавшегося 32-х битником. Господин zltigo был абсолютно прав.
GetSmart
У меня был недавно глюк с IAR 4.20. Он гад константу, описанную через #define, в проге почему-то увеличивал на 16. Это я в отладчике выяснил, взглянув на асм-код. Приходилось в нескольких местах писать "константа-16".
Странный, да, глюк?
zltigo
Цитата(GetSmart @ Jul 27 2006, 22:08) *
У меня был недавно глюк с IAR 4.20. Он гад константу, описанную через #define, в проге почему-то увеличивал на 16.

Ну раз недавно, значит не забыт :-) давайте сюда - посмотрим....
Цитата
Странный, да, глюк?

Пока неясно.
Цитата
Приходилось в нескольких местах писать "константа-16".

А вот это точно странное и совершенно ошибочное решение с Вашей стороны.
Подгонка под ответ нахудшее из всех возможных решений.
SpiritDance
Да и число 16 какое-то... наводящее на мысли. smile.gif Константа вычисляемая да?
GetSmart
Цитата(SpiritDance)
Да и число 16 какое-то... наводящее на мысли. Константа вычисляемая да?

Да, да! Я тоже так подумкал. Константа - простое число.

Подождите немножко, щас всё несущественное вырежу (типа коммерческая тайна), а чё останется - запостю.
GetSmart
Зацените вырезку из отладчика:
Код
0x00002C88 E3A01001  MOV          R1, #0x1
0x00002C8C E1A00006  MOV          R0, R6
0x00002C90 EBFFFFD3  BL           proc2                 ; 0x2BE4
0x00002C94 EA00003D  B            0x002D90
    else if ((PutBufVar >= NET_VAR_DOUT1) &&
             (PutBufVar < NET_VAR_DOUT1 + DIG_OUTPUTS))
0x00002C98 E3500048  CMP          R0, #0x48
0x00002C9C BA00000D  BLT          0x002CD8
0x00002CA0 E3500054  CMP          R0, #0x54
0x00002CA4 AA00000B  BGE          0x002CD8
    { if (varsize != 4)                     // ïàðàìåòð float - âðåìÿ (ñåê)
0x00002CA8 E3560004  CMP          R6, #0x4
0x00002CAC 1AFFFFE4  BNE          0x002C44
      varsize = PutBufVar - NET_VAR_DOUT1;
0x00002CB0 E2406038  SUB          R6, R0, #0x38
      proc(varsize);
0x00002CB4 E1A00006  MOV          R0, R6
0x00002CB8 EBFFFFC6  BL           proc            ; 0x2BD8

Касательно константы NET_VAR_DOUT1, которая реально описана как:
#define NET_VAR_DOUT1 64+8
__________________________________

Ой, бл@@!
Тока щас понял в чём косяк. Таки мой косяк >:(
Надо было этот сраный дефайн в скобки заключить.
GetSmart
Я как бы извиняюсь, что воду тут намутил. Зря.
aaarrr
Цитата(GetSmart @ Jul 28 2006, 02:01) *
Я как бы извиняюсь, что воду тут намутил. Зря.

А я только собрался про скобки написать smile.gif

Драку я, к сожалению, пропустил, но скажу пару слов о столь любимом мной и господином d__ компиляторе от ARM Ltd. Точнее, не о компиляторе даже, а о линкере. Так вот, этот линкер имеет прелестную привычку глухо виснуть при ошибках, особенно в сложных скриптах с ROPI/RWPI. Не мало он крови мне в свое время испортил.

Я к тому, что глюки есть у всех, а не только у IAR'а, но это еще не повод бросать что-либо об стенку.
SpiritDance
Хм у меня есть уже определенная методика обнаружения своих тупых ошибок - объяснить оппоненту, пусть даже воображаемому, (очень желательно вслух или на бумаге хотябы) то как работает этот кусок программы. Часто помогает.smile.gif

А еще может кто-нибудь все-таки объяснит возможно ли в реалвью исполнять код из RAM. Даже в gcc это есть, сегмент fast кажется.
GetSmart
Цитата(SpiritDance)
А еще может кто-нибудь все-таки объяснит возможно ли в реалвью исполнять код из RAM. Даже в gcc это есть, сегмент fast кажется.

Конечно возможно. Я такое делал в IAR. перед процедурой пишется __ramfunc. Мне надо было обрабатывать прерывания прямо во время записи во флэш LPC213x. Только в раме они и могут обрабатываться.
SpiritDance
Я имел ввиду RealVeiw от ARM, сколько не смотрел в их гайды так ничего и не нашел относительно преноса кода в память.
В мануале указано что прагмами можно размещать код по секциям
• code
• rodata
• rwdata
• zidata.
В rodata и rwdata в примерах помещаются именно данные.
aaarrr
Цитата
Я имел ввиду RealVeiw от ARM, сколько не смотрел в их гайды так ничего и не нашел относительно преноса кода в память.


Почитайте мануал на линкер, там должна быть глава "Using Scatter-loading description files".
Вот пример скрипта для AT91SAM7S64 без Remap'а:

Код
FLASH 0x00000000 0x00010000
{
    FLASH 0x00000000 0x00010000
    {
        start.o (startup, +First)
        * (+RO)
    }
    RAM 0x00200000 0x00004000
    {
        * (+RW, +ZI)
        * (fastcode)
    }
}


Если нужно поместить функцию в RAM, пишем:

Код
#pragma arm section code = "fastcode"

void my_func(void)
{
}

#pragma arm section code
SpiritDance
Да чтото до ллинкера я не дошел так глубоко, а надо было. Там и про фромельф написано.
Спасибо aaarrr сам я бы до этого долго доперал.
IgorKossak
Цитата(zltigo @ Jul 24 2006, 18:51) *
Цитата(ig_z @ Jul 24 2006, 16:18) *

А генераторы делают лицензии для евалюшн версий

Я пользую:
2.1_WIN\0EWARM\0\0....

Готовый выложил в первоначальную ветку:
http://electronix.ru/forum/index.php?showt...mp;#entry137296

Да нет там ничего вложенного, только намерение выложить.
zltigo
Цитата(IgorKossak @ Aug 7 2006, 17:00) *
Да нет там ничего вложенного, только намерение выложить.

Было выложено. Потом удалено по настоянию модератора :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.