Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
Страницы: 1, 2, 3, 4
KRS
Наткнулся тут на новое семейство.
Заинтересовали LQFP44 c CAN, как дешовая замена AT90CAN64 или мелких STM32.

На семинар
http://catalog.compel.ru/blog/2010/04/08/2...ntrollery-stm8/
никто не собирается?
zksystem
Я пользую STM8, только CAN в них не юзал. Обидно что халявных компиляторов без ограничения по коду у них нет sad.gif а так в принципе интересные камушки.
Pat
Цитата(zksystem @ Apr 13 2010, 15:21) *
Я пользую STM8, только CAN в них не юзал. Обидно что халявных компиляторов без ограничения по коду у них нет sad.gif а так в принципе интересные камушки.


Можно ли подробнее чем пользуютесь и как отлаживаетесь.

Для быстрого старта есть не дорого
http://www.kosmodrom.com.ua/el.php?name=STM8-D

Не понятно ST-Link который у него на борту какие имеет ограничения?

Немного bb-offtopic.gif сейчас разбираюсь с STM32 ну очень приятные ощущения от ST в целом.
KRS
Цитата(Pat @ Apr 13 2010, 23:07) *
Можно ли подробнее чем пользуютесь и как отлаживаетесь.

+1


Цитата(Pat @ Apr 13 2010, 23:07) *
Немного bb-offtopic.gif сейчас разбираюсь с STM32 ну очень приятные ощущения от ST в целом.

Ну после появления LPC17xx LPC13xx STM32 IMHO не актуальны.
delamoure
Актуальность определяется целесообразностью применения.
Вот понять не могу: как LPC13xx и, по-моему, LPC1100 можно было не реализовать ИОН для АЦП?
Или хоть возможность его внешнего подключения.
Сделать АЦП 12 бит.
Где RTC?
В младших STM32 все это можно найти.
А с NXP один выход - приходиться пробовать LCP17xx. А там размер корпуса 12X12 sad.gif
ukpyr
Цитата
как дешовая замена AT90CAN64 или мелких STM32
или STM8S103 как замена Atmega8
жаль gcc не портировали...
KRS
Цитата(ukpyr @ Apr 14 2010, 15:52) *
жаль gcc не портировали...

Почитал я описание ядра.
2 индексных регистра и аккумулятор (если счетчик команд, стек и флаги не считать)
Пространства для оптимизации нет smile.gif
Методы адресации различаются количеством байт адреса (ну и указатель на указатель возможен)

Зато компилер, должно быть просто портировать.
sonycman
Цитата(KRS @ Apr 14 2010, 00:17) *
Ну после появления LPC17xx LPC13xx STM32 IMHO не актуальны.

Это смотря где.
У STM32 более обширная периферия.
Например, есть SDIO контроллер и CPU интерфейс.

Плюс с непривычки у LPC17xx покоробило при сбросе подключение к пинам GPIO pullup резисторов, вместо более логичных pulldown у STM.
zksystem
Цитата(Pat @ Apr 13 2010, 23:07) *
Можно ли подробнее чем пользуютесь и как отлаживаетесь.

Не понятно ST-Link который у него на борту какие имеет ограничения?

Немного bb-offtopic.gif сейчас разбираюсь с STM32 ну очень приятные ощущения от ST в целом.


использую в качестве программера/дебаггера Raisonance R-Link.
IDE - ST Visual Developer
C компилятор - Raisonance C compiler (с ограничением по размеру кода) sad.gif
Есть еще компилятор Cosmic - но он мне чего-то не понравился.

Камушки классные, а вот с компилятором такая засада...
Xenia
Цитата(zksystem @ Apr 13 2010, 17:21) *
Я пользую STM8, только CAN в них не юзал. Обидно что халявных компиляторов без ограничения по коду у них нет sad.gif а так в принципе интересные камушки.

Не расстраивайтесь! smile.gif Только что сегодня, внемля вашим рыданиям, IAR создал для него компилятор! Полную версию пока еще раздобыть не удалось, но эвалюйшен и старткик уже раздаются.
Удивляет, что в таблице поддерживаемых МК серия STM8 не значится. И на сайте про нее ничего не сказано, зато торчит неприкаянная страничка (нормального пути к ней из сайта нет), позволяющая скачать эвалюэйшен-версию:
http://www.iar.com/website1/1.0.1.0/2167/1/
KRS
Цитата(Xenia @ Apr 16 2010, 17:08) *
Не расстраивайтесь! smile.gif Только что сегодня, внемля вашим рыданиям, IAR создал для него компилятор!

Это хорошая новость!!!
А кто нибудь его уже ставил?
Какое железо для отладки он умеет использовать?
Xenia
Цитата(KRS @ Apr 17 2010, 23:48) *
А кто нибудь его уже ставил?
Какое железо для отладки он умеет использовать?

А вот вы себе поставьте, а нам расскажите sm.gif. Список поддерживаемого железа, как всегда, в опциях компилятора.
KRS
Цитата(Xenia @ Apr 17 2010, 23:54) *
А вот вы себе поставьте, а нам расскажите smile.gif

Да у меня пока нет ни одной платы с такими чипами.
Для чипа такого уровня и отладчик то не сильно нужен. Но вот шить из под IAR было бы удобно.
Да и чип поисследовать тоже.
Насколько я понял самый оптимальный по цене - ST-LINK.
Просто покупать ST-ICE за 2 штуки баксов это как то....
Xenia
Цитата(KRS @ Apr 18 2010, 00:13) *
Насколько я понял самый оптимальный по цене - ST-LINK.
Просто покупать ST-ICE за 2 штуки баксов это как то....

А вы купите "STM8s Discovery"( http://www.terraelectronica.ru/pdf/ST/STM8S-DISCOVERY.pdf )
В Терраэлектронике стоит всего 350 рублей ( http://www.terraelectronica.ru/catalog.php...e=2&PageS=1 )
Там на плате за эти деньги уже и МК стоит (STM8S105C6T6, 32 KB Flash, 2 KB RAM, 1 KB EEPROM), и питание с кварцем, и даже USB-интерфейс (!) для подключения к компьютеру. Вроде бы ST-LINK даже встроен туда. Подключаешь USB-кабелем к компу и больше ничего не надо.
zltigo
Цитата(KRS @ Apr 17 2010, 22:48) *
Какое железо для отладки он умеет использовать?

Ровно два
ST-Link и STice
До кучи у него IDE приляпали некой шестой версии.
Вообще-то чип странноватый обычная для ST (по сравнению с AVR8 разнообразнее разве только за счет CAN) периферия, не сомневаюсь, что, как обычно недоработанная и с библиотекаими вместо документации. Обычная для 8bit частота ядра. Обычно минималистичные размеры памяти. Простенькое ядро...
Все обычно. Но зачем-то и многоногие. Ценой брать собираются? Непохоже совсем - на digikey интересные чипы с CAN на борту имеют неразумные цены выше 5 баксов.
KRS
Цитата(Xenia @ Apr 18 2010, 00:19) *
А вы купите "STM8s Discovery"

Не мне такой не нужен. Мне этот чип без CAN вообще не нужен smile.gif
Лично мне эта архитектура совсем не понравилась!
(IMHO эта архитектура - производителям компиляторов должна понравится smile.gif)
Но вот мелкого и дешового чипа с CAN больше нет! ( а тут еще и EEPROM есть).
Хотя вот еще ATmega16M1 появилась!

Цитата(zltigo @ Apr 18 2010, 00:28) *
До кучи у него IDE приляпали некой шестой версии.

Ну вот, а ходили слухи что на Eclipse собираются переходить.
Xenia
Цитата(KRS @ Apr 18 2010, 00:42) *
Лично мне эта архитектура совсем не понравилась!

А вот это уже интересно! Не поделитесь ли вашими впечатлениями об архитектуре STM8? Что именно не понравилось? Как она выглядит по сравнению с AVR? Если вы уже успели составить свое впечатление об этой архитектуре, то было бы крайне интересно вас послушать.
Мнение zltigo по этому же вопросу меня тоже очень интересует.
KRS
Цитата(Xenia @ Apr 18 2010, 00:47) *
Не поделитесь ли вашими впечатлениями об архитектуре STM8?

Она проста до безобразия -
счетчик команд, указатель стека, флаги
аккумулятор и 2 индексных регистра.

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

А дальше все тривиально - операции с одним операндом только в аккумуляторе ( сдвиги например), с двумя - аккумулятор + память, результат в аккумулятор (сложение например).
Ну есть пара инструкций для 16 битных индексных регистров. И работа с битами в памяти.
В общем на асме писать просто скучно, обязательно нужен компилер!!!

Еще раз повторюсь - описание на архитектуру, как то очень тяжело читается! (по сравнению с ARM, AVR, x51). Не в смысле самой архитектуры а стиле описания.
zltigo
Цитата(KRS @ Apr 18 2010, 00:03) *
Она проста до безобразия -

по Вашему описанию, это похоже на усеченную интеловскую 86/88
KRS
Цитата(zltigo @ Apr 18 2010, 01:20) *
по Вашему описанию, это похоже на усеченную интеловскую 86/88

Это надо сильно обрезать smile.gif - оставить SI, DI и AL
Чем то на 51 похоже, чем то на PIC (хотя с ними я не работал)

если не считать флаги, sp, PC
получается один 8 битный регистр через который идет вся математика. И 2 индесных регистра, которые нужны для доступа к массивам.
Одно удобство - страниц нет! память линейно адресуется!
Xenia
Поглядела я на Instruction set этого STM8 - дерьмо! smile.gif Помимо аккумулятора A, там всего лишь два регистра X и Y. И это всё! Правда регистры программного счетчика PC и стека SP там есть, то это погоды не делает. Ужас! И это после 32-х регистров AVR кто-то еще станет переходить на этот дохлый STM8? Ни в жисть не поверю!
http://www.st.com/stonline/products/literature/pm/13590.pdf
zltigo
Цитата(Xenia @ Apr 18 2010, 00:39) *
Поглядела я на Instruction set этого STM8 - дерьмо! smile.gif Помимо аккумулятора A, там всего лишь два регистра X и Y. И это всё!
Ужас! И это после 32-х регистров AVR кто-то еще станет переходить на этот дохлый STM8? Ни в жисть не поверю!

Фу как мелко sad.gif. И как же, например, STM8 в Вашем зацикленном на AVR представлении вообще без регистров работает? Невероятно? А теперь представьте, что вся память у контроллера на правах регистров. У AVR, говорите, их только 32? Ужас! smile.gif smile.gif
Xenia
Цитата(zltigo @ Apr 18 2010, 02:55) *
А теперь представьте, что вся память у контроллера на правах регистров. У AVR, говорите, их только 32? Ужас!

Вся память не работает у STM8 на правах регистров. Или регистры тогда должны быть совсем бесправные smile.gif. Например, у AVR-регистров такие права, что их можно складывать (а также вычитать и проводить логические операции) одной единственной инструкцией за один такт! А над ячейками памяти такое вообще невозможно. К тому же STM8 может выполнять арифметические и логические операции только одном регистре - аккумуляторе. Вот и получится программа, где 70% кода будет гонять число из памяти в аккумялятор и обратно.
_Pasha
Цитата(Xenia @ Apr 18 2010, 04:33) *
Вот и получится программа, где 70% кода будет гонять число из памяти в аккумялятор и обратно.

Нет. MOV mem1, mem2 там есть. Проблема в другом - маловато индексных регистров. Да и умножение за 4 цикла напрягает.
zltigo
Цитата(Xenia @ Apr 18 2010, 04:33) *
К тому же STM8 может выполнять арифметические и логические операции только одном регистре - аккумуляторе.

Разумеется это не так. Работа с одним операндом и двумя, если второй константный, осуществляется без участия аккумулятора. Пересылка память - память тоже есть. Это просто не AVR-овская Load Store архитектура вынужденная иметь много регистров, дабы минимизировать те самые "гонять число". Вы пытаетесь приписать ST8 еще и родимые пятна AVR8 sad.gif.
KRS
Цитата(zltigo @ Apr 18 2010, 11:43) *
Разумеется это не так. Работа с одним операндом и двумя, если второй константный, осуществляется без участия аккумулятора.

У арифметичесикх инструкций сложение, вычитание и логических AND,OR,
dst A (У 16 битных индексный регистр)

Есть правда инкремент, декремент, инверсия, сдвиг памяти и NEG на память работает.
zltigo
Цитата(KRS @ Apr 18 2010, 11:45) *
Есть правда инкремент, декремент, инверсия, сдвиг памяти и NEG на память работает.

.. и манипуляции с битами, как установка с переносами, так и анализ, swap. В общем достаточно неплохо. Архитектура достаточно сложная получилась ( без закосов под RISC ) и не думаю, что просто так вышло или не разработчики не смогли понять за прошедшие годы, как, например, тот-же изначально просто задуманный, а ныне покрытый наслоениями улучшений, AVR8 работает smile.gif.
scifi
Странный спор... Я-то по наивности думал, что в жизни имеет значение не число регистров и остальные тонкости, а реальная производительность.
Вот бы кто-нибудь померил DMIPS/MHz или что-нибудь такое, было бы уже интереснее.
zltigo
Цитата(scifi @ Apr 18 2010, 11:49) *
Странный спор...

Да нет никакого спора, это просто Xenia, как обычно, в силе "нет бога кроме Аллаха Atmel и Мухаммад AVR пророк его" выступает. А так все нормально.
Цитата
Я-то по наивности думал, что в жизни имеет значение не число регистров и остальные тонкости, а реальная производительность.
Вот бы кто-нибудь померил DMIPS/MHz или что-нибудь такое, было бы уже интереснее.

Даже думаю, что это не особо важно - контроллер явно не бить рекорды производительности сделан. В два раза попугаистее других не будет да и в два раза тормознее тоже.
P.S.
Только сейчас глянул, ST что обещают что-то типа 0.83 MIPS/MHz. Atmel на голубом глазу сообщает для AVR8, что up то 1MIPS/MHz smile.gif. Вот и все. Не припомю, но вроде ни разу тот-же AVR на полной тактовой не использовал - за ненадобностью. Для попугаев сейчас мелкие Corteх под и за сотню мегагерц.
Xenia
Цитата(zltigo @ Apr 18 2010, 13:26) *
Да нет никакого спора, это просто Xenia, как обычно, в силе "нет бога кроме Аллаха Atmel и Мухаммад AVR пророк его" выступает.

Дело обстоит прямо противоположным образом - именно вам Atmel предсталяется чем-то вроде Сатаны. Пример тому - архитектура AVR32, которая столь разительно отличается от AVR8, что здесь больше различий, чем сходства. Однако ваша риторика столь же агрессивна и в отношении AVR32. Причем вся ваша критика направлена, как всегда, не на конкретные огрехи архитектуры, а на обливание помоями Atmel и злорадство по поводу ее малейших производственных трудностей.
zltigo
Цитата(Xenia @ Apr 18 2010, 16:39) *
Дело обстоит прямо противоположным образом - именно вам Atmel предсталяется чем-то вроде Сатаны.

smile.gif. Опять sad.gif понесло. Xenia, ну поймите наконец, что я лично совершенно спокойно использую и буду в обозримом будущем использовать тот-же "сатанинский" AVR8. Вот до конца месяца сделаю очередную небольшую коробочку на ATMEGA8. Без всякой предвзятости, как и почти дюжину других ядер. Я их все люблю, со всеми их "конкретными огрехами архитектуры". А вот у Вас саму себя зажавшую в рамки AVR явные проблемы с мировосприятием. Ну переступите, наконец через свою болезненно-фанатичную преданность буквам. Полегчает! Глядишь, и перестанет Сатана в моем лице являться smile.gif.
Xenia
Цитата(zltigo @ Apr 18 2010, 18:38) *
А вот у Вас саму себя зажавшую в рамки AVR явные проблемы с мировосприятием. Ну переступите, наконец через свою болезненно-фанатичную преданность буквам. Полегчает!

Специально для вас заявляю, что затеяла сравнение STM8 с AVR именно по той причине, что STM8 претендует как раз на ту нишу, которую в настоящее занимают AVR. Так что если STM8 и имеет перспективы внедрения, то во многом путем вытеснения из этой ниши AVR. В этом смысле сравнение архитектуры STM8 с теми архитектурами, с которыми ему придется конкурировать, вполне оправдано. И это, отнюдь, не мои фантазии, т.к. еще до меня в посте #6 уже поднимался вопрос о возможности замены ATmega8 на STM8S103.
Вы же пытаетесь переводить разговор на личности, бичуя в участниках форума якобы выявленные вами недостатки. И это уже не в первый раз, и не только в мой адрес.
Pat
Цитата(Xenia @ Apr 18 2010, 18:19) *
уже поднимался вопрос о возможности замены ATmega8 на STM8S103.
Вы же пытаетесь переводить разговор на личности, бичуя в участниках форума якобы выявленные вами недостатки. И это уже не в первый раз, и не только в мой адрес.


Xenia не руйтесь rolleyes.gif и спасибо за инфу по компилятору.

Наверное заменять мегу8 на STM8 не стоит ибо у них цена почти одинаковая, а вот ATmega128 очень даже неплохо заменить на STM8S208
так как цена даже у розничного продавца отличается почти в 2 раза.

Думаю что сравнивать попугаи AVR c STM8 не стоит, все будет примерно одинаково.

Установил EWSTM8 и в симуляторе запустил пример STM8S208MB-Board
Было интересно посмотреть вход в прерывание и не очень проникся там сплошные call.
Причем сохранение регистров в стеке реализовано тоже через их вызыв.
Это при любой степени оптимизации.
Либо я чего то не понимаю либо ИАР пока не доработал компилятор.
WHALE
Цитата(Pat @ Apr 18 2010, 21:43) *
Xenia не руйтесь rolleyes.gif и спасибо за инфу по компилятору.
Наверное заменять мегу8 на STM8 не стоит ибо у них цена почти одинаковая,

а вы поинтересуйтесь доставабельностью той-же меги8.Я думаю-сильно удивитесь.
Атмел в очередной раз кинул потребителей-старые чипы с производства сняты и на
складах их уже нет,новые(А серия) только ожидаются...
Xenia
Цитата(WHALE @ Apr 18 2010, 22:04) *
а вы поинтересуйтесь доставабельностью той-же меги8.Я думаю-сильно удивитесь.
Атмел в очередной раз кинул потребителей-старые чипы с производства сняты и на складах их уже нет, новые (А серия) только ожидаются...

Я полагаю, что это обычный "пересменок", когда один тип МК снимается с производства, а ему на замену приходит приемник или аналог. Сказывается типичная человеческая инерция: конечные потребители "стесняются" оставлять заявки на новый тип (продолжая заказывать старый), опасаясь, что его выпуск задержится. Вслед за этим и крупные диллеры, подбивая такие заявки, не спешат заказывать продукцию нового типа, в свою очередь опасаясь недостаточного на нее спроса. А производителю в этой ситуации не остается ничего иного, как ждать, пока старая продукция не иссякнет на складах. Похоже на то, что именно сейчас наступил период "голодухи", когда складские запасы ATmega8 иссякают. На моей памяти такое уже было с AT90S2313, когда ее заменяли на ATtiny2313 - тоже была "голодуха", когда в розничной продаже не было ни того, ни другого.
WHALE
Цитата(Xenia @ Apr 18 2010, 22:45) *
Я полагаю, что это обычный "пересменок", когда один тип МК снимается с производства, а ему на замену приходит приемник или аналог.

Дней десять назад разговаривал как раз на эту тему с товарищем,работающем разработчиком.
Он утверждает,что такие фортели характерны именно для атмеля.Другие производители обеспечивают
плавную миграцию со старых кристаллов.
zltigo
Цитата(Xenia @ Apr 18 2010, 21:45) *
Я полагаю, что это обычный "пересменок"....

Да, спасибо sad.gif, наверное Ваш ответ "успокоит" моего друга выполняющего заказ на Tiny2313, который вроде ничем прямо не заменяется, но который шерстит всех оптовиков по собирая все, что можно в любых количествах и любых упаковках. По поводу упаковки еще выслушивая контрактного производителя вынужденного ставить эти чипы почти руками. Кстати, по ST в наших краях явных проблем не наблюдается. А мне Атмеловские I2C EEPROM работающие на мегагерце в четверг за 6-7 месяцев поставить пообещали. Опять, типа поклеп на Atmel sad.gif.
Цитата(WHALE @ Apr 18 2010, 21:04) *
а вы поинтересуйтесь доставабельностью той-же меги8.

С просто MEGA8 совсем тупика нет, но 8L - уже фиг вам, ну 8A - типа еще фиг вам. А зарабатывать надо сегодня.

Цитата(Xenia @ Apr 18 2010, 19:19) *
Специально для вас заявляю, что затеяла сравнение STM8 с AVR именно по той причине, что STM8 претендует как раз на ту нишу, которую в настоящее занимают AVR.

И если не благодаря цене или параметрам, то благодаря, цитирую, "ее малейшим производственным трудностям" и "обычным пересменкам", ST нишу займет. Думаю, это действительно для того-же ST основной фактор выброса STM8. Не улыбаться, ни печалиться я по этому поводу я не буду - просто констатация факта.

Цитата(Xenia @ Apr 18 2010, 19:19) *
... и не только в мой адрес.

По отношению к Вам исключительно из самых добрых побуждений.
Xenia
Цитата(zltigo @ Apr 18 2010, 23:50) *
Да, спасибо sad.gif, наверное Ваш ответ "успокоит" моего друга выполняющего заказ на Tiny2313, который вроде ничем прямо не заменяется, но который шерстит всех оптовиков по собирая все, что можно в любых количествах и любых упаковках.

Кажется, что с Tiny2313 действительно та же самая история - на Tiny2313A ее заменяют. Пересменок, однако smile.gif.
Stanislav_S
Хм.. пересменка говорите? Так вот китайское представительство атмела, на Мегу8, 48, 88 послало на 5 месяцев, а мне их надо минимум 3000 штук в месяц. И что теперь делать? Покупать мегу48 по 1,8$, как нам поставщики предлагают? это маразм. Так что Атмел очень сильно упал в моих глазах, теперь для следующих девайсов буду думать о переходе на другие МК, поскольку такой цирк уже достал.
zksystem
Ну свет клином не сошелся на атмелах и микрочипах, после пиков, например, мне как-то комфортнее на STM8 в простых задачах, не считая казуса с компиляторами.
_Bill
Цитата(Xenia @ Apr 18 2010, 05:18) *
Вся память не работает у STM8 на правах регистров. Или регистры тогда должны быть совсем бесправные smile.gif. Например, у AVR-регистров такие права, что их можно складывать (а также вычитать и проводить логические операции) одной единственной инструкцией за один такт! А над ячейками памяти такое вообще невозможно. К тому же STM8 может выполнять арифметические и логические операции только одном регистре - аккумуляторе. Вот и получится программа, где 70% кода будет гонять число из памяти в аккумялятор и обратно.

Как ни странно, большинство операций с памятью выполняются именно за один такт. Исключения составляют операции с косвенной адресацией (через указатель). Операции со словами (16 разрядов) выполняются за 2 такта. Я думаю, что это все же неплохая альтернатива ATmega.
KRS
Сходил я на семинар в Питере!
Из полезного - дали STM8S-Discovery!
Кстати космик совсем не жадный нужен кому?
Райзонанс еще еще не пилил.
Stanislav_S
Цитата(KRS @ Apr 30 2010, 13:02) *
Сходил я на семинар в Питере!
Из полезного - дали STM8S-Discovery!
Кстати космик совсем не жадный нужен кому?
Райзонанс еще еще не пилил.

А насколько космик не жадный? Если совсем не жадный, то можно на ФТП залить, в исследованиях пригодится, благо чипы уже заказал smile.gif
KRS
Цитата(Stanislav_S @ Apr 30 2010, 13:24) *
А насколько космик не жадный? Если совсем не жадный, то можно на ФТП залить, в исследованиях пригодится, благо чипы уже заказал smile.gif

Создал тему
http://electronix.ru/forum/index.php?showtopic=75822
KRS
Поставил я все 3 компилера.
Для начала решил посуммировать вектора.
Т.к. у ядра всего 2 индексных регистра, интересно посомтреть что будут делать компиляторы, когда их нужно больше.
Код
void add8_2(unsigned char *a, unsigned char *b, unsigned char *c, unsigned char len)
{
    do {
        *c++ = *a++ + *b++;
    } while(--len);
}

Космик использовал только один индексный регистр, по очереди для 3 указателей. Лучше всего скомпилировал while(--len);
Код
  43  0016 89                pushw    x
  44       00000000      OFST:    set    0
  46  0017               L11:
  47                    ; 16         *c++ = *a++ + *b++;
  48  0017 1e05              ldw    x,(OFST+5,sp)
  49  0019 f6                ld    a,(x)
  50  001a 5c                incw    x
  51  001b 1f05              ldw    (OFST+5,sp),x
  52  001d 1e01              ldw    x,(OFST+1,sp)
  53  001f fb                add    a,(x)
  54  0020 5c                incw    x
  55  0021 1f01              ldw    (OFST+1,sp),x
  56  0023 1e07              ldw    x,(OFST+7,sp)
  57  0025 f7                ld    (x),a
  58  0026 5c                incw    x
  59  0027 1f07              ldw    (OFST+7,sp),x
  60                    ; 17     } while(--len);
  61  0029 0a09              dec    (OFST+9,sp)
  62  002b 26ea              jrne    L11
  63                    ; 18 }
  64  002d 85                popw    x
  65  002e 81                ret

Райзонанс мог бы выйграть - использовал X для *a и Y для *b и *с, но с *a++ у него вышел прокол, поэтому в итоге код получился не лучше. И лишняя проверка после dec
Код
             ; FUNCTION ?add8_2 (BEGIN)
             ; Register XW is assigned to parameter a
0000         ?DO_0003:
             ; SOURCE LINE # 16
0000 1603       F                      LDW    Y,(003H,SP)  ; [ b ]
0002 90F6                              LD     A,(Y)
0004 905C                              INCW   Y
0006 1703       F                      LDW    (003H,SP),Y  ; [ b ]
0008 BF03       F                      LDW    ?CH.w,X
000A 5C                                INCW   X
000B 92CB00     F                      ADD    A,[?CH.w]
000E 1605       F                      LDW    Y,(005H,SP)  ; [ c ]
0010 90BF02     F                      LDW    ?BH.w,Y
0013 905C                              INCW   Y
0015 1705       F                      LDW    (005H,SP),Y  ; [ c ]
0017 92C700     F                      LD     [?BH.w],A
001A 0A07       F                      DEC    (007H,SP)  ; [ len ]
001C 0D07       F                      TNZ    (007H,SP)  ; [ len ]
001E 26E0                              JRNE   ?DO_0003
0020 81                                RET

У IAR код тоже не фонтан! Но главное посмотрите на while(--len)!!!!
К тому же IAR не использует стек, а использует виртуальные регистры. Что IMHO для этого ядра криво! Что IAR делает хорошо - так это общий код выделят в подпрограммы, если нужно по размеру сжать! И у IAR лучший способ передачи параметров!! задействуются все рагистры.
Код
\                     add8_2:
   \   000000 BF00                  LDW       S:?w1, X
   \   000002 93                    LDW       X, Y
   \   000003 B700                  LD        S:?b4, A
     12              do {
     13                  *c++ = *a++ + *b++;
   \                     ??add8_2_0:
   \   000005 F6                    LD        A, (X)
   \   000006 92CB00                ADD       A, [S:?w1.w]
   \   000009 92C700                LD        [S:?w0.w], A
   \   00000C 5C                    INCW      X
   \   00000D 90BE00                LDW       Y, S:?w1
   \   000010 905C                  INCW      Y
   \   000012 90BF00                LDW       S:?w1, Y
   \   000015 90BE00                LDW       Y, S:?w0
   \   000018 905C                  INCW      Y
   \   00001A 90BF00                LDW       S:?w0, Y
     14              } while(--len);
   \   00001D B600                  LD        A, S:?b4
   \   00001F ABFF                  ADD       A, #0xff
   \   000021 B700                  LD        S:?b4, A
   \   000023 4F                    CLR       A
   \   000024 B100                  CP        A, S:?b4
   \   000026 2600                  JRNE      L:??add8_2_0
     15          }
   \   000028 81                    RET

Если код функции поменять на
Код
void add8_21(unsigned char *a, unsigned char *b, unsigned char *c, unsigned char len)
{
    do {
        *c = *a + *b;
        ++a; ++b; ++c;
    } while(--len);
}

То райзонанс генерирует практически идеальный код
Код
             ; FUNCTION ?add8_21 (BEGIN)
             ; Register XW is assigned to parameter a
0000         ?DO_0005:
             ; SOURCE LINE # 23
0000 1603       F                      LDW    Y,(003H,SP)  ; [ b ]
0002 90F6                              LD     A,(Y)
0004 FB                                ADD    A,(X)
0005 1605       F                      LDW    Y,(005H,SP)  ; [ c ]
0007 90F7                              LD     (Y),A
             ; SOURCE LINE # 24
0009 5C                                INCW   X
000A 1603       F                      LDW    Y,(003H,SP)  ; [ b ]
000C 905C                              INCW   Y
000E 1703       F                      LDW    (003H,SP),Y  ; [ b ]
0010 1605       F                      LDW    Y,(005H,SP)  ; [ c ]
0012 905C                              INCW   Y
0014 1705       F                      LDW    (005H,SP),Y  ; [ c ]
0016 0A07       F                      DEC    (007H,SP)  ; [ len ]
0018 0D07       F                      TNZ    (007H,SP)  ; [ len ]
001A 26E4                              JRNE   ?DO_0005
001C 81                                RET


С более простой задачей
Код
void add8_1(unsigned char *a, unsigned char *b, unsigned char len)
{
    do {
        *a++ += *b++;
    } while(--len);
}

Все справились примерно одинаково неудовлетворительно!
Ее надо записать в таком виде:
Код
void add8_3(unsigned char *a, unsigned char *b, unsigned char len)
{
    do {
        *a += *b;
                ++a;
                ++b;
    } while(--len);
}


Тогда IAR и Райзонанс справились гораздо лучше! Только райзонанс зачем что Y каждый раз сохраняет и загружает, а IAR с фирменным } while(--len);
Космик и X и Y перегружает и код не отличается практически от add8_1

райзонанс
Код
             ; FUNCTION ?add8_3 (BEGIN)
             ; Register XW is assigned to parameter a
0000         ?DO_0007:
             ; SOURCE LINE # 31
0000 1603       F                      LDW    Y,(003H,SP)  ; [ b ]
0002 F6                                LD     A,(X)
0003 90FB                              ADD    A,(Y)
0005 F7                                LD     (X),A
             ; SOURCE LINE # 32
0006 5C                                INCW   X
             ; SOURCE LINE # 33
0007 905C                              INCW   Y
0009 1703       F                      LDW    (003H,SP),Y  ; [ b ]
000B 0A05       F                      DEC    (005H,SP)  ; [ len ]
000D 0D05       F                      TNZ    (005H,SP)  ; [ len ]
000F 26EF                              JRNE   ?DO_0007
0011 81                                RET

IAR
Код
     24          void add8_3(unsigned char *a, unsigned char *b, unsigned char len)
     25          {
   \                     add8_3:
   \   000000 B700                  LD        S:?b0, A
     26              do {
     27                  *a += *b;
   \                     ??add8_3_0:
   \   000002 90F6                  LD        A, (Y)
   \   000004 FB                    ADD       A, (X)
   \   000005 F7                    LD        (X), A
     28                          ++a;
   \   000006 5C                    INCW      X
     29                          ++b;
   \   000007 905C                  INCW      Y
     30              } while(--len);
   \   000009 B600                  LD        A, S:?b0
   \   00000B ABFF                  ADD       A, #0xff
   \   00000D B700                  LD        S:?b0, A
   \   00000F 4F                    CLR       A
   \   000010 B100                  CP        A, S:?b0
   \   000012 2600                  JRNE      L:??add8_3_0
     31          }
   \   000014 81                    RET


Cosmic
Код
100  004e               _add8_3:
101  004e 89                pushw    x
102       00000000      OFST:    set    0
104  004f               L52:
105                    ; 32         *a += *b;
106  004f 1e01              ldw    x,(OFST+1,sp)
107  0051 1605              ldw    y,(OFST+5,sp)
108  0053 f6                ld    a,(x)
109  0054 90fb              add    a,(y)
110  0056 f7                ld    (x),a
111                    ; 33         ++a;
112  0057 5c                incw    x
113  0058 1f01              ldw    (OFST+1,sp),x
114                    ; 34         ++b;
115  005a 1e05              ldw    x,(OFST+5,sp)
116  005c 5c                incw    x
117  005d 1f05              ldw    (OFST+5,sp),x
118                    ; 35     } while(--len);
119  005f 0a07              dec    (OFST+7,sp)
120  0061 26ec              jrne    L52
121                    ; 36 }
122  0063 85                popw    x
123  0064 81                ret

В общем надо что то посложнее попробовать!


Цитата(Pat @ Apr 18 2010, 21:28) *
Было интересно посмотреть вход в прерывание и не очень проникся там сплошные call.

Это сокрее всего из-за настройки оптимизации - надо вместо Balanced поставить Speed или Cross Call убрать!
ukpyr
интересно сравнить с avr-gcc и avr-iar по объему и тактам
avr-gcc -O2
Код
42 0000 CF93              push r28
  43 0002 DF93              push r29
  44                   /* prologue: function */
  45                   /* frame size = 0 */
  46 0004 EC01              movw r28,r24
  47 0006 DB01              movw r26,r22
  48 0008 FA01              movw r30,r20
  49                   .L2:
   3:test.c        ****     do {
   4:test.c        ****         *c++ = *a++ + *b++;
  51                   .LM1:
  52 000a 8D91              ld r24,X+
  53 000c 9991              ld r25,Y+
  54 000e 890F              add r24,r25
  55 0010 8193              st Z+,r24
   5:test.c        ****     } while(--len);
  57                   .LM2:
  58 0012 2150              subi r18,lo8(-(-1))
  59 0014 01F4              brne .L2
  60                   /* epilogue start */
   6:test.c        **** }
  62                   .LM3:
  63 0016 DF91              pop r29
  64 0018 CF91              pop r28
  65 001a 0895              ret
KRS
Цитата(ukpyr @ May 1 2010, 21:24) *
интересно сравнить с avr-gcc и avr-iar по объему и тактам

В данном случае gcc лучше код будет, потому что IAR использует Y под стек.
Но в общем для AVR - IAR вне конкуренции!!

Но это все bb-offtopic.gif
KRS
Посмотрел я как компилируется моя функция разбора данных.
Лучше всего повел себя космик! Для иллюстрации выдрал кусочек в отдельную функцию
Код
void Set12(u8_t id, u16_t v);
void test_1(u8_t *ptr)
{
  u8_t id, ext;
  ext = ptr[0];
  id = ptr[1];
  Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) );
}


IAR что то перемудрил со сдвигами, даже разбираться в лом!
Код
   \                     test_1:
   \   000000 9093                  LDW       Y, X
    119            u8_t id, ext;
    120            ext = ptr[0];
    121            id = ptr[1];
   \   000002 5C                    INCW      X
   \   000003 F6                    LD        A, (X)
   \   000004 B700                  LD        S:?b0, A
    122            Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) );
   \   000006 5F                    CLRW      X
   \   000007 41                    EXG       A, XL
   \   000008 B600                  LD        A, S:?b0
   \   00000A 01                    RRWA      X, A
   \   00000B A40F                  AND       A, #0xf
   \   00000D 02                    RLWA      X, A
   \   00000E 58                    SLLW      X
   \   00000F 58                    SLLW      X
   \   000010 58                    SLLW      X
   \   000011 58                    SLLW      X
   \   000012 58                    SLLW      X
   \   000013 58                    SLLW      X
   \   000014 58                    SLLW      X
   \   000015 58                    SLLW      X
   \   000016 BF00                  LDW       S:?w1, X
   \   000018 93                    LDW       X, Y
   \   000019 1C0002                ADDW      X, #0x2
   \   00001C F6                    LD        A, (X)
   \   00001D 5F                    CLRW      X
   \   00001E 97                    LD        XL, A
   \   00001F 01                    RRWA      X, A
   \   000020 BA00                  OR        A, S:?b3
   \   000022 01                    RRWA      X, A
   \   000023 BA00                  OR        A, S:?b2
   \   000025 01                    RRWA      X, A
   \   000026 90F6                  LD        A, (Y)
   \   000028 48                    SLL       A
   \   000029 48                    SLL       A
   \   00002A 48                    SLL       A
   \   00002B B700                  LD        S:?b1, A
   \   00002D B600                  LD        A, S:?b0
   \   00002F 4E                    SWAP      A
   \   000030 A40F                  AND       A, #0xf
   \   000032 BB00                  ADD       A, S:?b1
   \   000034 CC0000                JP        L:Set12
    123          }


Райзонанс, много лишних пересылок.
Код
             ; FUNCTION ?test_1 (BEGIN)
             ; Register-parameter ptr (XW) is relocated (auto)
             ; SOURCE LINE # 122
0000 89                                PUSHW  X
0001 89                                PUSHW  X
             ; SOURCE LINE # 125
0002 F6                                LD     A,(X)
0003 6B02       F                      LD     (002H,SP),A  ; [ ext ]
             ; SOURCE LINE # 126
0005 1E03       F                      LDW    X,(003H,SP)  ; [ ptr ]
0007 E601                              LD     A,(001H,X)
0009 6B01       F                      LD     (001H,SP),A  ; [ id ]
             ; SOURCE LINE # 127
000B A60F                              LD     A,#00FH
000D 1401       F                      AND    A,(001H,SP)  ; [ id ]
000F 5F                                CLRW   X
0010 95                                LD     XH,A
0011 BF03       F                      LDW    ?CH.w,X
0013 1E03       F                      LDW    X,(003H,SP)  ; [ ptr ]
0015 B605       F                      LD     A,?CH
0017 B703       F                      LD     ?BH,A
0019 E602                              LD     A,(002H,X)
001B B704       F                      LD     ?BL,A
001D BE02       F                      LDW    X,?BH.w
001F 7B02       F                      LD     A,(002H,SP)  ; [ ext ]
0021 48                                SLL    A
0022 48                                SLL    A
0023 48                                SLL    A
0024 B703       F                      LD     ?BH,A
0026 7B01       F                      LD     A,(001H,SP)  ; [ id ]
0028 4E                                SWAP   A
0029 A40F                              AND    A,#00FH
002B BB03       F                      ADD    A,?BH
002D CD0000     F                      CALL   ?Set12
0030 5B04                              ADD    SP,#004H
0032 81                                RET


Космик - лучший код.
Код
477  021b               _test_1:
478  021b 89                pushw    x
479  021c 5203              subw    sp,#3
480       00000003      OFST:    set    3
482                    ; 124   ext = ptr[0];
483  021e f6                ld    a,(x)
484  021f 6b02              ld    (OFST-1,sp),a
485                    ; 125   id = ptr[1];
486  0221 e601              ld    a,(1,x)
487  0223 6b03              ld    (OFST+0,sp),a
488                    ; 126   Set12((id >> 4) + ext*8, ptr[2] | ((id & 0x0F)<<8) );
489  0225 a40f              and    a,#15
490  0227 1604              ldw    y,(OFST+1,sp)
491  0229 97                ld    xl,a
492  022a 90e602            ld    a,(2,y)
493  022d 02                rlwa    x,a
494  022e 89                pushw    x
495  022f 7b04              ld    a,(OFST+1,sp)
496  0231 48                sll    a
497  0232 48                sll    a
498  0233 48                sll    a
499  0234 6b03              ld    (OFST+0,sp),a
500  0236 7b05              ld    a,(OFST+2,sp)
501  0238 4e                swap    a
502  0239 a40f              and    a,#15
503  023b 1b03              add    a,(OFST+0,sp)
504  023d cd0000            call    _Set12
506  0240 85                popw    x
507                    ; 127 }
508  0241 5b05              addw    sp,#5
509  0243 81                ret


Это только маленький кусочек. В общем на сейчас Космик выигрывает при функциях посложнее.
Например в кусочке Set8((Id & 0x1F)+Ext*32,*ptr++); стал вызывать билиотечную функцию сдвига, космик и IAR обошлись без нее!

У IAR возникают каие то артефакты!!! Про dec он вообще похоже не подозревает smile.gif
Еще и такой код if (!--Len) return; скомпилировал как
Код
   \   0000A1 B600                  LD        A, S:?b8
   \   0000A3 ABFF                  ADD       A, #0xff
   \   0000A5 B700                  LD        S:?b8, A
   \   0000A7 4F                    CLR       A
   \   0000A8 B100                  CP        A, S:?b8
   \   0000AA 2600                  JRNE      ??lb_3
   \   0000AC CC0000                JP        L:??parser_3


Цитата
К тому же IAR не использует стек, а использует виртуальные регистры. Что IMHO для этого ядра криво!

Здесь я был не прав! Это здорово улучшаед код - особенно при использовании специфической адресации
Indirect и Indexed Inderec - получаются аппаратные указатели.Так что когда IAR полечат от артефактов код у него будет хороший!

Райзонанс тоже использует виртуальные регистры, А космик стек.
_Bill
Да уж... wink.gif Сильно улучшает...
if (!--Len) вообще можно реализовать одной инструкцией
Код
        dec    S:b8
        jrne   ??b3
.....
Или нет?
PS: Видно первая версия еще очень сырая.
Xenia
Цитата(_Bill @ May 3 2010, 11:48) *
PS: Видно первая версия еще очень сырая.

Это очевидно. Большинство ошибок эффективно выявляются и устраняются только в процессе интенсивной эксплуатации большим количеством пользователей, как бы тщательно не тестировали продукт сами производители. А раз эта версия первая из вышедших на рынок, то погрешностей в ней можно ожидать много. Один номер версии о многом говорит - EWSTM8-1100 - нолик в миноре обычно не бывает, т.к. букве A соответствует единичка.
Вскорости ждем следующую версию EWSTM8 за номером 1.20. Она уже объявлена к выпуску в ближайшие 2-3 месяца на японском сайте IAR -
http://www.iar.com/website1/1.0.1.0/495/3/
На английском такого упоминания нет. А здесь еще кое-что разобрать можно, даже не владея японским языком, или перевести с помощью электронного переводчика.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.