WinAvr в вопросах и ответах
volatile не пробовали делать?
В поисках истины человек развивается.
- Реклама
да дело, думаю, не в volatile - он же кричит, что срывается прерывание по уарту - значит, плюнуть на библиотеку, принимать в озу, а, когда есть возможность и гарантированное время для записи - писать.
Алгоритм менять надо, а не ножки у кроватей пилить....
Алгоритм менять надо, а не ножки у кроватей пилить....
Все глобальные переменные объявлены с volatile (в посте это указано):vitalik_1984 писал(а):volatile не пробовали делать?
volatile uint8_t fCmdComplite = 0;
volatile UCHAR BufAdc1[281] __attribute__ ((section (".xdata")));
В общем то проблема решена:
Для тех кто наступит на те же грабли:
наплюйте на настройки WinAVR через оболочку (Project/Configeration Options)
просто пользуйтесь внешним Makefile с правками по рекомендации:
http://www.avrfreaks.net/index.php?name ... inavr+xram
при этом на размер сектора Data можно не обращать внимания он как бы переполнен относительно внутреннего RAM
Data: 7570 bytes (184.8% Full)
(.data + .bss + .noinit)
... но осадок остался
в этом варианте SRAM + XRAM фактически единое пространство (сегмент)
и указанные массивы плавно переходят при размещении через границу 4К SRAM
Пока так и не понял как вынести массивы в отдельный сегмент и разместить их гарантированно в XRAM.
Описанный двумя постами выше вариант размещает их в нужной области но портит кучу (если я правильно понял).
Копать дальше и учить матчасть нет времени, если кто разберется или знает как решить этот вопрос,
буду благодарен за любые посказки.
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
Ребят, компилятор ругатеся на такой вот текс, atmega 128, не могу понять в чем дело!
ldi temp, (1<<UCSZ01)|(1<<UCSZ00)
out UCSR0C,temp
ldi temp, (1<<UCSZ01)|(1<<UCSZ00)
out UCSR0C,temp
полный текст пожалуйста... у вас возможно не подключен заголовочный файл микроконтроллера типа
.include "mega128.inc"
.include "mega128.inc"
В поисках истины человек развивается.
- Реклама
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
нет подключен, видимо эти команды не работают в том адресном пространсвте, где установлен этот регистрvitalik_1984 писал(а):полный текст пожалуйста... у вас возможно не подключен заголовочный файл микроконтроллера типа
.include "mega128.inc"
- Вложения
-
- ShagDvig.asm
- (9.24 КБ) 347 скачиваний
1. reti убрать - заменить на .org adress . Адрес взять в файле m128def.inc
2. out где это необходимо заменить на sts - можно узнать из DS - адресное пространство регистров ввода/вывода
2. out где это необходимо заменить на sts - можно узнать из DS - адресное пространство регистров ввода/вывода
- Сообщения: 172
- Зарегистрирован: Пн мар 19, 2012 13:04:11
А вы не могли бы мне написать эту строчку? Я просто не писал на асм до этого, слабо разбираюсь.ILYAUL писал(а):1. reti убрать - заменить на .org adress . Адрес взять в файле m128def.inc
2. out где это необходимо заменить на sts - можно узнать из DS - адресное пространство регистров ввода/вывода
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
.. еще лучше вставить в начало программы макрос и забыть про эту "головную боль"ILYAUL писал(а):2. out где это необходимо заменить на sts - можно узнать из DS - адресное пространство регистров ввода/вывода
Код: Выделить всё
.macro outi
ldi r16,@1
.if(@0 > 0x3F)
sts @0,r16
.else
out @0,r16
.endif
.endm- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Доброго времени суток. При изучении программ встречается ключевое слово auto,за что отвечает это слово объясните. Спасибо.
Пример приведите
я сам могу написать
я сам могу написать
Код: Выделить всё
int auto(char x);
В поисках истины человек развивается.
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
А, что без примера ни как,дело в том что изучаю на другом компе,и в другом месте. Мме хотябы в общих чертах.
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
vitalik_1984 - где вы это можете написать, на заборе?
TICLIR - смотря какие программы вы изучаете. Изначально auto определял расположение переменной на стеке в отношении к МК вроде как никакой смысловой нагрузки не несет, в новом с++ это автоматический выбор типа переменной. Примеров/описаний на просторах интернета более чем достаточно.
TICLIR - смотря какие программы вы изучаете. Изначально auto определял расположение переменной на стеке в отношении к МК вроде как никакой смысловой нагрузки не несет, в новом с++ это автоматический выбор типа переменной. Примеров/описаний на просторах интернета более чем достаточно.
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Спасибо, я думаю мне больше и не надо.Совесть писал(а):
TICLIR - смотря какие программы вы изучаете. Изначально auto определял расположение переменной на стеке в отношении к МК вроде как никакой смысловой нагрузки не несет, в новом с++ это автоматический выбор типа переменной. Примеров/описаний на просторах интернета более чем достаточно.
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Бывает так что, программа не всегда заходит в функцию. Считает, если ни чего не изменилось то и заходить туда не надо. А вот можно указать компилятору что заходить туда надо всегда при вызове функции, как нибудь при помощи ASM включения.
волшебное слово volatile в нужном месте должно решить проблему переменные, про которые компилятор думает, что не меняются( хотя это не так) нужно объявлять с модификатором volatile.
Пример: в прерывании меняется переменная, в основном цикле читается.В обычном виде процесс чтения может упроститься компилятором до приравнивания константе.Добавили модификатор- уже чтение переменной и работа нормальная.
Ну это в упрощенном виде, может оно в реальности не совсем так выглядит.
Вообще неплохо было бы взглянуть на вашу функцию, чтобы точнее сказать, в этом ли дело или все же лучше переписать на более понятный для машины вариант.
Пример: в прерывании меняется переменная, в основном цикле читается.В обычном виде процесс чтения может упроститься компилятором до приравнивания константе.Добавили модификатор- уже чтение переменной и работа нормальная.
Ну это в упрощенном виде, может оно в реальности не совсем так выглядит.
Вообще неплохо было бы взглянуть на вашу функцию, чтобы точнее сказать, в этом ли дело или все же лучше переписать на более понятный для машины вариант.
В поисках истины человек развивается.
Кто-нибудь сталкивался с таким вопросом:
(WinAVR, AVRstudio 4.19)
Требуется загрузчик для Mega128, сам загрузчик написан и работает когда его размещаешь в нижней области как обычную программу (естественно работает в этом случае все кроме самих функций загрузки, но это не важно, главное отрабатываются прерывания и сам основной цикл).
Однако стоит загрузить его по адресу 1F000, как ничего не работает (нет прерываний и сам основной цикл не крутится)
(fuse BOOTRST=0, BOOTSZ0=0, BOOTSZ1=0, т.е. вектор прерываний смещен и boot равен 4096).
Собственно вопрос похоже сводится к тому, что для boot сектора hex должен быть оформлен както по другому что-ли. Сравнил то что получается в WinAVR с подобным своим проектом под ImageCraft - hex файлы разные (адреса после ICC смещены на 1F000).
Но в ICC все просто - перед компиляцией выбирается опция "проект как boot-сектор" и все.
А как в WinAVR указать это?
З.Ы.
В майкфайле ввел:
BOOTLOADER_ADDRESS = 0x1F000
BOOTSIZE=4096
LDFLAGS += -Wl,--section-start=.bootloader=$(BOOTLOADER_ADDRESS)
- не помогает, в hex все равно адреса от 0
(WinAVR, AVRstudio 4.19)
Требуется загрузчик для Mega128, сам загрузчик написан и работает когда его размещаешь в нижней области как обычную программу (естественно работает в этом случае все кроме самих функций загрузки, но это не важно, главное отрабатываются прерывания и сам основной цикл).
Однако стоит загрузить его по адресу 1F000, как ничего не работает (нет прерываний и сам основной цикл не крутится)
(fuse BOOTRST=0, BOOTSZ0=0, BOOTSZ1=0, т.е. вектор прерываний смещен и boot равен 4096).
Собственно вопрос похоже сводится к тому, что для boot сектора hex должен быть оформлен както по другому что-ли. Сравнил то что получается в WinAVR с подобным своим проектом под ImageCraft - hex файлы разные (адреса после ICC смещены на 1F000).
Но в ICC все просто - перед компиляцией выбирается опция "проект как boot-сектор" и все.
А как в WinAVR указать это?
З.Ы.
В майкфайле ввел:
BOOTLOADER_ADDRESS = 0x1F000
BOOTSIZE=4096
LDFLAGS += -Wl,--section-start=.bootloader=$(BOOTLOADER_ADDRESS)
- не помогает, в hex все равно адреса от 0
ЗАРАБОТАЛО!!!
Достаточно было указать:
BOOTLOADER_ADDRESS = 0x1E000
LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS)
ну и не забыть выставить IVSEL = 1
Достаточно было указать:
BOOTLOADER_ADDRESS = 0x1E000
LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS)
ну и не забыть выставить IVSEL = 1
Помогите разобраться с WinAvr чайнику. Не компилируется прошивка:
C:\screenkeys/screenkeytest.c:13: undefined reference to `sk_set_color'
C:\screenkeys/screenkeytest.c:14: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:15: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:16: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:33: undefined reference to `sk_set_pixels'
C:\screenkeys/screenkeytest.c:34: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:35: undefined reference to `sk_set_color'
C:\screenkeys/screenkeytest.c:40: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:41: undefined reference to `sk_clear_text'
C:\screenkeys/screenkeytest.c:42: undefined reference to `sk_set_color'
Все понятно ругается на незадефайненые переменные, но дело в том, что они объявлены в хидере, который, в свою очередь, подключен с помощью include.
Прошивка взята с avrfreaks. Winavr самый свежий.
Спойлер
C:\screenkeys/screenkeytest.c:12: undefined reference to `sk_init'C:\screenkeys/screenkeytest.c:13: undefined reference to `sk_set_color'
C:\screenkeys/screenkeytest.c:14: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:15: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:16: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:33: undefined reference to `sk_set_pixels'
C:\screenkeys/screenkeytest.c:34: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:35: undefined reference to `sk_set_color'
C:\screenkeys/screenkeytest.c:40: undefined reference to `sk_set_text'
C:\screenkeys/screenkeytest.c:41: undefined reference to `sk_clear_text'
C:\screenkeys/screenkeytest.c:42: undefined reference to `sk_set_color'
Прошивка взята с avrfreaks. Winavr самый свежий.
- Вложения
-
- screenkey.rar
- Исходник
- (3.16 КБ) 189 скачиваний
а где конкретно объявление самого тело этих функций?
вижу объявлены прототипы, да еще и с модификатором extern, а сами то действия где прописаны?
если не в курсе,есть три этапа использования функции.
1 прототип, указывается какие типы данных используют в данной функции.
2 объявление тела функции,указывается что нужно делать с этими данными и что будет результатом.
3 само использование.
причем пока не используется следующий этап первых как бы и не существует.
в большинстве случаев первые два этапа совмещаются.
а у вас получается второй этап пропущен вот вам и проблема.
компилятор просто не знает что с этими данными делать нужно.
вижу объявлены прототипы, да еще и с модификатором extern, а сами то действия где прописаны?
если не в курсе,есть три этапа использования функции.
1 прототип, указывается какие типы данных используют в данной функции.
2 объявление тела функции,указывается что нужно делать с этими данными и что будет результатом.
3 само использование.
причем пока не используется следующий этап первых как бы и не существует.
в большинстве случаев первые два этапа совмещаются.
а у вас получается второй этап пропущен вот вам и проблема.
компилятор просто не знает что с этими данными делать нужно.
В поисках истины человек развивается.


