|
|
  |
WinAVR: Cовмещение Си и ассемблера |
|
|
|
Feb 14 2012, 11:05
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(haker_fox @ Feb 9 2012, 15:35)  Здравствуйте! А Вы путь к асм-файлу полностью указываете? А слеши нужные используете? Я имею в виду '/', а не '\'. Т.е. как-то так Код ASRC = c:\temp\proj\src.S Открываю Makefile из папки примеров asmdemo, одна из первых строчек выглядит как: Код MCU = attiny13 #MCU = attiny45 FORMAT = ihex TARGET = asmdemo SRC = $(TARGET).c [b]ASRC = isrs.S[/b] OPT = s в ASRC путь к файлу не указывается и тем неменее сборка работает !.. Почему ?
|
|
|
|
|
Feb 14 2012, 11:50
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(haker_fox @ Feb 12 2012, 09:05)  Это как? Насколько я знаю, такое не возможно. У Вас файлы могут лежать в любом месте файловой системы, включая сетевые диски... Это ответ на мое предположение что все пути по умолчанию берутся из текущей дериктории... и что я к Си-шному файлу путь не указываю ... Цитата(demiurg_spb @ Feb 14 2012, 14:46)  Что задаётся? что искалось в текущем каталоге или в других ... вообще каким образом задается место откуда должны браться исходные файлы ?
Сообщение отредактировал MaxiMuz - Feb 14 2012, 11:48
|
|
|
|
|
Feb 14 2012, 16:45
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(haker_fox @ Feb 13 2012, 15:58)  Мне понравился Ваш подход! Я сам не очень хорошо с Makefile знаком. Будет время, попробую таким же образом организовать. В архиве примеров к порту AVR/avr-gcc scmRTOS это всё в рабочем виде. Заодно там же в makefile проектов видно, как я одной строкой меняю версию компилятора. Причём что под WIN, что под линуксом — все остальное в проекте не меняется. Как в проекте — собирается avr-gcc, который находится по PATH. Раскомментировав одну из строк Код #TOOL = avr-kgp- #TOOL = c:/WinAVR/bin/avr- #TOOL = c:/avr-gcc/WinAVR/20071221/bin/avr- #TOOL = c:/avr-gcc/WinAVR/20100110/bin/avr- #TOOL = c:/avr-gcc/kgp/20080530/bin/avr- #TOOL = c:/avr-gcc/kgp/20100725/bin/avr- я выбираю для проверки нужное. Цитата(MaxiMuz @ Feb 14 2012, 13:50)  вообще каким образом задается место откуда должны браться исходные файлы ? Где искать файлы, которые нужны, если впрямую путь не прописан — через VPATH. Но сначала нужно собрать сам перечень необходимых файлов. Это или вручную, или через функцию $(wildcard ...), если подбора всего через wildcard нет, то автоматом ничего подключаться не будет. Зависит от того, кто и как писал makefile
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 15 2012, 00:49
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (MaxiMuz @ Feb 14 2012, 19:05)  в ASRC путь к файлу не указывается и тем неменее сборка работает !.. Почему ? Это потому, что Makefile находится в одном каталоге с указанными файлами. Переместите один из них в другой катало, и все, работать не будет. Брать по умолчанию файлы из "известных" каталогов - это свойство операционной системы. Под "известными" каталогами я понимаю прежде всего текущий, и те, которые заданы в переменной Path (см. свойства ОС). Не знаю, как Makefile работает с переменной Path, не экспеременритровал, но чтобы указать где находится файл, используется путь к нему. Путь может задаватьсь разными способами. Например, представим такую структуру каталогов проекта CODE c:\proj c:\proj\drv c:\proj\drv\lcd c:\proj\drv\keyb c:\proj\lib Пусть файл main.c находится в c:\proj. Пусть файл keyb.c (для обслуживания клавиатуры) находится соответственно в c:\proj\drv\lcd. Вы можете указать полное имя фала следующими образами относительно каталога c:\proj CODE c:\proj\drv\keyb\keyb.c или keyb\keyb.c или ..\proj\drv\keyb\keyb.c Последний вариант учебный, т.к. заставляет нас "выйти" из текущего каталога на уровень выше (диск C в данном случае), а затем снова в него "зайти". На самом деле никаких входов и выходов не будет. Это так сказать база. Я пока выбрал для себя такой вариант указания пути к файлам проекта. Уважаемый ReAl показал, как это автоматизировать. Предлагаю Вам сделать выбор. Ну и поэксперементировать с обращением к файлам. Не обязательно исходникам, можно потренироваться в консоле в ручную вызвать программу из какого-нибудь созданного каталога.... Успехов!
--------------------
Выбор.
|
|
|
|
|
Feb 15 2012, 17:58
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Всем спасибо за разьяснение в особенности haker_fox  Возникла другая проблема! При совмещении асм-кода и Си компилятор "заоптимизировал" почти весь алгоритм Си программы, а именно: вечный цикл Код while (1) { if (Cnt_Dl==0) { BufLed=pgm_read_byte (Ptabl); // ЗАГРУЗКА НОВОГО ЗНАЧЕНИЯ ТОНА Ptabl++; Cnt_Dl=1000; } } был упрощен до: Код while (1) { if (Cnt_Dl==0) 74: 23 2b or r18, r19 76: 19 f4 brne .+6 ; 0x7e <main+0x16> { BufLed=pgm_read_byte (Ptabl); // ЗАГРУЗКА НОВОГО ЗНАЧЕНИЯ ТОНА 78: 84 91 lpm r24, Z+ 7a: 80 93 60 00 sts 0x0060, r24 7e: ff cf rjmp .-2 ; 0x7e <main+0x16> переменные BufLed и *Ptabl описаны в Си-программе как Код uint8_t const *Ptabl; volatile uint8_t BufLed; // буфер для отображения оттенка соответствующим образом обьявленны в Асме и связке h-файла: Код #ifdef __ASSEMBLER__ # define sreg_save r2 # define LedTne r4 # define GenCnt r16 # define Cnt_Dl_low r18 # define Cnt_Dl_hi r19
#else /* !ASSEMBLER */
#include <stdint.h> register uint8_t LedTne asm("r4"); register uint16_t Cnt_Dl asm("r18");
#endif /* ASSEMBLER */ В чем может быть дело ?
Сообщение отредактировал MaxiMuz - Feb 15 2012, 18:03
|
|
|
|
|
Feb 16 2012, 09:31
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (MaxiMuz @ Feb 16 2012, 10:20)  почему же так грустно ? Потому что задача в общем виде не решаема  Разве что написать volatile asm - вставку, которая будет копировать Cnt_D1 во временную переменную. А нужен ли в этом проекте вообще ассемблер и регистровая переменная? А хотя... зачем в асм-вставке копировать во временную переменную? Достаточно указать компилятору, что в этой вставке Cnt_D1 может измениться! Попробуйте так: CODE while (1) { if (Cnt_Dl==0) { BufLed=pgm_read_byte (Ptabl); // ЗАГРУЗКА НОВОГО ЗНАЧЕНИЯ ТОНА Ptabl++; Cnt_Dl=1000; } asm volatile("" : "+r" (Cnt_Dl)); } Даже наверное не так. Нам ведь надо, чтобы компилятор знал об этом перед проверкой. Значит и вставку надо поместить перед проверкой: CODE while (1) { asm volatile("" : "+r" (Cnt_Dl)); if (Cnt_Dl==0) { BufLed=pgm_read_byte (Ptabl); // ЗАГРУЗКА НОВОГО ЗНАЧЕНИЯ ТОНА Ptabl++; Cnt_Dl=1000; } }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|