LINUX.ORG.RU
ФорумTalks

А как Вы работаете с AVR ?

 , ,


0

2

Вопрос возможно странный но вот в linux с этим не все так радужно, ну не знаю Arduino я не трогаю по заветам ncrmnt, использовать AVRA (AVR Assembler), тоже не хочется ибо проект давно не развивается да и зачем когда есть GNU As....

Далее возникают проблемы с отладкой, я понимаю что JTAG отладка на реальном железе это наверное здорово(а по мне так просто оправдание что симулятор не очень работает), но таскать с собой кучу железок ой как не хочется.

Есть два проекта эмуляции работы AVR-ок это simulavr и simavr, про второй ничего не скажу, а вот simulavr замечательно описан на wiki и в разделе features прям пальчики оближешь , только беда в том что это не работает ,а TCL код который там эмулировал подключенный дисплей и прочее, просто перестали поддерживать так как чувак который знал TCL забил на проект, в документации скудно с примерами.

Возможно автоматический тест на python(который не включен по умолчанию) и можно написать... но вот с удаленной отладкой не все так здорово.

Вопрос Как вызвать прерывание при удаленной отладке через GDB???

#include <avr/io.h>
#include <avr/interrupt.h>	
;; В примере используется обработка прерываний, нажатие INT0(stop)
;; #include <compat/deprecated.h>

#define SFR(X) _SFR_IO_ADDR(X)	;Обращение к регистрам ввода вывода только через это
;; И оно не сработало пришлось вручную все заменить.... непонятно
;; Нужен ручной препроцессор здесь он не справляется т.е дополнительный .h файл
#define reg_led r20		
#define temp r16		
#define START 0
	.section .text
	.global  main

;;###############Основная программа
main:	ldi	reg_led,0xfe
	ldi	temp,pm_lo8(RAMEND) 	;RAMEnd константа окончания RAM памяти
	out	_SFR_IO_ADDR(SPL),temp
	ldi	temp,pm_hi8(RAMEND)	;
	out	_SFR_IO_ADDR(SPH),temp
	sec
	set
	ser	temp
	out	_SFR_IO_ADDR(DDRB),temp
	out	_SFR_IO_ADDR(PORTB),temp
	clr	temp
	out	_SFR_IO_ADDR(DDRD),temp
	ldi	temp,0x05
	out	_SFR_IO_ADDR(PORTD),temp
	ldi	temp,0x40			;Установка битов INT1, INT0 или INT2 разрешает прерывания 
						;0100 0000
	/*
	Условия генерации прерываний устанавливаются с помощью 	конфигурационных регистров.
	Для INT0, INT1 – это регистр MCUCR (MCU Control Register).
	Для INT2 – MCUCSR (MCU Control and Status Register)	
	*/
	
	out	_SFR_IO_ADDR(GICR),temp		;от процессора лучше это отдать макросам
	ldi	temp,0x00			;ISC01, ISC00 для INT
	out	_SFR_IO_ADDR(MCUCR),temp
	sei
waitstart:
	sbic	_SFR_IO_ADDR(PIND),START
	rjmp	waitstart
loop:	out	_SFR_IO_ADDR(PORTB),reg_led
	rcall	delay
	ser	temp
	out	_SFR_IO_ADDR(PORTB),temp
	brts	left
	sbrs	reg_led,0

	set
	ror	reg_led
	rjmp	loop

left:	sbrs	reg_led,7

	clt
	rol	reg_led
	rjmp	loop

;;###############Функция задержки
delay:	ldi	r17,250
d1:	ldi	r18,250
d2:	dec	r18
	brne	d2
	dec	r17
	brne	d1
	ret


	.global INT0_vect 	;Название взято отсюда
	;; www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
;;###############Обработка прерывания INT0
INT0_vect:
waitstart2:
	sbic	_SFR_IO_ADDR(PIND),START
	rjmp	waitstart2
	reti
	
	.end

AVRFreaks не предлагать, bugtracker не предлагать, я там уже был и патч слал.

★★★★★

как-как, заливаю прошивку, включаю девайс, смотрю - работает или нет, если нет, втыкаю в код, ищу баги, повторяю до достижения результата

Harald ★★★★★ ()

мужики отлаживают светодиодом (можно двумя) и UART'ом. все остальное - для баб.

dib2 ★★★★★ ()

когда есть GNU As

Как людей от него не выворачивает после tasm-подобного синтаксиса? Кошмар же.

yu-boot ★★ ()
Ответ на: комментарий от Harald

Ну так то все работает и код работает... Atmega16 если что

DR_SL ★★★★★ ()
Ответ на: комментарий от DR_SL

У меня привычки к tasm не было)))

tasm — наше всё.

KRoN73 ★★★★★ ()
Ответ на: комментарий от yu-boot

так для avr там родной синтаксис же используется. или я что-то путаю?

Dark_SavanT ★★★★★ ()

Насколько помню, софтово INTX прерывание можно дернуть если софтово поменять состояние ноги, этот трюк юзают в частности в vusb.

ncrmnt ★★★★★ ()
Ответ на: комментарий от DR_SL

я на симуляторе никогда не работал, только реальное железо, только хардкор (tm).

ncrmnt ★★★★★ ()

Если не получается на симуляторе simulavr сделать, то что же это за симулятор за такой, который не умеет?

Если исходить из ситуации, которая сложилась (симулятор не умеет или не хочет симулить):

1. С чего начать изучение электроники (комментарий)

2. Вызвать обработчик напрямую из GDB. См. команды gdb.

3. Взять simavr. Там все работает. Если хотя бы скомпилируешь и установишь хидеры и библиотеку, то могу попробовать код тебе набить.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Если не получается на симуляторе simulavr сделать, то что же это за симулятор за такой, который не умеет?

Но ведь кто-то же использует ,просто не могу найти этих людей. По крайне мере примеры на питоне работают но они не интерактивный.

2. Вызвать обработчик напрямую из GDB. См. команды gdb.

Я не знаю , как пробовал signal INT0_vec

3. Взять simavr. Там все работает. Если хотя бы скомпилируешь и установишь хидеры и библиотеку, то могу попробовать код тебе набить.

Мне нужно запустить эмулятор загрузить в него прошивку и отладить... мне не нужен юнит тест или ещё чего... просто пошаговая отладка с переключением пинов и вызовом прерываний...

DR_SL ★★★★★ ()
Последнее исправление: DR_SL (всего исправлений: 1)
Ответ на: комментарий от DR_SL

Мне нужно запустить эмулятор загрузить в него прошивку и отладить... мне не нужен юнит тест или ещё чего... просто пошаговая отладка с переключением пинов и вызовом прерываний...

Вы все очень странно себе представляете, что может симулятор. Я даже удивлен. Причем тут юнит-тест? Очень просто пишется код, который интерактивно позволяет тебе дернуть пин из симулятора в тот момент, когда ты хочешь. По кнопке на клаве и даже визуально, елси ну очень хочется.

Я еще раз упорно не понимаю, причем тут юнит-тесты.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от DR_SL

Я не знаю , как пробовал signal INT0_vec

Уф, сейчас с твоим исходником попытаюсь. Соберу его сначала.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Вопрос в том насколько он универсален, не придется ли писать новый код если я захочу дернуть другой пин?

Объясню: В примерах Python интерфейса создавались тесты под конкретные программы т.е. надо загрузить программу some.elf изменить значение на пине, посмотреть значения на другом порту и все. Там не было выхода на внешний gdb-клиент и приема команд от gdb

DR_SL ★★★★★ ()
Последнее исправление: DR_SL (всего исправлений: 1)
Ответ на: комментарий от DR_SL

2. Вызвать обработчик напрямую из GDB. См. команды gdb.

Я не знаю , как пробовал signal INT0_vec

Короче, если ты посмотришь objdump, то увидишь, что все твои обработчики прерывания будут иметь названия __vector_N, где N - это номер прерывания.

Попробуй дернуть из GDB call __vector_1.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Попробуй дернуть из GDB call __vector_1

(gdb) signal _vector_1
No symbol "_vector_1" in current context.
(gdb) call _vector_1
No symbol "_vector_1" in current context.
DR_SL ★★★★★ ()
Ответ на: комментарий от DR_SL

Объясню: В примерах Python интерфейса создавались тесты под конкретные программы т.е. надо загрузить программу some.elf изменить значение на пине, посмотреть значения на другом порту и все. Там не было выхода на внешний gdb-клиент и приема команд от gdb

А-а-а, понятно. А simavr можно без проблем сделать. Но только выходя на скриптовый язык нет. Пишешь код на Си и в иницализации делаешь:

    avr->gdb_port = 1234;
    if (gdb) {
	avr->state = cpu_Stopped;
	avr_gdb_init(avr);
    }

Флаг gdb будет не ноль, если ты симулятор с опцией "-g" запускаешь. Тогда твой симулятор (твоего устройства) повисает на localhost:1234 и ждет avr-gdb. Можно работать с симулятором твоего устройства в режиме отладки.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

ну в общем вызываю

(gdb) call __vector_1
$1 = {<text variable, no debug info>} 0x8000be

дальше пробую step или и ничего breakpoint кстати стоит внутри прирывания

DR_SL ★★★★★ ()

Писать на ассемблере в 2013 году при наличии компилятора C и даже C++ для целевой платформы это, мягко говоря, извращение.

Artificial_Thought ★★★★ ()
Ответ на: комментарий от Artificial_Thought

Писать на ассемблере в 2013 году при наличии компилятора C и даже C++ для целевой платформы это, мягко говоря, извращение.

Во первых учусь, во вторых микроконтроллер и относительно небольшой.... в третьих хочется почувствовать дух старины....

(я ещё кучу оправданий найду)))

DR_SL ★★★★★ ()
Ответ на: комментарий от DR_SL

дальше пробую step или и ничего breakpoint кстати стоит внутри прирывания

Обработчик он, скорее всего, вызвал (проверь, кстати), но остановиться там не дал. Выполнил его просто до reti. Надо подумать.

Zubok ★★★★★ ()
Ответ на: комментарий от DR_SL

А у тебя вообще в breakpoints останавливается программа? Хоть в каких-нибудь? Ты с какими опциями собираешь? Дай полнее информацию.

Я тут пока с simulavr подразобрался вроде.

Zubok ★★★★★ ()

Arduino я не трогаю по заветам ncrmnt

в тред кастуется ncrmnt дабы объяснить свои заветы

разве ардуина не хороша для обычных людей?

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

Во-первых надо отличать что такое ардуйна, ибо это «все и ничерта толком», а именно: IDE, терминал на последовательный порт, набор библиотек, система сборки, и еще и отладочные платы.

IDE не выдерживает вообще никакой критики, как и терминал. Система сборки тоже примитивная: каждый раз при нажатии компайл ВСЕ пересобирается с нуля, и исключительно в один тред. Особенно заметно на ARM порте (leaflabs) на не особенно быстром нетбуке. Сами по себе либы плюсовые, что обуславливает тормоза выше, жрут очень много рома и рама, и имеют компайл-тайм настройки чуть меньше чем никакой. В самих библиотеках куча не слишком удачных абстракций, которые на 8битных аврках нахрен не нужны, и только жрут рам/ром. Да и вообще выбор плюсов тут очень странен. Сами платы ничем не примечательны, кроме явно завышенных на них цен. Обычные себе отладки на аврках. Разве что содомиты подписали выводы через одно место, и чтобы понять где какая ногда надо смотреть таблицу соответствия дурино-пинов с даташитом, что ОЧЕНЬ раздражает. Сама ардуина очень криво портируется на другие платформы, самых вкусных на рынке камней и их фичей не поддерживает, что делает ее практически не применимой для чего бы то ни было серьезного.

В общем у меня для моих проектов своя ардуина, с Makefile'ами и kconfig'ом

ncrmnt ★★★★★ ()
Ответ на: комментарий от ncrmnt

Ну и лично мне кажутся весьма странными ребята, которые плюсовый апи к железяке называют «Arduino programming language (based on Wiring)».

ncrmnt ★★★★★ ()
Ответ на: комментарий от ncrmnt

ну я так понял, ардуина - это железяка для любителей, а не для профессионалов. Зачем любителю писать всё руками, когда есть абстракции? Всякие analogRead, digitalWrite...

прикольно было бы, если бы был какой-то такой же фреймворк для чайников, работающий не только на ардуино, а вообще на всём

Помойму никто кроме 3,5 задротов этой темы не поймет. Мне уже сложно, я хотя бы кодить ПК умею. А кто не умеет, пипец, взрыв мозга. Людской массе нужно чтобы воткнул - и оно просто работало.

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

Смотри мой antares. У меня уже там avr, msp430, stm32 и 8051 есть. Но библиотечного кода пока не слишком много, так как не слишком много у меня и времени на все это.

ncrmnt ★★★★★ ()
Ответ на: комментарий от stevejobs

AVR - это наиприятнейший компьютер в миниатюре со скромными прелестями. Если осознаешь как работает компьютер в общих чертах, то никаких сложностей нету (но есть тонкости в деталях).

n_play ()
Ответ на: комментарий от Zubok

Только вернулся с Болотной

попробуй еще так call __vector_1()

Супер сработало Сейчас наш сайт не доступен , но там есть статья с описанием отладки simulavr

compile: pbutonvec.S
	avr-gcc -Xassembler -ggdb -mmcu=atmega16 pbutonvec.S -o examplevec.o
hex: compile
	avr-objcopy -O ihex examplevec.o examplevec.hex
flash: examplevec.hex
	avrdude -p m16 -c avr109 -P /dev/ttyUSB0 -U flash:w:examplevec.hex
dump: hex
	avr-objdump -d -m avr5 examplevec.o

Затем запуск simulavr -g -d atmega16, после avr-gdb

avr-gdb --annotate=3 example.o

> target remote localhost:1212
> load
> b waitstart
> continue
> set {char}0x30=0xf0
> x/xb 0x30
0x800030:    0xf0
DR_SL ★★★★★ ()
Последнее исправление: DR_SL (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Помойму никто кроме 3,5 задротов этой темы не поймет. Мне уже сложно, я хотя бы кодить ПК умею. А кто не умеет, пипец, взрыв мозга. Людской массе нужно чтобы воткнул - и оно просто работало.

А мне железки всегда больше нравились и прелести linux я понял только тогда когда у меня появился EEEPC 900 ...

Ну и потом не буду я работать в их IDE с левым языком... у меня Emacs есть)

DR_SL ★★★★★ ()
Ответ на: комментарий от n_play

проблема не в микроконтроллерах, а в перефирии. Если нет абстракции, придется курить маны по навесному оборудованию, нафиг сдалось такое счастье.

stevejobs ★★★★☆ ()

Я в протеусе тестирую, когда железа под рукой нету. Он отлично работает в wine.

f1xmAn ★★★★★ ()

Не пользовался никогда отладчиком. Ниасилил и не понял, зачем он нужен.

ramon13666 ★★★ ()
Ответ на: комментарий от Harald

как-как, заливаю прошивку, включаю девайс, смотрю - работает или нет, если нет, втыкаю в код, ищу баги, повторяю до достижения результата

Именно так и работаю.

ramon13666 ★★★ ()
Ответ на: комментарий от DR_SL

Ага, только вот это не совсем так

Имя вектора получено дизассемблированием кода 

То есть я узнал это, получив дамп, но поведение документировано:

Смотреть note [7]

http://www.nongnu.org/avr-libc/user-manual/assembler.html

Вот такая вот метка «INT0_vect:» у тебя в коде - это на самом деле макрос Си, который препроцессором преобразовывается в реальный номер вектора для твоего конкретного процессора __vector_N. Реальные номера этих векторов можно узнать в даташите по твоему МК в разделе «Interrupts» (таблица на первой же странице этого раздела).

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от DR_SL

Да, и еще добавлю насчет других способов вызвать прерывание. Вообще, они зависят от того, как работает симулятор. Могут прокатить, а могут и нет.

1. Прочитать software interrupts в даташите. Некоторые прерывания (INT0, 1..., например) можно вызвать программно. Но это не касается всех прерываний вообще. Например, если ты напрямую в регистр данных UART запишешь данные через отладчик, то симулятор может сгенерировать прерывание по приему, а может и не сгенерировать. Очень зависит от того, как он написан. Может не сработать. А вот software interrupts описаны в даташите и честный симулятор должен бы обработчик вызвать.

2. С чего начать изучение электроники (комментарий). То есть вручную в соответсвующих регистах, содержащих флаги прерываний, вручную через GDB их выставить. Но произойдет ли после этого вызов прерывания, зависит опять от того, как к поднятому флагу отнесется симулятор. Может сработать, а может не сработать.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Реальные номера этих векторов можно узнать в даташите по твоему МК в разделе «Interrupts» (таблица на первой же странице этого раздела).

Только в даташите идет нумерация с 1, а в программе макрос с нуля начинает. То есть в таблице INT0 - это 2, а в программе будет на один меньше.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Да, и еще добавлю насчет других способов вызвать прерывание. Вообще, они зависят от того, как работает симулятор. Могут прокатить, а могут и нет.

Спасибо, но я правда не знаю как там симулятор у них работает)

DR_SL ★★★★★ ()
Ответ на: комментарий от DR_SL

Спасибо, но я правда не знаю как там симулятор у них работает)

За то, что ты попробуешь, тебя на костре не сожгут. :)

Просто выставлением этих флагов и вызовом прерываний (если они разрешены) занимается симулятор. Поэтому только опытом можно проверить, вызовет ли он прерывание, если флаг выставил ты, а не он. Очень вероятно. что ничего не произойдет. А флаги событий (прерываний) у многих прерываний есть, но они по регистрам разбросаны.

И при прямом вызове прерывания из GDB через call надо иметь в виду одну мелочь, которая, возможно, не принципиальна, но о ней надо помнить: вызов прерывания отличается от вызова функции тем, что контроллер при вызове прерывания запрещает все прерывания, а когда ты выполняешь reti, то он флаг назад поднимает неявно (sei). Однако для тебя это поведение в режиме отладки никакого значения иметь не будет. Если ты хочешь вложенные прерывания, то это надо разрешать специально, принудительно выставив глобальный флаг (sei).

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

. Поэтому только опытом можно проверить, вызовет ли он прерывание, если флаг выставил ты, а не он. Очень вероятно. что ничего не произойдет. А флаги событий (прерываний) у многих прерываний есть, но они по регистрам разбросаны.

Да ничего не произошло при ручном изменение флага прерывания.

DR_SL ★★★★★ ()
Ответ на: комментарий от Zubok

Хотя у меня и стоит breakpoint он не хочет останавливаться, т.е. пролетает прерывание полностью (call а потом step), только если значение в пинД поменять обратно на ff ... он застопориться так как не будет проходить по условию sbic

DR_SL ★★★★★ ()

Arduino я не трогаю по заветам ncrmnt

почему?

q11q11 ★★★★★ ()
Ответ на: комментарий от DR_SL

Уф, я сейчас уже не смогу посмотреть. Вопросы:

1) Исходный код (сам файл) не редактировался после компиляции? То есть консистентно ли все с объектником?

2) когда условие выполняется (порт D в ff), то срабатывает брейкпоинт на jmp или на sbic?

Можно предположить, что при вызове call неправильно инициализируется pc (program counter). Попробуй расставить какие-то холостые команды перед sbic и посмотри, куда попадет и что будет, когда условие не выполнится.

Zubok ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.