26.10.2010, 22:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от alexgap
|
Если делаете покупку на 1000 грн. и более (даже не по одной позиции) - это опт и этих процентов нет.
|
Если Вы сотрудник Космодрома - сделайте одолжение, разместите это на Вашем сайте. И укажите процент. Иначе всё это - словеса и не более.
Откуда взялась цифра 1000 грн? Почему не 500 и не 1599? Процент 3 или 8? Или всё-таки 5? Кстати, счета ведь выписываются не на Космодром, а на некие карточки, кои являются собственностью менеджеров. Сколько захотят, столько сверху и напишут. А в Космодром отстегнут то, что указано на сайте. Грязноватая работа, чтобы не сказать иначе.
|
|
|
|
26.10.2010, 22:51
|
|
Заблокирован
Регистрация: 26.10.2010
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM8(S/L), первые впечатления
От цены прайса Космодрома накидывается 10-15%, если в розницу, но девочки в контейнере иногда "балуются", шалуньи, иногда накидывают и больше, что шокирует. Нужно разговаривать, например, если вам надо 20-30 штук 74HC4051, то цена как за одну штуку, а если 50 и больше, то соответствует прайсу, вот и решайте.
|
|
|
|
26.10.2010, 23:34
|
|
Заблокирован
Регистрация: 15.10.2010
Адрес: Kiev/Kharkov
Сообщений: 133
Сказал спасибо: 15
Сказали Спасибо 21 раз(а) в 21 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от ut1wpr
|
Если Вы сотрудник Космодрома - сделайте одолжение, разместите это на Вашем сайте. И укажите процент. Иначе всё это - словеса и не более.
Откуда взялась цифра 1000 грн? Почему не 500 и не 1599? Процент 3 или 8? Или всё-таки 5? Кстати, счета ведь выписываются не на Космодром, а на некие карточки, кои являются собственностью менеджеров. Сколько захотят, столько сверху и напишут. А в Космодром отстегнут то, что указано на сайте. Грязноватая работа, чтобы не сказать иначе.
|
О да, это верно, но им проще не размещать, так проще лохов ловить и обценивать.
Ценообразование кошмардрома приводят всех в дикий кипиш, порой такое мутят с ценами что кашмар.
Харьковчане уже привыкли к их отмазкам, а кошмардромовские продавцы так и говорят - от цены на сайте накидывайте 10% это будет почти то зачто продадут. И опт. у них понятие тоже странное.
|
|
|
Сказали "Спасибо" projects.org.ua
|
|
|
27.10.2010, 03:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Народ, имейте совесть. Хватит о ценах на Атмел в ветке по STM. Я конечно попрошу модераторов потом почистить оффтоп, но лучше сразу не сорить где попало. Тут можно только цены на STM8 обсуждать.
В общем о библиотеке. Ее беда в том, что не учитывается источник данных. При работе с регистрами периферии это почти всегда константы. А библиотека работает с ними как с переменными. В результате тормоза - ведь оптимизатору негде развернуться. Если же библиотеку изменить - сделать функции инлайновыми принудительно, то тормоза уходят и объем программы уменьшается. Почему это не сделано изначально мне не понятно. Возьмем простой пример - задание приоритета вектору. Библиотека нам предлагает файлы stm8_itc.h и stm8_itc.c с имеющейся функцией ITC_SetSoftwarePriority. Я не буду приводить исходный текст функции, желающие могут посмотреть самостоятельно. Приведу только листинг результата.
Дано:
Код:
|
// задаем самый низкий приоритет прерываниям от порта B
ITC_SetSoftwarePriority(4,0); |
Результат:
Код:
|
// main.ls
547 0016 5f clrw x
548 0017 a604 ld a,#4
549 0019 95 ld xh,a
550 001a cd0000 call _ITC_SetSoftwarePriority
// собственно функция в stm8s_itc.ls
645 0000 _ITC_SetSoftwarePriority:
647 0000 89 pushw x
648 0001 89 pushw x
649 00000002 OFST: set 2
658 ; 216 Mask = (u8)(~(u8)(0x03U ‹‹ (((u8)IrqNum % 4U) * 2U)));
660 0002 9e ld a,xh
661 0003 a403 and a,#3
662 0005 48 sll a
663 0006 5f clrw x
664 0007 97 ld xl,a
665 0008 a603 ld a,#3
666 000a 5d tnzw x
667 000b 2704 jreq L43
668 000d L63:
669 000d 48 sll a
670 000e 5a decw x
671 000f 26fc jrne L63
672 0011 L43:
673 0011 43 cpl a
674 0012 6b01 ld (OFST-1,sp),a
675 ; 219 NewPriority = (u8)((u8)(PriorityValue) ‹‹ (((u8)IrqNum % 4U) * 2U));
677 0014 7b03 ld a,(OFST+1,sp)
678 0016 a403 and a,#3
679 0018 48 sll a
680 0019 5f clrw x
681 001a 97 ld xl,a
682 001b 7b04 ld a,(OFST+2,sp)
683 001d 5d tnzw x
684 001e 2704 jreq L04
685 0020 L24:
686 0020 48 sll a
687 0021 5a decw x
688 0022 26fc jrne L24
689 0024 L04:
690 0024 6b02 ld (OFST+0,sp),a
691 ; 221 switch (IrqNum)
693 0026 7b03 ld a,(OFST+1,sp)
695 ; 305 default:
695 ; 306 break;
696 0028 a119 cp a,#25
697 002a 2503cc00b2 jruge L562
698 002f 5f clrw x
699 0030 97 ld xl,a
700 0031 58 sllw x
701 0032 de0032 ldw x,(L64,x)
702 0035 fc jp (x)
703 0036 L112:
704 ; 228 ITC-›ISPR1 &= Mask;
706 0036 c67f70 ld a,32624
707 0039 1401 and a,(OFST-1,sp)
708 003b c77f70 ld 32624,a
709 ; 229 ITC-›ISPR1 |= NewPriority;
711 003e c67f70 ld a,32624
712 0041 1a02 or a,(OFST+0,sp)
713 0043 c77f70 ld 32624,a
714 ; 230 break;
716 0046 206a jra L562
717 0048 L312:
718 ; 236 ITC-›ISPR2 &= Mask;
720 0048 c67f71 ld a,32625
721 004b 1401 and a,(OFST-1,sp)
722 004d c77f71 ld 32625,a
723 ; 237 ITC-›ISPR2 |= NewPriority;
725 0050 c67f71 ld a,32625
726 0053 1a02 or a,(OFST+0,sp)
727 0055 c77f71 ld 32625,a
728 ; 238 break;
730 0058 2058 jra L562
731 005a L512:
732 ; 250 ITC-›ISPR3 &= Mask;
734 005a c67f72 ld a,32626
735 005d 1401 and a,(OFST-1,sp)
736 005f c77f72 ld 32626,a
737 ; 251 ITC-›ISPR3 |= NewPriority;
739 0062 c67f72 ld a,32626
740 0065 1a02 or a,(OFST+0,sp)
741 0067 c77f72 ld 32626,a
742 ; 252 break;
744 006a 2046 jra L562
745 006c L712:
746 ; 264 ITC-›ISPR4 &= Mask;
748 006c c67f73 ld a,32627
749 006f 1401 and a,(OFST-1,sp)
750 0071 c77f73 ld 32627,a
751 ; 265 ITC-›ISPR4 |= NewPriority;
753 0074 c67f73 ld a,32627
754 0077 1a02 or a,(OFST+0,sp)
755 0079 c77f73 ld 32627,a
756 ; 266 break;
758 007c 2034 jra L562
759 007e L122:
760 ; 272 ITC-›ISPR5 &= Mask;
762 007e c67f74 ld a,32628
763 0081 1401 and a,(OFST-1,sp)
764 0083 c77f74 ld 32628,a
765 ; 273 ITC-›ISPR5 |= NewPriority;
767 0086 c67f74 ld a,32628
768 0089 1a02 or a,(OFST+0,sp)
769 008b c77f74 ld 32628,a
770 ; 274 break;
772 008e 2022 jra L562
773 0090 L322:
774 ; 296 ITC-›ISPR6 &= Mask;
776 0090 c67f75 ld a,32629
777 0093 1401 and a,(OFST-1,sp)
778 0095 c77f75 ld 32629,a
779 ; 297 ITC-›ISPR6 |= NewPriority;
781 0098 c67f75 ld a,32629
782 009b 1a02 or a,(OFST+0,sp)
783 009d c77f75 ld 32629,a
784 ; 298 break;
786 00a0 2010 jra L562
787 00a2 L522:
788 ; 301 ITC-›ISPR7 &= Mask;
790 00a2 c67f76 ld a,32630
791 00a5 1401 and a,(OFST-1,sp)
792 00a7 c77f76 ld 32630,a
793 ; 302 ITC-›ISPR7 |= NewPriority;
795 00aa c67f76 ld a,32630
796 00ad 1a02 or a,(OFST+0,sp)
797 00af c77f76 ld 32630,a
798 ; 303 break;
800 ; 305 default:
800 ; 306 break;
802 00b2 L562:
803 ; 310 }
806 00b2 5b04 addw sp,#4
807 00b4 81 ret |
Нехило для функции изменяющей два бита в регистре.
Напишем свой аналог.
Код:
|
@inline void ITC_SetPriority(uint8_t vector, uint8_t priority)
{
uint8_t * ptr;
uint8_t mask;
ptr = (uint8_t*)pITC + (vector ›› 2);
mask = (uint8_t)(3 ‹‹ ((vector & 0x03) ‹‹ 1));
*ptr = (uint8_t)((*ptr) & (~mask) | (priority ‹‹ ((vector & 0x03) ‹‹ 1)));
}
// и ее вызов, точно такой же как выше
ITC_SetPriority(4,0); |
Результат:
Код:
|
541 000e c67f71 ld a,32625
542 0011 a4fc and a,#252
543 0013 c77f71 ld 32625,a |
Результат тот же, изменяются два бита, а вот реализация несколько другая. Я разницу вижу, а вы? ![Улыбка](images/smilies/icon_smile.gif)
Вообще делиться своими соображениями дальше, или все хотят пару лет подождать?
Последний раз редактировалось kison; 27.10.2010 в 04:30.
Причина: косяк в функции :)
|
|
|
|
27.10.2010, 03:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Если в вышеприведенном примере заменить константное указание вектора на переменную, то наступает ахтунг
Код:
|
volatile uint8_t a;
ITC_SetPriority(a,0);
// листинг
534 ; 55 ITC_SetPriority(a,0);
537 000e b600 ld a,_a
538 0010 6b04 ld (OFST-2,sp),a
539 ; 26 ptr = (uint8_t*)pITC + (vector ›› 2);
541 0012 44 srl a
542 0013 44 srl a
543 0014 5f clrw x
544 0015 97 ld xl,a
545 0016 1c7f70 addw x,#32624
546 0019 1f05 ldw (OFST-1,sp),x
547 ; 27 mask = (uint8_t)(3 ‹‹ (vector & 0x03));
549 001b 7b04 ld a,(OFST-2,sp)
550 001d a403 and a,#3
551 001f 5f clrw x
552 0020 97 ld xl,a
553 0021 a603 ld a,#3
554 0023 5d tnzw x
555 0024 2704 jreq L41
556 0026 L61:
557 0026 48 sll a
558 0027 5a decw x
559 0028 26fc jrne L61
560 002a L41:
561 002a 6b03 ld (OFST-3,sp),a
562 ; 28 *ptr = (uint8_t)((*ptr) & (~mask) | (priority ‹‹ (vector & 0x03)));
564 002c 7b04 ld a,(OFST-2,sp)
565 002e a403 and a,#3
566 0030 5f clrw x
567 0031 97 ld xl,a
568 0032 4f clr a
569 0033 5d tnzw x
570 0034 2704 jreq L02
571 0036 L22:
572 0036 48 sll a
573 0037 5a decw x
574 0038 26fc jrne L22
575 003a L02:
576 003a 6b01 ld (OFST-5,sp),a
577 003c 7b03 ld a,(OFST-3,sp)
578 003e 1e05 ldw x,(OFST-1,sp)
579 0040 43 cpl a
580 0041 f4 and a,(x)
581 0042 1a01 or a,(OFST-5,sp)
582 0044 f7 ld (x),a
583 ; 56 ITC_SetSoftwarePriority(4,0);
586 0045 5f clrw x
587 0046 a604 ld a,#4
588 0048 95 ld xh,a |
Но такая работа с железом редкость. Хотя помнить о этом все же следует. Кстати все равно лучше, чем через switch/case.
Если всего лишь сделать стандартную библиотечную функцию инлайновой, ну и вектор ес-но константным, то результат будет намного лучше:
Код:
|
847 004c a6fc ld a,#252
848 004e 6b05 ld (OFST-1,sp),a
849 ; 34 NewPriority = (u8)((u8)(PriorityValue) ‹‹ (((u8)IrqNum % 4U) * 2U));
851 0050 0f06 clr (OFST+0,sp)
852 ; 36 switch (IrqNum)
854 ; 51 ITC-›ISPR2 &= Mask;
856 0052 c67f71 ld a,32625
857 0055 1405 and a,(OFST-1,sp)
858 0057 c77f71 ld 32625,a
859 ; 52 ITC-›ISPR2 |= NewPriority;
861 005a c67f71 ld a,32625
862 005d 1a06 or a,(OFST+0,sp)
863 005f c77f71 ld 32625,a
864 ; 53 break; |
Последний раз редактировалось kison; 27.10.2010 в 03:48.
|
|
|
|
27.10.2010, 05:17
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
В ассемблерных мнемониках чувствуется дух 6502 и Z80. Это мне уже нравится.
__________________
.
![](signaturepics/sigpic59615_7.gif)
В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
|
|
|
|
27.10.2010, 06:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
О приоритетах прерываний. В отличии от тех же АВР в STM8 имеется реально приоритетная система прерываний. Впрочем псевдоприоритеты по номерам векторов, как у АВР, тоже имеются. В регистре состояния есть два флажка i0 и i1. Ими задается текущий приоритет. Система по сути работает всегда в режиме прерывания. Для каждого вектора задается свой приоритет. При возникновении запроса на прерывание контроллер проверяет заданный для соответствующего вектора приоритет и вызывает прерывание только если он выше текущего. При входе в прерывание этот заданный приоритет копируется во флажки i1 и i0 регистра состояния процессора - теперь прерывания возможны только для векторов, у которых приоритет выше. При выходе из прерывания восстанавливается регистр состояния и соответственно приоритет действовавший до входа в прерывание. Запрет прерывания - установка в регистре состояния сразу максимального приоритета. Разрешение - минимального. Там все правда несколько хитрее, вектору нельзя задать минимальный приоритет, так чтоб он не мог прервать основной цикл. Ну и приоритеты идут не по порядку. Максимальный - 0b11, минимальный не 0b00 как логично предположить, а 0b10. Именно последний устанавливается текущим при разрешении прерываний в основном цикле. В общем довольно гибкая система и весьма продуманная.
|
|
|
|
27.10.2010, 06:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Источники тактирования. Тоже вполне удачно сделаны, причем некоторые решения очень хорошие. Источником может быть внешний генератор, встроенный генератор с внешним резонатором, встроенный RC на 16МГц и внутренний же RC генератор на 128КГц. Используемый источник можно выбирать из программы, т.е. он не задается раз и навсегда. Более того - система может сама переключить источник на внутренний 16МГц с делителем на 8, если например кварц отвалится. ![Улыбка](images/smilies/icon_smile.gif) Перейдя на внутренний генератор мы еще и прерывание получим, ну чтоб знать что имеются проблемы. Это полезная фича.
|
|
|
|
27.10.2010, 06:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от niXto
|
Ручками... Но прерываний не так много, чтобы из-за этого париться...
|
Угу, ручками. И выйдет как раз то, что я в 30 сообщении приводил. Но если считаете не так, приведите свой вариант. Исходные данные выше - М128, порт G0 устанавливаем единичку в прерывании. И подсчитаем такты.
|
|
|
|
27.10.2010, 15:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Угу, ручками. И выйдет как раз то, что я в 30 сообщении приводил. Но если считаете не так, приведите свой вариант. Исходные данные выше - М128, порт G0 устанавливаем единичку в прерывании. И подсчитаем такты.
|
Ну вот, держите. Вся подпрограмма выполняется 9 циклов, плюс 8 на вход-выход из прерывания, итого 17. Проект на тиньке, поэтому для чистоты эксперимента установил единичку в ячейку 65 - соответствует ПОРТГ у мега128.
И мне самому интересно стало - давайте напишем подпрограмму преобразования 4-байтного (32 бита) двоичного числа в двоично-десятичное. Эта подпрограмма будет многим полезна, и она дает максимальную нагрузку на ядро - тут и сдвиги, и арифметика, и косвенная адресация. В стек и пр. ничего не сохраняем - предполагаем что у нас ВСЕ регистры и ячейки ОЗУ свободны. Согласны?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:06.
|
|