На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
    > прогаем Микроконтроллеры!
      привет всем! вот недавно узнал что микроконтроллеры типа PIC прогаю.тся на АССEMBLER кто нибудь занимается такими вешами и можно ли прогать их на C++??
        Можно на C. Компиляторов C++ для микроконтроллеров я пока не встречал. Но если ты хочешь получить действительно качественный и оптимизированный код, пиши на ассемблере. Компиляторы C под микроконтроллеры генерируют такое количество мусора, что сам не рад будешь.
          Цитата

          можно ли прогать их на C++??

          да можно
          Цитата

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

          я бы не стал делать таких категоричных заявлений
          Сообщение отредактировано: potor -
            Цитата potor @
            я бы не стал делать таких категоричных заявлений
            Я бы не делал, если бы не пробовал. Сравните для примера программу сложения 2-х целых (!) чисел под любой 51-й Intel на ассемблере и на C. Тогда всё сразу станет ясно. На то он и микроконтроллер, чтобы пользоваться им оптимально, а не покупать контроллеры с огромными флешками за счёт конечного пользователя.
              Цитата

              Сравните для примера программу сложения 2-х целых (!) чисел под любой 51-й Intel на ассемблере и на C

              предлагаю выложить вам свой пример на ассемблере сюда, а после я выложу оттранслированный с С код и посмотрим у кого получится короче
                Цитата EL[michlen] @
                Сравните для примера программу сложения 2-х целых (!) чисел под любой 51-й Intel на ассемблере и на C
                Ну так выкладывайте сравнение. Свои исходники на ассемблере и C, на которых выполнялось сравнение. Посмотрим. :)
                Хотя у меня уже есть подозрение, с чем связаны такие выводы. :)
                  Цитата

                  Ну так выкладывайте сравнение. Свои исходники на ассемблере и C, на которых выполнялось сравнение. Посмотрим.

                  я готов хоть сейчас, но для начала жду от EL[michlen] его версию

                  Добавлено
                  давайте сразу уточним задачу
                  надо написать на ассемблере MCS51 функцию, которая принимает на входе 2 16-разрядных беззнаковых целых числа и выдает на выходе их сумму ввиде беззнакового целого 16-разрядного числа
                    Цитата potor @
                    я готов хоть сейчас, но для начала жду от EL[michlen] его версию
                    Мне хотелось бы увидеть сравнение именно от EL[michlen]. Т.е. как, что и на чем он сравнивал. :)
                      potor, на восьмиразрядном контроллере?
                        да, и в чем проблема???
                          Входные данные пишем в R0, R1, R2 и R3. Например для сложения 65000 и 50 делаем так:
                          ExpandedWrap disabled
                            mov R1, #0E8h
                            mov R2, #0FDh
                            mov R3, #32h
                            mov R4, #0
                          ExpandedWrap disabled
                            mov A, R1
                            add A, R3
                            mov R1, A
                            mov A, R2
                            addc A, R4
                            mov R2, A
                          В R1 и R2 результат. Компилятора под рукой нету (я на работе), так что сравнить с С сейчас не смогу. Только вечером.

                          Добавлено
                          Цитата potor @
                          да, и в чем проблема???
                          В том, что ещё и работать надо помимо форума. А вообще, я же просто уточнил.

                          Добавлено
                          На С я тогда пробовал вот что (если подгонять под наш вопрос):
                          ExpandedWrap disabled
                            int addition(int var1, int var2)
                            {
                                return var1+var2;
                            }
                             
                            void main()
                            {
                                int var1=123, var2=456;
                                addition(var1, var2);
                            }

                          Когда скомпилировал, получилось (если память не изменяет) около 5 Кб! После чего я обозлился на С и решил, что он здесь точно не катит. :wall:

                          trainer, чувствую подвох, а понять не могу...
                            вот тоже самое на сях
                            ExpandedWrap disabled
                              #include<at89x51.h>
                              unsigned int add(unsigned int a, unsigned int b)
                              {
                              return a+b;
                              }
                              main()
                              {
                              unsigned int a;
                               
                              a=add(50, 65000);
                              }

                            это то что получилось после компиляции
                            ExpandedWrap disabled
                                            ; FUNCTION _add (BEGIN)
                              ;---- Variable 'a' assigned to Register 'R6/R7' ----
                              ;---- Variable 'b' assigned to Register 'R4/R5' ----
                                                                         ; SOURCE LINE # 2
                                                                         ; SOURCE LINE # 3
                                                                         ; SOURCE LINE # 4
                              0000 EF                MOV     A,R7
                              0001 2D                ADD     A,R5
                              0002 FF                MOV     R7,A
                              0003 EE                MOV     A,R6
                              0004 3C                ADDC    A,R4
                              0005 FE                MOV     R6,A
                                                                         ; SOURCE LINE # 5
                              0006         ?C0001:
                              0006 22                RET    
                                           ; FUNCTION _add (END)
                               
                                           ; FUNCTION main (BEGIN)
                                                                         ; SOURCE LINE # 6
                                                                         ; SOURCE LINE # 7
                                                                         ; SOURCE LINE # 10
                              0000 7DE8              MOV     R5,#0E8H
                              0002 7CFD              MOV     R4,#0FDH
                              0004 7F32              MOV     R7,#032H
                              0006 7E00              MOV     R6,#00H
                              0008 120000      R     LCALL   _add
                              000B 8E00        R     MOV     a,R6
                              000D 8F00        R     MOV     a+01H,R7
                                                                         ; SOURCE LINE # 11
                              000F 22                RET    
                                           ; FUNCTION main (END)

                            один в один твой пример
                            и ничего лишнего я тут не вижу
                              potor, что за компилятор?

                              Добавлено
                              Кстати, если писать a=add(50, 65000);, то можно вообще без регистров обойтись - это ж константы. ;)
                                Цитата

                                potor, что за компилятор?

                                пакет keil uVision2 V2.04b
                                сам компилятор V6.00i

                                Цитата

                                Кстати, если писать a=add(50, 65000);, то можно вообще без регистров обойтись - это ж константы.

                                вот поэтому я и сделал это отдельной функцией
                                иначе бы он все это дело оптимизировал
                                  Цитата potor @

                                  пакет keil uVision2 V2.04b
                                  сам компилятор V6.00i
                                  Бум знать. ;) Доеду до дома - скажу, каким я пробовал.
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0769 ]   [ 16 queries used ]   [ Generated: 29.03.24, 09:57 GMT ]