Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хочу попробовать ARM, подскажите, что для этого нужно?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2, 3, 4, 5, 6
Сергей Борщ
Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
И что тут неверного? Сказали что переменная может изменятся, и компилятор не должен проводить лишних телодвижений при оптимизации?
Примерно так. В конкретно этом случае - если ему сказали что переменная volatile и ее надо сто раз увелисчить на 1, то он обязан именно 100 раз ее увеличить а не один раз прибавить 100. Хотя с точки зрения математики оба действия эквивалентны.
Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Цитата
Это значит что ваша программа была написана с ошибками.

Вы не понимаете сути, поставленного вопроса, или не хотите понимать. Как программа может быть написано неправильно, если я заранее сказал, что задача написана ПРАВИЛЬНО!
Я уже написал выше - если задача написана правильно, она работает при любом уровне оптимизации. Если в зависимости от уровня оптимизации она или работает или нет - значит она написана неправильно.
Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Давайте скажем, что программа – работает (можно добавить ещё - по алгоритму). Т.е независимо от того, как программа выглядит на С, после компиляции программа выдаёт все заложенные в неё характеристики, это и время и размер и алгоритмы.
Это совсем не значит, что она не содержит ошибок.
Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Вопрос состоит в том, каких фокусов можно ожидать от компилятора при оптимизации и как с ними бороться.
В правильно написанной программе - никаких.
Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Одного при оптимизациях O-0…O-2 ничего не выкидывается, а при O-3 time уже всё?

Код
int a;
int b;
a = 1;
b = 2;
a = a+b;
b = b+a;
if (a > 5)
{
   кусок кода
}
При O-0 компилятор сгенерирует вам нужные команды для каждого из выражений. Чтобы вы могли пройти по шагам по каждому из этих выражений в дебаггере. А при более высоком он сам сосчитает, что в if() a = 5 и это условие не будет истинным, значит {кусок кода} никогда не будет выполнен и его можно смело выбросить. Теперь понятно?

Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Там правильно, а здесь уже неправильно? Ошибки бывают двух видов. Синтаксические, и алгоритмические. Первые решаются на этапе компиляции, вторые на этапе отладки. Пройти этот путь и всё. Чего вам не хватает?
Ваша ошибка относится к алгоритмической. Только вы не учитываете, что уровень оптимизации является так же входным данным для вашего алгоритма как и содержимое переменных. И проверка показывает, что на некоторых наборах входных данных (O-3) ваш алгоритм не работает.

Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Цитата
И такой отказ может произойти, даже если вы добавите одну лишнюю инструкцию в программу

Извиняюсь за дерзость, но это, мягко говоря, неправдо!
Разница в том, что я для своих утверждений имею достаочно оснований - сам по неопытности попадал в такие ситуации. И их могут подтвердить многие опытные участники конференции. А ваше утверждение голословно.

Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Я НЕ ЗАЩИЩАЮ МОИ ТВОРЕНИЯ!!! Я ХОЧУ СКАЗАТЬ ЧТО НЕ СТАВТИ ВАШИ ТВОРЕНИЯ ВЫШЕ ВСЕХ ОСТАЛЬНЫХ ТОЛЬКО ПОТОМУ ЧТО ОНИ ВАШИ! Выкладывайте ваши решения и не поливайте помоями другие, допускается указание на более лучшее решения по вашему мнению. А что лучше решит каждый для себя САМ!!!
Замечательно. Вам указали лучшее решение, вам показали где у вас ошибка и даже несколько раз разжевали почему это именно ошибка. В ответ получаем
Цитата
Я абсолютно уверен в своих программах
Ну продолжайте верить.

Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Мне лично больше нравится, и следовательно быстрее работаю, с bin. А ваши (x<<1) ненравятся. Кто же кроме меня покажет и другой стиль если я один такой, а вы все "правильно" пишете в одном стиле.
В этом примере упор был на то, что вместо безликих нулей и единиц используются символьные имена битов. Что сильно упрощает и чтение и модификацию программы.

Цитата(Alex_inventor @ Jan 29 2007, 14:28) *
Если data sheet вас отвлекает, ну тогда я незнаю...
прочитайте еще раз тот абзац внимательно.

P.S. и постарайтесь просматривать свои сообщения на предмет орфографических ошибок - глаза режет.
SpiritDance
Шмешно.
Сергей Борщ
Цитата(sonycman @ Jan 29 2007, 13:44) *
Цитата(Сергей Борщ @ Jan 29 2007, 12:54) *

UART->IER = (1 << UART_RDAIE) | (0 << UART_THREIE);

Согласен. Такие выражения можно сделать компактнее, если пропустить подобное: 0 << UART_PS, особенно для неиспользуемых фич.
выкинуть всегда можно. Но если вдруг понадобится чуток подправить функциональность, то 0 на 1 заменить проще, чем дописывать.
Alex_inventor
2Andy Great
Да что вы прицепились, с этим GNU? Не работаю я с ним, и работать НЕ СОБИРАЮСЬ! И проблемы, возникшие с ним, решать не собирался. Просто подчеркнул что есть. Если даёте ответы, то уточняйте: я так понял что компилятор и проекты должны быть без пробелов.
Цитата
Такие как Вы, не разобравшись в предмете, портят потом впечатления другим, которые бы потом проскочили эти грабли незаметно.

Ни чего я не порчу, я поднял вопрос, который был решён. И если не поднял бы, то кто этих нюансов не знал, просто так не проскочили.
Когда в начале топика задавались вопросы типа как с UART работать, все молчали. sad.gif Были лишь изредкие фразы типа “вы отлично варитесь в собственном саку, ну и варитесь там!”. Чтож… Я не спорю, даже скажу согласен с этим. Но когда “поварившись” результатом чего явился РАБОТОСПОСОБНЫЙ проект и был выложен, что бы им пользовались такие как, я был неделю назад (если мне дали тогда этот проект, то я бы поблагодарил). Целью проекта было постепенное наращивание, освоение новой периферии (выкладывание промежуточных результатов) и КОНСТРУКТИВНОЕ обсуждение отдельных алгоритмов, не поливая помоями чужие варианты! Если бы кто, например, сказал, вот тут (x=1; x<100;x++) пауза будет не точной, потому что используется такая инструкция проца (которая в режиме таком то выполняется за два такта), другой бы сказал что он применил другую конструкция, которая меньше места занимает, а третий бы предложил более большую конструкцию, но с более богатыми возможностями.
Но нет!!! Как этот “презренный” посмел обратиться к нам, небожителям! И надругаться над нашими священными постулатами. Он даже ПОСМЕЛ! angry.gif , стыдно сказать, bin использовать! Так умри же за это! maniac.gif
Когда надо было, так нет никого, а сейчас налетели как коршуны, и каждый пытается клюнуть побольнее. twak.gif При чём вместо самообучение, я получил публичную порку, и вместо предложений и обсуждений по коду я должен оправдываться за каждое сказанное слово. Оправдаться то я могу, но надоело уже sad.gif .
Всё больше вы меня не услышите! Если кого обидел, не держите зла, если кому помог, то и помогите вы в будущем, таким как я. Пока.
И он гордо удалился, громко хлопнув за собой дверью, и лишь шаги постепенно стихали где то там в дали пока полностью не стихли, и тишина медленно заполнила собой опустевшее пространство… biggrin.gif


Просьба к АДМИНИСТРАТОРУ. Удалите пожалуйта мой проект, а то сам этого я что то сделать не могу. Не хочу что бы люди "розачаровывались".
sonycman
2Alex_inventor
Почему ты так болезненно воспринимаешь критику?
Цитата
При чём вместо самообучение, я получил публичную порку, и вместо предложений и обсуждений по коду я должен оправдываться за каждое сказанное слово.

Какая "порка"?
Ну указали, что тут и там неправильно. Наверное, это так и есть?

На самом деле ты ведь получил именно обсуждение и последовавшие предложения по твоему коду.
Но, почему-то, воспринимаешь это как порку smile.gif
Явное нежелание прислушиваться к советам других людей...
zltigo
Цитата(Alex_inventor @ Jan 29 2007, 16:20) *
Просьба к АДМИНИСТРАТОРУ. Удалите пожалуйта мой проект, а то сам этого я что то сделать не могу. Не хочу что бы люди "розачаровывались".

Если проект будет удален, то его сюда выложу я, дабы у последующих читателей не возникала мысль о якобы имеющем место быть избиении невинных младенцев с "красными дипломами" и "100 проектами за плечами" .
Alex_inventor
Обещал не отвечать, но тебе отвечу (похоже единственному, кто себя не считает небожителем):
Ты писал что, мне указали на явные ошибки программы. Какие ошибки? Что программа работает неверно? Я люблю использовать bin, НИКОГО НЕ ЗАСТАВЛЯЮ ДЕЛАТЬ ТОЖЕ САМОЕ, но когда “небожители” слышат что я это делаю, они ни все хором тычут меня в книги, как нашкодившую собаку. Обсуждение оптимизации напоминает: “Я тебе про Ерему, ты мне про Фому.” Что в результате? Я не намного больше узнал про UART чем, до обсуждение темы.
Хочу отметить, что есть и продуктивные участки форума, например обсуждение про volatile. А так вода…
Alex_inventor
zltigo
Ox!Ox!Ox! Напугали! Коленки трясутся! Нахождение проекта на форуме вопрос скорее риторический, чем практический! Я могу ещё выложить. Выкладывать? Что, пиписьками мерится будем? Неверите тому, что я пишу? Что сотня проектов на МК для вас запредельное число? Ужазз… angry.gif
sonycman
2Alex_inventor

Понятно, если привык к чему-то - менять не хочется.
Всё-же, думаю, надо стремиться к лучшему.

Например, выражение 00001110 мало о чём говорит.
А если это будет 1<<BIT1 | 1<<BIT2 | 1<<BIT3 то уже понятно, какие именно биты задействованы. Не надо каждый раз лезть в мануал, чтобы понять, что к чему.

void puts( uint8 *str )
{
do{
OUTCH( *str )
}while( *str++ != '\0' );
}
будет выводить и нуль.

Форум приносит пользу, это однозначно. Зря ты решил его покинуть smile.gif
SpiritDance
Цитата(Alex_inventor @ Jan 29 2007, 18:09) *
Что сотня проектов на МК для вас запредельное число? Ужазз… angry.gif

Да что-то элементарно не стыкуется подобный опыт проектов, со школьным кодом, правописанием и подростковым апломбом. smile.gif
zltigo
Цитата(Alex_inventor @ Jan 29 2007, 17:09) *
Неверите тому, что я пишу?

Нет.

Цитата(SpiritDance @ Jan 29 2007, 17:23) *
Цитата(Alex_inventor @ Jan 29 2007, 18:09) *

Что сотня проектов на МК для вас запредельное число? Ужазз… angry.gif

Да что-то элементарно не стыкуется подобный опыт проектов, со школьным кодом, правописанием и подростковым апломбом. smile.gif

А "красный диплом института", судя по грамотности, больше смахивает на "волчий билет из школы" sad.gif
sonycman
Никогда не пользовался UART портом.
В даташите написано, что через него можно подключать приёмники IrDA. То есть можно сделать управление девайсом с помощью ИК пульта дистанционного управления? Интересно, надо будет заняться этим.

А как понимать oversampling применительно к UART? Значение пересэмплирования может быть 8 или 16. Для чего оно используется?
zltigo
Цитата(sonycman @ Jan 29 2007, 17:21) *
будет выводить и нуль.

Проблема ведь не в том, как выводить! Интересно, а как этот '\0' который так хотелось выдавать отображаться-то будет? Не будет? Зачем тогда выводить.
Andy Great
Цитата
Значит, это только GCC не любит пробелы?

Нет, не только он. Многие программы этого не любят, да и нелатинских символов в путях тоже. Учитывая, что некоторые из них размещают данные в "Моих документах", а их авторы не ведают о локализованных версиях Винды, случаются порой забавные, а порой и не очень приключения. smile.gif

2ALL: Не напоминает ли вам один из участников реинкарнацию незабвенного раз-два-три?
sonycman
Не пойму точно, что означает вот это:

Program code is being executed out of flash

1. Программа выполняется во флэш-памяти?
2. Или наоборот - не во флэш?

Склоняюсь к первому варианту...
zltigo
Цитата(sonycman @ Jan 29 2007, 20:48) *
Program code is being executed out of flash

Да великий и могучий английский языка sad.gif

"executed out" не является фразеологическим глаголом, ( по крайней мере у англичан) - ничего конкретного не скажешь sad.gif. Идем дальше "out of" - если в лоб, то вне, блин, но что-то не то.
Теперь начинаем по три слова рассматривать - с глаголом или существительным - дилема "executed out of" или "out of flash". Первый вариант это естественно из FLASH второй совсем наоборот, однако.
Прислушиваемся к голосу разума, опыту и прочему..... э.... Пытаемся явно написать что исполняется за пределами FLASH ну ничего в голову не приходит, кроме как для определенности добавить какое-нибудь слово между executed и оut. Да sad.gif Однако начинаем мыслить шире отвлекаясь от русского языка - ведь код по любому исполняется за пределами FLASH, поскольку у FLASH "исполнялки" то нет, ну а
берется то он .... A!!!!
Program code is being executed out of (в смысле from) FLASH - практически без вариантов.

P.S.
Это не "C" читать sad.gif
sonycman
Цитата(zltigo @ Jan 30 2007, 00:11) *
Program code is being executed out of (в смысле from) FLASH - практически без вариантов.


Юмор - это хорошо, посмеялся biggrin.gif
Спасибо, я так и думал.
Инглиш иногда заставляет задуматься над простыми в общем-то фразами smile.gif

В эррате Сзма покопался. Ошибок - куча. Там они что, с бодуна процы свои проектируют? Разгильдяи smile.gif
zltigo
Цитата(sonycman @ Jan 29 2007, 22:19) *
Там они что, с бодуна процы свои проектируют?

Нет и на "Verilog"-е они много лучше пишут, чем некоторые на "C" smile.gif smile.gif
sonycman
Посмотрел эррату на LPC2148 - и порадовался за Philips.
Маленький документик, в разы меньше глюков, чем у Atmel.
Ай-яй-яй unsure.gif
Alex03
Цитата(sonycman @ Jan 30 2007, 01:42) *
Посмотрел эррату на LPC2148 - и порадовался за Philips.
Маленький документик, в разы меньше глюков, чем у Atmel.
Ай-яй-яй unsure.gif

smile.gif
А я в течении 2-х лет наблюдал как разрастается errata на LPC2292.
Притом баги от ерраты к еррате не только появлялись, но и перерождались и исчезали. smile.gif


А вааще, смишной топик. smile.gif

Кто про Фому, кто про Ерёму.
Кто про проблемы свои насущные.
Кто на путь истинный ставит, а кто и бочку назад катит. Пора Кота Леопольда вспоминать, а то подерётесь! smile.gif

Кстати небожители эт хто? Нас тут похоронили чёли? smile.gif
SpiritDance
извиняюсь за оффтопик
Я вот тут недавно корейский фильм смотрел "бишунмо" (ну может по другому ето совсем звучит, хрен их корейцев разберет), так вот там небожители - то что надо были. В 7ром целую армию с самого начала положили, тут я сразу понял - фильма стоящая. А главный их потом всю фильму зажигал, в мече у него толи порох, толи сила джедайская была, короче все, кого он резал, потом еще на куски разлетались. Вобщем веселые парни - небожители эти. Фильм - рекомендую, красивый.
boez
GCC пробелы просто обожает. И в именах файлов тоже. Просто нужно ему объяснить какие пробелы в именах файлов, а какие между ними. Делается это обычно с помощью кавычек. Типа

gcc -I "C:\Program Files\Rowley Associates Limited\CrossWorks for ARM 1.6\include\targets" main.c

Замечу, что это нормальное поведение виндовой программы - всякие встроенные copy, dir или notepad ведут себя абсолютно так же...

Так что это проблемы не gcc, а оболочки.
Сергей Борщ
Цитата(sonycman @ Jan 29 2007, 18:43) *
Никогда не пользовался UART портом.
В даташите написано, что через него можно подключать приёмники IrDA. То есть можно сделать управление девайсом с помощью ИК пульта дистанционного управления?

Нет, нельзя. Это совершенно разные системы. IrDA придуман для передачи данных. В нем передаются байты, почти как в UART, только единица не передается, а ноль передается коротким импульсом длительностью 3/16 бита. Поверх этого лежит стек протоколов, позволяющий эмулировать COM, LPT, передавать файлы и прочие объекты (визитные карточки, например). Пульты ДУ передают несущую частотой 30-48КГц, модулированную импульсами. В зависимости от протокола кодирование импульсов разное. Передается ограниченный набор простых команд.
Цитата(sonycman @ Jan 29 2007, 18:43) *
А как понимать oversampling применительно к UART? Значение пересэмплирования может быть 8 или 16. Для чего оно используется?
Приемная ножка считывается 8 или 16 раз за время бита и на основании трех из этих результатов делается вывод - был на ножке 0 или 1.
sonycman
Цитата(Сергей Борщ @ Jan 30 2007, 12:48) *
1. Пульты ДУ передают несущую частотой 30-48КГц, модулированную импульсами. В зависимости от протокола кодирование импульсов разное. Передается ограниченный набор простых команд.
2. Приемная ножка считывается 8 или 16 раз за время бита и на основании трех из этих результатов делается вывод - был на ножке 0 или 1.

Понятно.
1.То есть нельзя использовать встроенный в сэма демодулятор IrDA для приёма сигналов с ИК пультов?
2.Значит, это какая-то защита от помех или что? Ведь и без пересэмплирования UART будет прекрасно работать?
А, нет, почитал внимательнее - в асинхронном режиме только с пересэмплированием, а в синхронном - без smile.gif
Понятно.

Цитата(Alex03 @ Jan 30 2007, 08:46) *
А я в течении 2-х лет наблюдал как разрастается errata на LPC2292.
Притом баги от ерраты к еррате не только появлялись, но и перерождались и исчезали. smile.gif

То, что баги исчезали - это естественный процесс, хотя, применительно к SAM7S этого не наблюдается. И ревизий-то всего 2 sad.gif
Andy Great
Цитата(boez @ Jan 30 2007, 09:42) *
GCC пробелы просто обожает. И в именах файлов тоже. Просто нужно ему объяснить какие пробелы в именах файлов, а какие между ними. Делается это обычно с помощью кавычек. Типа

gcc -I "C:\Program Files\Rowley Associates Limited\CrossWorks for ARM 1.6\include\targets" main.c

Замечу, что это нормальное поведение виндовой программы - всякие встроенные copy, dir или notepad ведут себя абсолютно так же...

Так что это проблемы не gcc, а оболочки.

Та то я знаю... Но это моветон - пробелы-то. Опять же, если gcc на базе Cygwin - ему нужны прямые слеши. Зачем париться, если соблюдая простое правило (о каталогах) можно этого просто избежать.
gladov
Цитата(Alex_inventor @ Jan 29 2007, 17:20) *
Цитата
Такие как Вы, не разобравшись в предмете, портят потом впечатления другим, которые бы потом проскочили эти грабли незаметно.

Ни чего я не порчу, я поднял вопрос, который был решён. И если не поднял бы, то кто этих нюансов не знал, просто так не проскочили.
Когда в начале топика задавались вопросы типа как с UART работать, все молчали. sad.gif Были лишь изредкие фразы типа “вы отлично варитесь в собственном саку, ну и варитесь там!”. Чтож… Я не спорю, даже скажу согласен с этим. Но когда “поварившись” результатом чего явился РАБОТОСПОСОБНЫЙ проект и был выложен, что бы им пользовались такие как, я был неделю назад (если мне дали тогда этот проект, то я бы поблагодарил). Целью проекта было постепенное наращивание, освоение новой периферии (выкладывание промежуточных результатов) и КОНСТРУКТИВНОЕ обсуждение отдельных алгоритмов, не поливая помоями чужие варианты! Если бы кто, например, сказал, вот тут (x=1; x<100;x++) пауза будет не точной, потому что используется такая инструкция проца (которая в режиме таком то выполняется за два такта), другой бы сказал что он применил другую конструкция, которая меньше места занимает, а третий бы предложил более большую конструкцию, но с более богатыми возможностями.
Но нет!!! Как этот “презренный” посмел обратиться к нам, небожителям! И надругаться над нашими священными постулатами. Он даже ПОСМЕЛ! angry.gif , стыдно сказать, bin использовать! Так умри же за это! maniac.gif
Когда надо было, так нет никого, а сейчас налетели как коршуны, и каждый пытается клюнуть побольнее. twak.gif При чём вместо самообучение, я получил публичную порку, и вместо предложений и обсуждений по коду я должен оправдываться за каждое сказанное слово. Оправдаться то я могу, но надоело уже sad.gif .


Может быть местные гуру иногда и бывают резки, но в общем и целом они правы. Нельзя "научить" человека программировать. Можно только помочь ему научиться, причем, чем меньше отвечают вам на ваши вопросы, тем (иногда) лучше - знание, приобретенное собственными потугами не забыватеся, в отличие от регулярных подсказок. Обратите внимание: на конструктивные вопросы (читай не совсем "детские") были даны ответы. А разжевывать все "от" и "до" НИКТО не будет. Конференция нужна для того, чтобы вас поправили в некоторых местах, а не сделали все за вас. Именно поэтому никто на попытался ответить на вопрос "как работать с УАРТ" (этот вопрос мне напоминает вопрос секретарши по телефону: "у меня винда не работает! Что делать???"). Зато когда вами был предложен вариант решения, опытные люди показали на ошибки и/или пожелания к культуре программирования. Повторюсь: это единственно правильный вариант общения в конференции. А готовых приверов полно компиляторах.

Отдельный a14.gif sonycman'у за проявленное терпение и понимание.

PS: прошу не обвинять меня в неграмотности: "вам" намеренно писал с маленькой буквы, т.к. обращался ко всем новичкам, общающимся в этой ветке форума.
SpiritDance
Цитата(sonycman @ Jan 30 2007, 12:45) *
1.То есть нельзя использовать встроенный в сэма демодулятор IrDA для приёма сигналов с ИК пультов?

Еще раз повторю Сергея Борща
irDA и пульты ду - суть разные вещи, базирующиеся на одной и той-же среде передачи - ir лучах. Но даже физически эти интерфейсы разные.
По поводу пультов ду - есть хороший аппнот atmel avr410.
Для irda тоже кое-где мелькала информация.
sonycman
По IrDA понял, спасибо smile.gif
Жаль, что не совместимы sad.gif

Цитата(gladov @ Jan 30 2007, 14:09) *
Отдельный a14.gif sonycman'у за проявленное терпение и понимание.

Спасибо! smile.gif

Нашёл в сети вот это:
Цитата
const char str[] = "Privet"; - строка располагается в сегменте констант;
const char *str= "Privet"; - строка располагается в сегменте констант, резервируется место в памяти под указатель, при старте программы в него записывается адрес строки.

А разве в первом случае при обрашении к этой строковой константе не будет грузиться указатель из памяти?
Наверное, если эта константа находится рядом с куском кода, её обрабатывающим - то она может быть адресована косвенно через PC.
Но если нет - по-любому же будет резервироваться слово в памяти для указателя?
Alex03
Цитата(sonycman @ Jan 30 2007, 16:32) *
Нашёл в сети вот это:
Цитата

const char str[] = "Privet"; - строка располагается в сегменте констант;
const char *str= "Privet"; - строка располагается в сегменте констант, резервируется место в памяти под указатель, при старте программы в него записывается адрес строки.

А разве в первом случае при обрашении к этой строковой константе не будет грузиться указатель из памяти?
Наверное, если эта константа находится рядом с куском кода, её обрабатывающим - то она может быть адресована косвенно через PC.
Но если нет - по-любому же будет резервироваться слово в памяти для указателя?


Как чего разложит компилятор не Ваша забота.
Просто во втором случае str - переменная, т.е. укалатель указывающий на константную (скажем так неименнованную) строку. Дальше в коде Вы легко можете написать str = "la-la=la".
sonycman
Цитата(Alex03 @ Jan 30 2007, 16:07) *
1.const char str[] = "Privet";- строка располагается в сегменте констант;
2.const char *str= "Privet"; - строка располагается в сегменте констант, резервируется место в памяти под указатель, при старте программы в него записывается адрес строки.
Как чего разложит компилятор не Ваша забота.
Просто во втором случае str - переменная, т.е. укалатель указывающий на константную (скажем так неименнованную) строку. Дальше в коде Вы легко можете написать str = "la-la=la".


Точно!
Во втором случае указатель действительно можно переназначать. smile.gif
И - автор был неправ - место в памяти под указатель не резервируется ни в первом, ни во вторм случае, так как данные находятся рядом с кодом и используется косвенная (PC+) адресация.

Но это зависит от того, как и куда разложит данные компилер. Если к константе "Privet" будет обращение из отдалённого сегмента кода - из памяти будет загружен 32 битный указатель.


Хотел спросить знатоков про таймеры.
Допустим, задаче требуется n-ное количество независимых таймеров для задания больших (десятки/сотни миллисекунд) задержек перед/после определённых событий.
Для этого я использовал n-ное кол-во переменных tmr, куда заносил значения задержек.
Один аппаратный периодический таймер обрабатывал на прерывании все эти переменные - в сторону уменьшения до нуля.
Программа опрашивала их, и при обнулении считалось, что пауза выдержана.
А какие есть альтернативные решения этой проблемы?
boez
Цитата(sonycman @ Jan 30 2007, 13:32) *
По IrDA понял, спасибо smile.gif
Жаль, что не совместимы sad.gif


А не все так плохо и ужасьно. На самом деле IrDA и Remote Control пересекаются по крайней мере в двух случаях.
Первый - некоторые люди заметили что 115200 = 38400*3, а 38400 Гц очень похоже на 38 кГц, которые используются в дистанционках. И написали проги, которые передают по протоколу IrDA (те самые 3/16 импульсы) некие байты - специально подобранные битовые маски типа 00100100, из которых полосовой фильтр на 38 кГц в ИК приемнике управляемого аппарата выделяет модулированную посылку, аналогичную той что передает родной передатчик. В программе LIRC точно есть такой модуль.
Второй - CIR (Consumer IR). Это просто условно говоря светодиод, подвешенный на ножку порта, а фотоприемник (без демодулятора) на другую ножку. Обычно это один из режимов ирда-интерфейса. И можно передавать и принимать что угодно. Хошь ирду, хошь код rc5 для дистанционок. Это уже должно быть в железе, но говорят что реально встречается на материнках и КПК. Сам не видел.
SpiritDance
Цитата(sonycman @ Jan 30 2007, 15:54) *
А какие есть альтернативные решения этой проблемы?

Использовать compare. Перед/после определенного события загружать регистр сравнения на определенную величину и ждать срабатывания.
sonycman
Цитата(boez @ Jan 30 2007, 17:13) *
А не все так плохо и ужасьно.

Пока не знакомился с проектами, использующими RC5 (так, вроде, называется протокол ИК пультов бытовой техники?).
Интересует только приём комманд с пульта.
Значит, модулятор для передачи можно, таки? smile.gif
А демодулятор для приёма?
Цитата(SpiritDance @ Jan 30 2007, 17:17) *
Использовать compare. Перед/после определенного события загружать регистр сравнения на определенную величину и ждать срабатывания.

Уже думал над этим. Но может потребоваться одновременное использование нескольких таймеров. Аппаратных таймеров не хватит.
boez
Цитата(sonycman @ Jan 30 2007, 15:24) *
Пока не знакомился с проектами, использующими RC5 (так, вроде, называется протокол ИК пультов бытовой техники?).
Интересует только приём комманд с пульта.
Значит, модулятор для передачи можно, таки? smile.gif
А демодулятор для приёма?


А демодулятор наверное нельзя (первым методом) - потому как простая посылка 38 кГц ну никак не похожа на IrDA-сигнал с его стартовыми-стоповыми битами и строго определенной формой.
RC5 это для примера, главное 38 кГц заполнение.
Сергей Борщ
Цитата(sonycman @ Jan 30 2007, 14:54) *
Допустим, задаче требуется n-ное количество независимых таймеров для задания больших (десятки/сотни миллисекунд) задержек перед/после определённых событий.
Для этого я использовал n-ное кол-во переменных tmr, куда заносил значения задержек.
Один аппаратный периодический таймер обрабатывал на прерывании все эти переменные - в сторону уменьшения до нуля.
Программа опрашивала их, и при обнулении считалось, что пауза выдержана.
А какие есть альтернативные решения этой проблемы?
Одно из решений, применяемое в "больших" ОСях - создается сортированный список таймеров. При этом каждый следующий таймер инициализируется разницей требуемого времени и времени предыдущего. Таким образом в прерывании декрементируется только один таймер. Когда он досчитывает до нуля - генерится сигнал, элемент из списка удаляется. В следующем прерывании будет декрементироваться следующий таймер, отсчитывая оставшееся время. Метод дает выигрыш для большого количества таймеров. Но требует накладных расходов - использование динамической памяти, прцедуры поиска по списку и вставки в середину списка.

Больше вариантов не знаю. Тоже интересно узнать про другие реализации.
sonycman
Цитата(boez @ Jan 30 2007, 17:39) *
А демодулятор наверное нельзя (первым методом) - потому как простая посылка 38 кГц ну никак не похожа на IrDA-сигнал с его стартовыми-стоповыми битами и строго определенной формой.
RC5 это для примера, главное 38 кГц заполнение.

Понятно.
А пульты бывают, в основном, именно с модуляцией 38 кГц?
Тогда демодулятор надо делать внешний, или софтовый, может?

Цитата(Сергей Борщ @ Jan 30 2007, 17:48) *
Одно из решений, применяемое в "больших" ОСях - создается сортированный список таймеров.

Хм, интересное решение. Спасибо. Буду знать smile.gif
boez
Цитата(sonycman @ Jan 30 2007, 15:50) *
Понятно.
А пульты бывают, в основном, именно с модуляцией 38 кГц?
Тогда демодулятор надо делать внешний, или софтовый, может?


Очень часто. Бывают и другие - но тоже около 40, далеко они намного реже забираются. Есть готовые ИК ДУ - приемники, деталька на трех ножках с глазком черным. Земля, питание и выход ТТЛ-уровня. Внутри приемник, усилитель, полосовой фильтр и демодулятор. Сразу на нужную частоту - при покупке нужно узнавать какой на какую. Маркировку конечно не помню, мож кто подскажет.
sonycman
Цитата(boez @ Jan 30 2007, 18:03) *
Очень часто. Бывают и другие - но тоже около 40, далеко они намного реже забираются. Есть готовые ИК ДУ - приемники, деталька на трех ножках с глазком черным. Земля, питание и выход ТТЛ-уровня. Внутри приемник, усилитель, полосовой фильтр и демодулятор. Сразу на нужную частоту - при покупке нужно узнавать какой на какую. Маркировку конечно не помню, мож кто подскажет.

Замечательно!
Значит - тут всё просто!
Дело только за софтом.
Спасибо. smile.gif
Сергей Борщ
Цитата(boez @ Jan 30 2007, 18:03) *
Есть готовые ИК ДУ - приемники, деталька на трех ножках с глазком черным. Земля, питание и выход ТТЛ-уровня.
Они хороши против примитивного решения еще и тем, что содержат схему АРУ, позволяющую исключить влияние внешней засветки.
Цитата(sonycman @ Jan 30 2007, 16:09) *
Замечательно!
Значит - тут всё просто!
Дело только за софтом.
Для полноты картины глянь проект Леонида Ивановича: Применение кода RC-5
Alex_inventor
Hello All. smile.gif
Я опять на форуме. Нужда вынудила. Ирония типа: “Возвращение блудного сына” или “Явление Христа народу” попрошу оставить при себе. Настоятельно прошу! angry.gif
Прежде всего, хочу сказать, что я писал только правду. Кого-то обманывать? Зачем? Какая выгода? Если б, хотел обмануть, то я вам такую сказку тут наплёл бы… Поверти, красноречия у мне хватает (думаю заметили уже). Выкладывание отсканированных дипломов? А что это решит? 100 проектов вас смущает? Я же не говорил, что я OS пишу (хотя было желание как-то написать GSM модем, но хорошие люди отговорили). Большинство моих проектов 4-8 кБ (AVR). Ну, например, приходит друг, говорит надо такую “Приблуду” для телефона. Пожалуйста – час придумывания схемы, час делание платы, час писание пороги, 3 часа отладки и девай-с готов. Вот вам и проект за день. И таких проектов была целая куча.
Погорячились и хватит. smile.gif Просто не надо поливать помоями чужие старания. Кто та над ними сидел, корпел, вымучивал. Надо быть дипломатичнее. Я пытался обсудить, как использовать ARM (например, периферию как задействовать), а не стили писания. Я долгое время работал чисто на asm. По этому и стиль этот применяю в С.
По поводу обсуждения bin, я для себя решил так, никто не был на 100% прав, истина находилась как всегда по середине. Например, регистры GPIO я однозначно буду инициализировать в виде bin(x,x,x,x), ну а UART там можно и (1<<x).
Замечания по поводу, правописания, скажу, я не на экзамене по русскому языку, и вообще я не в России живу и язык у меня родной другой. Хотя я почти всегда, посты свои в WORD на ошибки проверял.
Теперь по существу. Выкладываю проект заготовку. Не могу понять одну вещь. Почему в Startup в блоке “Configure and Enable PLL” вдруг в регистре VICRavIntr появляется число 0x1000. А потом порога неожиданно срывается в SWI. Все места на которые нужно обратить внимание я пометил brickpoint и написал краткий комментарий.
Alex03
Цитата(Сергей Борщ @ Jan 30 2007, 18:48) *
Цитата(sonycman @ Jan 30 2007, 14:54) *

Допустим, задаче требуется n-ное количество независимых таймеров для задания больших (десятки/сотни миллисекунд) задержек перед/после определённых событий.
Для этого я использовал n-ное кол-во переменных tmr, куда заносил значения задержек.
Один аппаратный периодический таймер обрабатывал на прерывании все эти переменные - в сторону уменьшения до нуля.
Программа опрашивала их, и при обнулении считалось, что пауза выдержана.
А какие есть альтернативные решения этой проблемы?
Одно из решений, применяемое в "больших" ОСях - создается сортированный список таймеров. При этом каждый следующий таймер инициализируется разницей требуемого времени и времени предыдущего. Таким образом в прерывании декрементируется только один таймер. Когда он досчитывает до нуля - генерится сигнал, элемент из списка удаляется. В следующем прерывании будет декрементироваться следующий таймер, отсчитывая оставшееся время. Метод дает выигрыш для большого количества таймеров. Но требует накладных расходов - использование динамической памяти, прцедуры поиска по списку и вставки в середину списка.

Больше вариантов не знаю. Тоже интересно узнать про другие реализации.


Если у Вас максимальное количество "таймеров" заранее известно то не обязательно использование динамической памяти.
Тут тоже путей несколько:
1. использование глобальных структурок которые при "засовывании в таймер" включаются в сортированный список
2. Использование массива в модуле таймера, в котором тоже сортируются "записи".

Помимо декремента можно использовать просто "таймерную инкрементируемую переменную" с достаточным коэффициентом пересчёта.
Например в обработчике прерывания каждую мс инкрементируется переменная nTime с некоей разрядностью которой достаточно для максимально-возможного таймаута.
Допустим когда nTime==12345 ктото захотел запустить таймер на 234мс., тогда в всё тотже список засовывается значение 12345+234=12579, т.е. то значение которое должно быть по истечении таймера. Минусы - небольшой контроль переполнения.
Плюсы - перезапуск таймера в любой момент без привязки к текущему времени.


Ну а если надо не события из обработчика таймера генерить (с запуском задач или вызовом калбэков), а основные части проги опрашивают "таймауты" сами, то всё гораздо проще:
Код
static uint uiTimer0Count;
static void timer0ISR()
{
    ...
    uiTimer0Count++;
    ...
}

uint getTimer()
{
    return uiTimer0Count;
}

#define VerifyTimer(s,t)  ((t) <= (getTimer()-(s)))

....
    // Старт таймера
    uint nStartTimerVal = getTimer();
....
    // Проверка  таймаута в 1234мс
    if(VerifyTimer(nStartTimerVal, 1234))
    {
        ...
    }
....

Тут переменных типа nStartTimerVal м.б. сколько угодно, и проверять одну засечку времени можно на несколько значений таймаута (иногда я и такое пользую smile.gif ).
Разрядность таймерной переменной можно понятно любую, но в timer0ISR() и getTimer() необходимо обеспечить атомарность модификации и чтения переменной.
zltigo
Цитата(Alex_inventor @ Jan 30 2007, 16:52) *
Замечания по поводу, правописания, скажу, я не на экзамене по русскому языку, и вообще я не в России живу и язык у меня родной другой.

Привет братскому Белорусскому городу Брест!
sonycman
Цитата(Alex03 @ Jan 30 2007, 19:07) *
Тут переменных типа nStartTimerVal м.б. сколько угодно, и проверять одну засечку времени можно на несколько значений таймаута (иногда я и такое пользую smile.gif ).
Разрядность таймерной переменной можно понятно любую, но в timer0ISR() и getTimer() необходимо обеспечить атомарность модификации и чтения переменной.

Здесь смущает только ситуация, когда uiTimer0Count переполнится: 0xffffffff -> 0x0.
При этом вычисления для текущих таймеров будут неверными.
Как этого избежать?
И, извиняюсь, я не знаю, что значит "обеспечить атомарность"... sad.gif
А - вспомнил - одновременное действие?

2Alex_inventor
Привет!
А ты действительно из Бреста?
Alex_inventor
2 zltigo
Немного offtopic:
А как насчёт белорусов в Латвии? Их тоже не любят, как и русских?
По теме: Так как насчёт проекта. Для меня ответ на поверхности не лежит.
Например: регистр VICRaw сигнализирует что, есть “необработанное прерывание”. Как он может это делать, если VicIntSelect и VicIntEnabled равны 0. И почему происходит прерывание? И что произойдет, если находится в режиме User и использовать BX. Вроде ничего не должно, но в проекте идёт срыв в SWI.


2sonycman
Ну да. А ты что тоже?
zltigo
Цитата(sonycman @ Jan 30 2007, 17:30) *
Здесь смущает только ситуация, когда uiTimer0Count переполнится: 0xffffffff -> 0x0.
При этом вычисления для текущих таймеров будут неверными.
Как этого избежать?

Элементарно, на самом организуются две очереди - одна до переполнения, другая после.
При переполнении счетчика меняется указатель на очередь.
При ограничении диапазона половиной счетчика можно навернуь и логику обработки переполнения на старшем бите.
sonycman
Цитата(Alex_inventor @ Jan 30 2007, 19:36) *
По теме: Так как насчёт проекта. Для меня ответ на поверхности не лежит.
Например: регистр VICRaw сигнализирует что, есть ”необработанное прерывание”. Как он может это делать, если VicIntSelect и VicIntEnabled равны 0. И почему происходит прерывание? И что произойдет, если находится в режиме User и использовать BX. Вроде ничего не должно, но в проекте идёт срыв в SWI.

2sonycman
Ну да. А ты что тоже?


Да нет, я из Тольятти...

Вроде всё нормально с твоей прогой.
Проходит инициализация, выполняется твой main() из трёх x++.
А дальше программа заканчивается, и библиотечная __main (или куда там попадаешь?) вызывает SWI.


Цитата(zltigo @ Jan 30 2007, 19:42) *
Элементарно, на самом организуются две очереди - одна до переполнения, другая после.
При переполнении счетчика меняется указатель на очередь.
При ограничении диапазона половиной счетчика можно навернуь и логику обработки переполнения на старшем бите.

При простом декременте это всё не нужно. smile.gif
zltigo
Цитата(sonycman @ Jan 30 2007, 17:44) *
При простом декременте это всё не нужно. smile.gif

Не совсем понял к какому варианту относится "простой декремент", если к случаю в разностными счетчиками в очереди, то не нужен. Зато нужна проверка и при необходимости коррекция текущего счетчика при занесении новой заявки в очередь, снятии заявки, и особенно приятным становится
коррекция уже заявленного таймера и всей очереди после него....
Плата за то, чтобы с этим не заморачиваться - переключение (причем крайне редкое относительно работы с таймерами) очереди. Программа обслуживания списка естественно одна и все проблемы при фиксации переполнения счетчика указать другую очередь. При постановке в очередь соответственно банальный контроль на больше/меньше текущего и выбор одной из двух очередей. При этом системный счетчик сам по себе вещь не бесполезная и получается бесплатно.
Я использую именно вариант с двумя списками.
Сергей Борщ
Цитата(sonycman @ Jan 30 2007, 17:30) *
Здесь смущает только ситуация, когда uiTimer0Count переполнится: 0xffffffff -> 0x0.
При этом вычисления для текущих таймеров будут неверными.
Нет, ничего страшного не происходит, поскольку он объявлен как unsigned и сравнение делается после беззнакового вычитания. Для примера возьмем восьмибитный unsigned, и пусть сейчас uiTimer0Count = 0xF8. Тогда nStartTimerVal = 0xF8, и допустим таймаут будет 12. Тогда когда таймер будет равен 0xF0, тогда getTimer()-(s) = 0xFF - 0xF8 = 7; Теперь таймер переполнился и стал равен 0. Тогда 0 - 0xF8 = 0xFF08, но поскольку результат округляется до тех же 8 бит, то получится 8. Как видите, ничего страшного не произошло. Надо только следить, чтобы сравнение происходило в тех же типах, что и тип uiTimer0Count. Для int это происходит автоматически. Для других типов желательно в макрос ввести явное приведение типов. Проще всего ввести для этого через typedef тип "таймаут" и именно этим типом объявить и uiTimer0Count и nStartTimerVal и в макросе сделать приведения к этому же типу. Тогда при переносе из проекта в проект надо будет только выбрать подходящий тип для таймаута. Как дальнейшее улучшение я бы еще объявил макрос типа MS() и MKS() который бы пересчитывал реальное время в милли- и микросекундах в соответствующее количество тиков исходя из частоты таймера. Тогда и при смене частоты таймера достаточно будет подправить только этот макрос:
Код
#define    RTOS_TICK_RATE        500        // Hz
#define    RTOS_MS                *RTOS_TICK_RATE/1000

void func()
{
   OS::TBaseProcess::Sleep(30 RTOS_MS);
}



Цитата(zltigo @ Jan 30 2007, 18:03) *
Я использую именно вариант с двумя списками.
Можешь кинуть вырезку исходника?
Alex_inventor
2sonycman
У меня такие подозрения что дебагер глючит. Ну, во-первых прога не моя. Это стартовый код, который среда генерит. Я только заглушку main добавил. Во вторых, последовательность была следующая. Сделал примитивный проект. Всё OK. Добавил <stdio.h> и прога стала вываливатся в SWI ещё до того как до main дойдёт. Ну ладно. Подумал может где в библиотеке swi вызывается а я ниодного регистра VIC не инител (хотя вроде при ресете оно в default находится?) Убрал <stdio.h>, писал свои функции, всё OK. Потом поменял на <stdio.h>, опять в SWI прыгает. И самое интересное, что откат уже ничего не решал. Всё время в SWI. Пересоздал проект. Всё OK. Глюки какие-то? Выполни debug по шагам, и если он себя будет вести по другому, чем я написал в комментариях, то однозначно глюк. Меня в основном интересует почему в VICRaw заносится 0x1000? У тебя заносится? Видно придётся свежею версию скачивать?
Сергей Борщ
Цитата(Alex_inventor @ Jan 30 2007, 16:52) *
Замечания по поводу, правописания, скажу, я не на экзамене по русскому языку, и вообще я не в России живу и язык у меня родной другой. Хотя я почти всегда, посты свои в WORD на ошибки проверял.
Я тоже живу не в России (хотя русский родной) и этот факт у меня отмечен в личных данных. У вас не отмечен, поэтому считаем по умолчанию - "Если не указан город - Москва, если проц - AVR, если компилятор - IAR". Так кажется кто-то предлагал на сахаре :-) Согласитесь, исходных данных чтобы считать вашим родным языком другой было недостаточно. Здесь есть один (минимум) участник из Болгарии и ему никто замечаний не делает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.