Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ASM_Modules
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
addi
Подскате пожалуйста как обойти в Иаре строковую ассемблерную всавку(т.е вместо строковой использовать вставку блока или файла).?
zltigo
Цитата(addi @ Aug 9 2006, 10:50) *
Подскате

Постарайтесь более четко сформулировать вопрос.
addi
Цитата(zltigo @ Aug 9 2006, 12:00) *
Цитата(addi @ Aug 9 2006, 10:50) *

Подскате

Постарайтесь более четко сформулировать вопрос.

Я знаю только один способ вставки ассемблерного кода - вставка строки, т.е:
asm(" ; \n "
" ;EXTRN EEPROMWriteV \n "
" ;EXTRN EEPROMReadV \n ");

Но у меня очнь много ассемблерного кода, который надо с микшировать с Си.
Не знаю как.
????
zltigo
Цитата(addi @ Aug 9 2006, 11:16) *
микшировать с Си.

Если "много", то, естественно, отдельный ASM файл -> Assembler -> Linker
addi
Цитата(zltigo @ Aug 9 2006, 12:21) *
Цитата(addi @ Aug 9 2006, 11:16) *

микшировать с Си.

Если "много", то, естественно, отдельный ASM файл -> Assembler -> Linker

Пробовал подключать отдельным asm файлом через include(#include <asms.s>), компилятор ругаеться.
Также пробовал без include: Project->AddFiles->asms.s, - ни какой реакции, что без него что с ним.
???
vet
Ассемблерные исходники обрабатываются, соответственно, ассемблером; нет никакого смысла includ-ить их в сишный текст (обрабатываемый, соответственно, компилятором).
Объявите в сишном тексте прототипы ассемблерных функций, остальное сделает линкер.
addi
Цитата(vet @ Aug 9 2006, 13:49) *
Ассемблерные исходники обрабатываются, соответственно, ассемблером; нет никакого смысла includ-ить их в сишный текст (обрабатываемый, соответственно, компилятором).
Объявите в сишном тексте прототипы ассемблерных функций, остальное сделает линкер.

А каким образом тогда прицепить файл с Ассемблерным кодом, чтобы линкер увидел описание этих функций.???
_Bill
Цитата(addi @ Aug 9 2006, 12:42) *
Цитата(zltigo @ Aug 9 2006, 12:21) *

Цитата(addi @ Aug 9 2006, 11:16) *

микшировать с Си.

Если "много", то, естественно, отдельный ASM файл -> Assembler -> Linker

Пробовал подключать отдельным asm файлом через include(#include <asms.s>), компилятор ругаеться.
Также пробовал без include: Project->AddFiles->asms.s, - ни какой реакции, что без него что с ним.
???

Ну, так тут все очень просто. Прежде всего, нужно определить ассемблерные функции как глобальные, типа:
Код
        public   fname
fname:          ; Точка входа в функцию fname
         .......

Во-вторых, в заголовочном файле *.h написать прототип:
Код
void   fname(void);

И наконец, если Ваши ассемблерные функции имеют параметры и/или возвращают данные определенного типа, Вы должны написать их на ассемблере в соответствии с правилами, описанными в разделе руководству по компилятору, посвященному использованию ассемблерных функций. Там написано каким образом предаются параметры в функцию, в каких регистрах возвращается результат, какие регистры используются компилятором и не должны изменяться функциями и т.д. и т.п.
Следуйте этим правилам, и у Вас все получится. Успеха!
addi
Цитата(_Bill @ Aug 9 2006, 14:13) *
Цитата(addi @ Aug 9 2006, 12:42) *

Цитата(zltigo @ Aug 9 2006, 12:21) *

Цитата(addi @ Aug 9 2006, 11:16) *

микшировать с Си.

Если "много", то, естественно, отдельный ASM файл -> Assembler -> Linker

Пробовал подключать отдельным asm файлом через include(#include <asms.s>), компилятор ругаеться.
Также пробовал без include: Project->AddFiles->asms.s, - ни какой реакции, что без него что с ним.
???

Ну, так тут все очень просто. Прежде всего, нужно определить ассемблерные функции как глобальные, типа:
Код
        public   fname
fname:         ; Точка входа в функцию fname
         .......

Во-вторых, в заголовочном файле *.h написать прототип:
Код
void   fname(void);

И наконец, если Ваши ассемблерные функции имеют параметры и/или возвращают данные определенного типа, Вы должны написать их на ассемблере в соответствии с правилами, описанными в разделе руководству по компилятору, посвященному использованию ассемблерных функций. Там написано каким образом предаются параметры в функцию, в каких регистрах возвращается результат, какие регистры используются компилятором и не должны изменяться функциями и т.д. и т.п.
Следуйте этим правилам, и у Вас все получится. Успеха!

А где их(public fname) определять, потому что если подключать ассемблерный файл с их опрдеоением, компилятор начинает на все ругаться.
_Bill
Цитата(addi @ Aug 9 2006, 15:22) *
А где их(public fname) определять, потому что если подключать ассемблерный файл с их опрдеоением, компилятор начинает на все ругаться.

Ну, вот пример (листинг) ассемблерной функции для IAR AVR:
Код
      1    00000000                      module  SerialOut
      2    00000000             ;
     10    00000000             ;       File:   sout.s90
     11    00000000             ;
     12    00000000             ;       08-Sep-05 BK    Initial edit
     13    00000000             ;       28-Sep-05 BK    Last  update
     14    00000000             ;
     15    00000000              $fmacros.inc
     16    00000000             ;
     17    00000000             ; External references
     18    00000000             ;
     19    00000000             ;       extern  N$BITS             ; The number of bits to be transmitted
     20    00000010              N$BITS  =       16                                     ;
     21    00000000                      extern  SDAT$PORT, SDAT$BIT, SDAT$DDR  ; The data output port
     22    00000000                      extern  SCLK$PORT, SCLK$BIT, SCLK$DDR  ; Clock control port
     23    00000000              
     24    00000000                      rseg    CODE           ; Code segment
     25    00000000             ;
     26    00000000             ; ** SerialOut  -- the function outputs N$BITS of data serially through
     27    00000000             ;               the SDAT$BIT of the MCU port SDAT$PORT. The output starts
     28    00000000             ;               from the MSB of data.
     29    00000000             ; ASM usage:
     30    00000000             ;       r16 - low byte of data;
     31    00000000             ;       r17 - high byte of data;
     32    00000000             ;       r18 - the number of bits (N$BITS) for output.
     33    00000000             ; C usage:
     34    00000000             ;       void SerialOut(unsigned data, char nbits);
     35    00000000              
     36    00000000             ;
     37    00000000             ; ** SerialOutW -- the same as the function above, but N$BITS is 16.
     38    00000000             ;
     39    00000000             ; ASM usage:
     40    00000000             ;       r16 - low byte of data;
     41    00000000             ;       r17 - high byte of data;
     42    00000000             ; C usage:
     43    00000000             ;       void SerialOutW(unsigned data);
     44    00000000             ;
     45    00000000                      ENTRY$  SerialOutW
     45.1  00000000                      public  SerialOutW
     45.2  00000000              SerialOutW:
     45.3  00000000                      endm
     46    00000000 E120                 ldi     r18, N$BITS            ; Set bit counter
     47    00000002                      ENTRY$  SerialOut
     47.1  00000000                      public  SerialOut
     47.2  00000002              SerialOut:
     47.3  00000002                      endm
     48    00000002 FF17         ?0:     sbrs    r17, 7                 ; Form a data bit
     49    00000004 ....                 cbi     SDAT$PORT, SDAT$BIT            ;
     50    00000006 FD17                 sbrc    r17, 7                         ;
     51    00000008 ....                 sbi     SDAT$PORT, SDAT$BIT            ;
     52    0000000A ....                 sbi     SCLK$PORT, SCLK$BIT    ; Form a clock pulse
     53    0000000C 0F00                 lsl     r16                            ; (Shift word of data left)
     54    0000000E 1F11                 rol     r17                            ;      ;
     55    00000010 ....                 cbi     SCLK$PORT, SCLK$BIT            ;
     56    00000012 952A                 dec     r18                    ; Bump counter
     57    00000014 F7B1                 brne    ?0                     ; Loop if not done yet
     58    00000016              
     59    00000016 9508                 ret
     60    00000018             ;
     61    00000018             ; ** InitSerial -- the function initiates serial port.
     62    00000018             ;
     63    00000018             ; C usage:
     64    00000018             ;       void InitSerial(void);
     65    00000018             ;
     66    00000018                      ENTRY$  InitSerial
     66.1  00000000                      public  InitSerial
     66.2  00000018              InitSerial:
     66.3  00000018                      endm
     67    00000018 ....                 sbi     SCLK$DDR, SCLK$BIT     ; Set serial port as output
     68    0000001A ....                 sbi     SDAT$DDR, SDAT$BIT             ;
     69    0000001C ....                 cbi     SCLK$PORT, SCLK$BIT    ; Set initial levels on clock
     70    0000001E ....                 cbi     SDAT$PORT, SDAT$BIT    ; and data bits
     71    00000020 9508                 ret
     72    00000022              
     73    00000022                      end
##############################
#          CRC:2341          #
#        Errors:   0         #
#        Warnings: 0         #
#         Bytes: 34          #
##############################

Модуль работающий.
addi
Цитата(_Bill @ Aug 9 2006, 16:50) *
Цитата(addi @ Aug 9 2006, 15:22) *

А где их(public fname) определять, потому что если подключать ассемблерный файл с их опрдеоением, компилятор начинает на все ругаться.

Ну, вот пример (листинг) ассемблерной функции для IAR AVR:
Код
      1    00000000                      module  SerialOut
      2    00000000            ;
     10    00000000            ;       File:   sout.s90
     11    00000000            ;
     12    00000000            ;       08-Sep-05 BK    Initial edit
     13    00000000            ;       28-Sep-05 BK    Last  update
     14    00000000            ;
     15    00000000              $fmacros.inc
     16    00000000            ;
     17    00000000            ; External references
     18    00000000            ;
     19    00000000            ;       extern  N$BITS            ; The number of bits to be transmitted
     20    00000010              N$BITS  =       16                                    ;
     21    00000000                      extern  SDAT$PORT, SDAT$BIT, SDAT$DDR ; The data output port
     22    00000000                      extern  SCLK$PORT, SCLK$BIT, SCLK$DDR ; Clock control port
     23    00000000              
     24    00000000                      rseg    CODE          ; Code segment
     25    00000000            ;
     26    00000000            ; ** SerialOut  -- the function outputs N$BITS of data serially through
     27    00000000            ;               the SDAT$BIT of the MCU port SDAT$PORT. The output starts
     28    00000000            ;               from the MSB of data.
     29    00000000            ; ASM usage:
     30    00000000            ;       r16 - low byte of data;
     31    00000000            ;       r17 - high byte of data;
     32    00000000            ;       r18 - the number of bits (N$BITS) for output.
     33    00000000            ; C usage:
     34    00000000            ;       void SerialOut(unsigned data, char nbits);
     35    00000000              
     36    00000000            ;
     37    00000000            ; ** SerialOutW -- the same as the function above, but N$BITS is 16.
     38    00000000            ;
     39    00000000            ; ASM usage:
     40    00000000            ;       r16 - low byte of data;
     41    00000000            ;       r17 - high byte of data;
     42    00000000            ; C usage:
     43    00000000            ;       void SerialOutW(unsigned data);
     44    00000000            ;
     45    00000000                      ENTRY$  SerialOutW
     45.1  00000000                      public  SerialOutW
     45.2  00000000              SerialOutW:
     45.3  00000000                      endm
     46    00000000 E120                 ldi     r18, N$BITS        ; Set bit counter
     47    00000002                      ENTRY$  SerialOut
     47.1  00000000                      public  SerialOut
     47.2  00000002              SerialOut:
     47.3  00000002                      endm
     48    00000002 FF17         ?0:     sbrs    r17, 7                ; Form a data bit
     49    00000004 ....                 cbi     SDAT$PORT, SDAT$BIT        ;
     50    00000006 FD17                 sbrc    r17, 7                        ;
     51    00000008 ....                 sbi     SDAT$PORT, SDAT$BIT        ;
     52    0000000A ....                 sbi     SCLK$PORT, SCLK$BIT; Form a clock pulse
     53    0000000C 0F00                 lsl     r16                        ; (Shift word of data left)
     54    0000000E 1F11                 rol     r17                        ;     ;
     55    00000010 ....                 cbi     SCLK$PORT, SCLK$BIT        ;
     56    00000012 952A                 dec     r18                ; Bump counter
     57    00000014 F7B1                 brne    ?0                    ; Loop if not done yet
     58    00000016              
     59    00000016 9508                 ret
     60    00000018            ;
     61    00000018            ; ** InitSerial -- the function initiates serial port.
     62    00000018            ;
     63    00000018            ; C usage:
     64    00000018            ;       void InitSerial(void);
     65    00000018            ;
     66    00000018                      ENTRY$  InitSerial
     66.1  00000000                      public  InitSerial
     66.2  00000018              InitSerial:
     66.3  00000018                      endm
     67    00000018 ....                 sbi     SCLK$DDR, SCLK$BIT    ; Set serial port as output
     68    0000001A ....                 sbi     SDAT$DDR, SDAT$BIT            ;
     69    0000001C ....                 cbi     SCLK$PORT, SCLK$BIT; Set initial levels on clock
     70    0000001E ....                 cbi     SDAT$PORT, SDAT$BIT; and data bits
     71    00000020 9508                 ret
     72    00000022              
     73    00000022                      end
##############################
#          CRC:2341          #
#        Errors:   0         #
#        Warnings: 0         #
#         Bytes: 34          #
##############################

Модуль работающий.

Спасибо большое smile.gif))
addi
Подскажите пожалйста как подключать Ассемблерные модули к Си проекту(IAR)?.
zltigo
Цитата(addi @ Aug 11 2006, 09:09) *
Подскажите

0. Не задавать вопросы в разделе программирования DSP и не плодить темы.
1. Посмотреть, как "подключается", например, любой cstartup из примеров прилагаемых к IAR.
Для большинства контроллеров есть и другие примеры.
2. Прочитать, что непонятно, в документации на Assembler.


P.S.
Тема перенесена и объединена.
big256
Цитата(addi @ Aug 11 2006, 09:09) *
Подскажите пожалйста как подключать Ассемблерные модули к Си проекту(IAR)?.


Читай даташит с атмеловского сайта "Миксинг ап С анд Ассемблер коде" - там все нюансы подробно указаны ! Также там есть примеры.
Также есть такойже раздел в компайлер референсе.

От себя добавлю : не надо инклюдить асм файлы , делать их надо с раширением .асм .
У меня почемуто удавалось забивать только по одной процедуре на файл, остальные не видились glare.gif к асм файлам я НЕ делал хедеров , на процедуры описаные в этих файлах делал в главном экстерн описание. Все работает smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.