|
|
  |
ASM_Modules, Микширование Си и Ассемблера |
|
|
|
Aug 9 2006, 08:16
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(zltigo @ Aug 9 2006, 12:00)  Цитата(addi @ Aug 9 2006, 10:50)  Подскате
Постарайтесь более четко сформулировать вопрос. Я знаю только один способ вставки ассемблерного кода - вставка строки, т.е: asm(" ; \n " " ;EXTRN EEPROMWriteV \n " " ;EXTRN EEPROMReadV \n "); Но у меня очнь много ассемблерного кода, который надо с микшировать с Си. Не знаю как. ????
|
|
|
|
|
Aug 9 2006, 09:42
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(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, - ни какой реакции, что без него что с ним. ???
|
|
|
|
|
Aug 9 2006, 10:13
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(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); И наконец, если Ваши ассемблерные функции имеют параметры и/или возвращают данные определенного типа, Вы должны написать их на ассемблере в соответствии с правилами, описанными в разделе руководству по компилятору, посвященному использованию ассемблерных функций. Там написано каким образом предаются параметры в функцию, в каких регистрах возвращается результат, какие регистры используются компилятором и не должны изменяться функциями и т.д. и т.п. Следуйте этим правилам, и у Вас все получится. Успеха!
|
|
|
|
|
Aug 9 2006, 12:22
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(_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) определять, потому что если подключать ассемблерный файл с их опрдеоением, компилятор начинает на все ругаться.
|
|
|
|
|
Aug 9 2006, 12:50
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(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 # ############################## Модуль работающий.
|
|
|
|
|
Aug 9 2006, 12:55
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(_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 # ############################## Модуль работающий. Спасибо большое  ))
|
|
|
|
|
Aug 11 2006, 07:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(addi @ Aug 11 2006, 09:09)  Подскажите 0. Не задавать вопросы в разделе программирования DSP и не плодить темы. 1. Посмотреть, как "подключается", например, любой cstartup из примеров прилагаемых к IAR. Для большинства контроллеров есть и другие примеры. 2. Прочитать, что непонятно, в документации на Assembler. P.S. Тема перенесена и объединена.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 14 2006, 10:18
|

Участник

Группа: Новичок
Сообщений: 15
Регистрация: 9-08-05
Из: Киев-Борисполь
Пользователь №: 7 472

|
Цитата(addi @ Aug 11 2006, 09:09)  Подскажите пожалйста как подключать Ассемблерные модули к Си проекту(IAR)?. Читай даташит с атмеловского сайта "Миксинг ап С анд Ассемблер коде" - там все нюансы подробно указаны ! Также там есть примеры. Также есть такойже раздел в компайлер референсе. От себя добавлю : не надо инклюдить асм файлы , делать их надо с раширением .асм . У меня почемуто удавалось забивать только по одной процедуре на файл, остальные не видились  к асм файлам я НЕ делал хедеров , на процедуры описаные в этих файлах делал в главном экстерн описание. Все работает
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|