реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> WinAVR: Cовмещение Си и ассемблера
demiurg_spb
сообщение Feb 13 2012, 05:19
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(MaxiMuz @ Feb 12 2012, 21:03) *
А как быть если нужна 16ти битовая регистровая переменная ?

http://www.avrfreaks.net/index.php?name=PN...415&start=0


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 13 2012, 13:58
Сообщение #17


Познающий...
******

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



QUOTE (ReAl @ Feb 12 2012, 19:16) *
Я давно в makefile проекта перестал вписывать отдельные файлы. Вписываю каталоги (модули).

Мне понравился Ваш подход! Я сам не очень хорошо с Makefile знаком. Будет время, попробую таким же образом организовать.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Feb 13 2012, 19:01
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Спасибо за упоминание про Makefile. Только что пытался понять почему перестала работать программа когда я процедуры работы с железом и периферией вынес в отдельный файл для облегчения портирования на другие МК. Все нужные инклюды прописал, файл в Source добавил, компилятор не выдает ни ошибок ни предупреждений - а работавший проект перестал работать rolleyes.gif Полчаса недоумевал, пока не вспомнил что не дописал новый файл явно в Makefile, прописал вручную - все работает sm.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 14 2012, 02:12
Сообщение #19


Познающий...
******

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



QUOTE (_Ivana @ Feb 14 2012, 03:01) *
прописал вручную - все работает sm.gif

Ну вот ,выходит, что makefile всякие нужны, makefile всякие важны rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 14 2012, 11:05
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 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 путь к файлу не указывается и тем неменее сборка работает !..
Почему ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 14 2012, 11:39
Сообщение #21


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



потому что по умолчанию всё берётся из текущего каталога ./


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 14 2012, 11:44
Сообщение #22


Местный
***

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



Цитата(demiurg_spb @ Feb 14 2012, 14:39) *
потому что по умолчанию всё берётся из текущего каталога ./
А где это задается ?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 14 2012, 11:46
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Что задаётся?
Чтобы искалось в других каталогах?
Изучайте мануал на Make
hint: VPATH, addprefix, notdir ... и т.д. и т.п.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 14 2012, 11:50
Сообщение #24


Местный
***

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



Цитата(haker_fox @ Feb 12 2012, 09:05) *
Это как? rolleyes.gif
Насколько я знаю, такое не возможно. У Вас файлы могут лежать в любом месте файловой системы, включая сетевые диски...
Это ответ на мое предположение что все пути по умолчанию берутся из текущей дериктории... и что я к Си-шному файлу путь не указываю ...

Цитата(demiurg_spb @ Feb 14 2012, 14:46) *
Что задаётся?

что искалось в текущем каталоге или в других ... вообще каким образом задается место откуда должны браться исходные файлы ?

Сообщение отредактировал MaxiMuz - Feb 14 2012, 11:48
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 14 2012, 16:45
Сообщение #25


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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



--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Feb 15 2012, 00:49
Сообщение #26


Познающий...
******

Группа: Свой
Сообщений: 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 показал, как это автоматизировать. Предлагаю Вам сделать выбор. Ну и поэксперементировать с обращением к файлам. Не обязательно исходникам, можно потренироваться в консоле в ручную вызвать программу из какого-нибудь созданного каталога....

Успехов!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 15 2012, 17:58
Сообщение #27


Местный
***

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



Всем спасибо за разьяснение в особенности haker_fox sm.gif
Возникла другая проблема! При совмещении асм-кода и Си компилятор "заоптимизировал" почти весь алгоритм Си программы, а именно:
вечный цикл
Код
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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 15 2012, 20:42
Сообщение #28


Гуру
******

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



QUOTE (MaxiMuz @ Feb 15 2012, 19:58) *
В чем может быть дело ?
В отсутствии volatile у Cnt_D1. Но у gcc проблема с volatile для регистровых переменных.

"Побрейтесь". sad.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Feb 16 2012, 08:20
Сообщение #29


Местный
***

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



Цитата(Сергей Борщ @ Feb 15 2012, 23:42) *
"Побрейтесь". sad.gif

почему же так грустно ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 16 2012, 09:31
Сообщение #30


Гуру
******

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



QUOTE (MaxiMuz @ Feb 16 2012, 10:20) *
почему же так грустно ?
Потому что задача в общем виде не решаема sad.gif Разве что написать 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)
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016