Jump to content

    

Есть ли IDE/компилятор под pic, в которой можно нормально работать?

Есть ли более человеческая IDE чем mplab X?

с mplab второй раз столкнулся, какая-то лютая жесть после arm... убивают следующие вещи:

- дикие тормоза дебаггера и при компиляции-загрузке прошивки размером в... 500 инструкций

- оптимизатор C - без комментариев. Деление на степень двойки не умеет в сдвиг превращать, а если делаешь сдвиг, например на 3, то вместо 3х команд сдвига разворачивает цикл команд на 10. Порылся в настройках, опций оптимизатора не нашел.

        LATAbits.LATA4^=1 - просто под стол уполз...
 

Spoiler

0x68: MOVLB 0x2
0x69: SWAPF LATA, W
0x6A: ANDLW 0x1
0x6B: MOVWF 0x173
0x6C: MOVLW 0x1
0x6D: XORWF 0x173, F
0x6E: SWAPF 0x173, F
0x6F: MOVF LATA, W
0x70: XORWF 0x173, W
0x71: ANDLW 0xEF
0x72: XORWF 0x173, W
0x73: MOVWF LATA

dgram_ptr++; - инструкцию incf компилятор не знает?

Spoiler

 

0x74: MOVLW 0x1
0x75: MOVWF 0x173
0x76: MOVF 0x173, W
0x77: ADDWF 0x17C, F

 

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

Share this post


Link to post
Share on other sites
1 minute ago, jeka said:

стоит ли с пиками дальше связываться...

Похоже, что cortex-m0 уделывают их по стоимости. Если вы, конечно, не о dsPIC.

Share this post


Link to post
Share on other sites

уделывают. stm32f030 = 20(!) рублей.

Единственное преимущество 8биток - это потребление.

Share this post


Link to post
Share on other sites
31 minutes ago, jeka said:

Единственное преимущество 8биток - это потребление.

Ну m0 как раз по энергопотреблению не проигрывают, и создавались как замена восьмибиткам по этому параметру тоже. Правда для меня энергопотребление совершенно неактуально.

32 minutes ago, jeka said:

уделывают. stm32f030 = 20(!) рублей.

Это где такие цены???

Share this post


Link to post
Share on other sites
Just now, haker_fox said:

Это где такие цены???

компэл или элитан, если объем брать

Just now, haker_fox said:

Ну m0 как раз по энергопотреблению не проигрывают,

проигрывают.  на stm можно что-то обсчитывать (если pll выключен) на токе порядка 20-30 мка, а standby менее 10мка не сделаешь. На пике же можно неспешно выполнять код на токе 1мка, а ждать вообще на 0.1мка.

Share this post


Link to post
Share on other sites

Я познакомился с пиками ещё в середине 90-х, очень много писал под pic16 и pic17. Писал на ASM в MPLAB, как для себя, так и на коммерческой основе. Проекты были достаточно большие, с задействованием богатой периферии и математики. Несколько раз пытался перейти на Си, но не видел ни одного вменяемого компилятора для 8-битных микроконтроллеров PIC. Код получался монстроидальный и просто не влезал в контроллер. Необходимые математические алгоритмы вообще не получалось выполнять в реальном времени, при этом на ASM они летали. В общем я изначально и занимался тем, что переписывал код на ASM после того, как сишники сдавались. Потом переключился на pic18, но остался на ASM. В MPLAB очень мощный макроассемблер, позволяющий делать чудеса. В конечном итоге я сделал библиотеку макросов, которая позволяла писать на си-подобном языке. Библиотека была задокументирована и все конструкции покрывались тестами. Это очень сильно упростило разработку.

Ниже описание некоторых конструкций. Но это лишь малая часть, вся жесть в деталях, особенно в описании типов данных и условий. Мой Вам совет - если работаете с 8-битными PIC, держитесь подальше от Си.

 

Spoiler

; ##############################################################################
; #                                                                            #
; # Switch structure example is shown below.                                   #
; # Switch structure is based on a jump table. Its maximum size is limited to  #
; # 128 entries if NEAR jump type is used or 64 entries if FAR jump type is    #
; # used.                                                                      #
; # SWITCH and SWITCH_END are mandatory macroses that are used to open and     #
; # close switch section. SWITCH accepts two mandatory parameters - jump table #
; # size and jump type. Nested switches are allowed.                           #
; # CASE, DEFAULT and BREAK macroses open and close code section for the       #
; # particular or default case. BREAK macros could be omitted, but it is not   #
; # recommended. CASE macros accepts one mandatory parameter - case identifier #
; # (index) which must not exceed jump table size - 1. DEFAULT macros could be #
; # omitted but it is also not recommended.                                    #
; #                                                                            #
; # SWITCH 32, NEAR                                                            #
; #     CASE 0x00                                                              #
; #         ; load accumulator here                                            #
; #         SWITCH 7, NEAR                                                     #
; #             CASE 0x00                                                      #
; #                 ; code section                                             #
; #                 BREAK                                                      #
; #             CASE 0x04                                                      #
; #                 ; code section                                             #
; #                 BREAK                                                      #
; #             DEFAULT                   <-- optional, but recommended        #
; #                 ; code section                                             #
; #                 BREAK                                                      #
; #         SWITCH_END                                                         #
; #         BREAK                                                              #
; #     CASE 0x05                                                              #
; #         ; code section                                                     #
; #         BREAK                                                              #
; #     CASE 0x31                                                              #
; #         ; code section                                                     #
; #         BREAK                                                              #
; #     DEFAULT                           <-- optional, but recommended        #
; #         ; code section                                                     #
; #         BREAK                                                              #
; # SWITCH_END                                                                 #
; #                                                                            #
; ##############################################################################

; ##############################################################################
; #                                                                            #
; # Condition structure example is shown below.                                #
; # COND and COND_END are mandatory macroses that are used to open and close   #
; # condition section. COND accepts two mandatory parameters - AND or OR for   #
; # condition type and NEAR or FAR for jump type. Condition type specifies the #
; # operation to be performed within conditional statements. Nested conditions #
; # are allowed.                                                               #
; # COND_TRUE and COND_FALSE macroses are optional and used to start true or   #
; # false code section respectively. To decrease code size COND_TRUE section   #
; # must precede COND_FALSE section for AND condition type and COND_FALSE      #
; # section must precede COND_TRUE section for OR condition type.              #
; #                                                                            #
; # Conditions must be defined as follows:                                     #
; #                                                                            #
; # CONDITION_NAME macro [macro parameters if necessary]                       #
; #     local _tid = TID(NODE_TYPE_COND, .0)                                   #
; #     if (OR == CONDTYPE)                                                    #
; #         ; condition check, jump if true ---------+                         #
; #         if (NEAR == CONDJUMPTYPE)     <----------+                         #
; #             bra COND_TRUE_LABEL             <-- near jump (less code size) #
; #         else ; (FAR == CONDJUMPTYPE)                                       #
; #             goto COND_TRUE_LABEL            <-- far jump  (large ranges)   #
; #         endif                                                              #
; #     else                                                                   #
; #         if (AND == CONDTYPE)                                               #
; #             ; condition check, jump if false ----+                         #
; #             if (NEAR == CONDJUMPTYPE) <----------+                         #
; #                 bra COND_FALSE_LABEL        <-- near jump (less code size) #
; #             else ; (FAR == CONDJUMPTYPE)                                   #
; #                 goto COND_FALSE_LABEL       <-- far jump  (large ranges)   #
; #             endif                                                          #
; #         endif                                                              #
; #     endif                                                                  #
; #     endm                                                                   #
; #                                                                            #
; # COND AND, NEAR                                                             #
; #     COND OR, NEAR                                                          #
; #         COND AND, NEAR                                                     #
; #             CONDITION_1                                                    #
; #             CONDITION_2                                                    #
; #             CONDITION_3                                                    #
; #         COND_FALSE                    <-- optional (OR: recommended to     #
; #             ; code section                put COND_FALSE first)            #
; #         COND_TRUE                     <-- optional                         #
; #             ; code section                                                 #
; #         COND_END                                                           #
; #         CONDITION_4                                                        #
; #         CONDITION_5                                                        #
; #     COND_TRUE                         <-- optional (AND: recommended to    #
; #         ; code section                    put COND_TRUE first)             #
; #     COND_FALSE                        <-- optional                         #
; #         ; code section                                                     #
; #     COND_END                                                               #
; # COND_END                                                                   #
; #                                                                            #
; ##############################################################################

; ##############################################################################
; #                                                                            #
; # Conditional if structure example is shown below.                           #
; # IFC and IFC_END are mandatory macroses that are used to open and close     #
; # conditional if section. IFC accepts one mandatory parameter - NEAR or FAR  #
; # for jump type. Nested conditional ifs are allowed.                         #
; # ELSEIFC and ELSEC macroses are optional and used to start ELSEIF or ELSE   #
; # code section respectively.                                                 #
; #                                                                            #
; # IFC NEAR                                                                   #
; #     COND AND, NEAR                                                         #
; #         CONDITION_1                                                        #
; #         CONDITION_2                                                        #
; #         CONDITION_3                                                        #
; #     COND_TRUE                <-- optional                                  #
; #         ; code section                                                     #
; #     COND_FALSE               <-- optional                                  #
; #         ; code section                                                     #
; #     COND_END                                                               #
; # ELSEIFC                      <-- optional                                  #
; #     CONDITION_4                                                            #
; #     CONDITION_5                                                            #
; # ELSEC                        <-- optional                                  #
; #     ; code section                                                         #
; # IFC_END                                                                    #
; #                                                                            #
; ##############################################################################

; ##############################################################################
; #                                                                            #
; # Conditional while structure example is shown below.                        #
; # WHILEC and WHILEC_END are mandatory macroses that are used to open and     #
; # close conditional while section. WHILEC accepts one mandatory parameter -  #
; # NEAR or FAR for jump type. Nested conditional whiles are allowed.          #
; #                                                                            #
; # WHILEC NEAR                                                                #
; #     COND AND, NEAR                                                         #
; #         CONDITION_1                                                        #
; #         CONDITION_2                                                        #
; #         CONDITION_3                                                        #
; #     COND_TRUE                <-- optional                                  #
; #         ; code section                                                     #
; #     COND_FALSE               <-- optional                                  #
; #         ; code section                                                     #
; #     COND_END                                                               #
; #     CONDITION_4                                                            #
; #     CONDITION_5                                                            #
; #     ; while code section                                                   #
; # WHILEC_END                                                                 #
; #                                                                            #
; ##############################################################################

 

 

Share this post


Link to post
Share on other sites
4 hours ago, jeka said:

dgram_ptr++; - инструкцию incf компилятор не знает?

Просто интересно - 
скомпилируйте

++ dgram_ptr;

 

Share this post


Link to post
Share on other sites
Just now, GenaSPB said:

Просто интересно - 
скомпилируйте

то же самое...

Похоже взят готовый компилятор, который делает промежуточный код, который потом транслируется в асм. И этот промежуточный код явно не оптимален для системы команд пика. Явно видно, что он подразумевает один (возможно несколько) регистров, которые через доступы к памяти приходится использовать.

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

 

2 hours ago, andrey_p said:

В MPLAB очень мощный макроассемблер, позволяющий делать чудеса.

Это здорово, но я вряд ли буду на пиках часто что-то делать, особенно сложные вещи. Тратить время на изучение не вижу смысла. К тому же держать в голове много систем команд, когда каждая со своими приколами сложно - в голове в кашу превращается всё когда и x86, и arm , и msp и pic еще... Хотя на пиках я давно программировал на асме, довольно много. Но уже подзабыл, а вспоминать не очень хочется.

Share this post


Link to post
Share on other sites
7 hours ago, jeka said:

выполнять код на токе 1мка

Эквивалентный по функциональности? Я ведь с пиков начинал в далёких 2000-х... Могу что=то позабыть, конечно, но не верится, что это так...

6 hours ago, andrey_p said:

держитесь подальше от Си.

Тогда уж, "держитесь подальше от pic")))

4 hours ago, jeka said:

программировал на асме, довольно много.

Кстати, почему такая уважаемая фирма IAR не делает компилятора для пика?

Share this post


Link to post
Share on other sites
4 minutes ago, haker_fox said:

Эквивалентный по функциональности?

зачем? обычно я использую их для управления питанием, мониторинга батарей, не более. Если разряженный девайс с li-ion кто-то бросил надолго чтоб не убить батарею приходится микроамперы считать.

Share this post


Link to post
Share on other sites
2 minutes ago, jeka said:

батарею приходится микроамперы считать.

Ладно, понятно) Я с такими токами не работал, поэтому у меня никаких аргументов нет) Хотя и принимал участие в разработке зарядного устройства для lipo в составе прибора. Мы там ATmega32HVB применяли, она специально для зарядников ориентирована.

Share this post


Link to post
Share on other sites
2 часа назад, jeka сказал:

зачем? обычно я использую их для управления питанием, мониторинга батарей, не более. Если разряженный девайс с li-ion кто-то бросил надолго чтоб не убить батарею приходится микроамперы считать.

Ну так делайте как все: Основную часть кода (не требовательную к потреблению) напишите на си, а критически важные по потреблению участки - асм-вставками (inline asm или в отдельных файлах).

Share this post


Link to post
Share on other sites
14 часов назад, jeka сказал:

- оптимизатор C - без комментариев.

        LATAbits.LATA4^=1 - просто под стол уполз...
 

dgram_ptr++; - инструкцию incf компилятор не знает?

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

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

Share this post


Link to post
Share on other sites
31 minutes ago, AHTOXA said:

Они специально ухудшают результаты компиляции в бесплатной версии, чтобы побудить покупать Pro версию - вставляют бессмысленные инструкции, переходы, и проч.

Это же преступление против честных российских инженеров! Расстрелять!:biggrin:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now