Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
1

AVR ассемблер. объявление массива .db Atmel Studio 7, ошибка компиляции?

14.04.2018, 18:49. Показов 2571. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся со странной проблемой.
Написал код для дисплея.

код рабочий такой:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.CSEG
;
;таблица прерываний
;расписана согласно
;контроллеру
;
.ORG INT_VECTORS_SIZE
 
Main:
;
;
;некий
;код
;
;Посередине кода объявлены данные
wind: .dw \
1,1,320,240,3,0x03E0,0xFFFF,\
11,11,30,20,2,0x001F,0xF800,\
60,60,30,20,2,0x03E0,0xF800,\
110,110,30,20,2,0x001F,0x03E0,\
160,160,30,20,2,0xF8E6,0xF81F,\  ;<- 1 или 2й байт с конца когда прописываю 0xF7E6 или 0xF4E6, девайс ловит глюк
260,50,30,20,2,0x001F,0xF8E6,\
0 ;означает конец таблицы
;
;
;
;дальнейший код
;
;
;
;
rjmp Main
при компиляции ошибок не выдает, но если я меняю байт данных как указано в коде,
рабочий девайс - mega2560+ экран (ili9341) ловит глюк, зависает на экран ничего не выдает.
это возникает только если поменять указанные байты.

Сначала я думал что мой код творит какую нибудь глупость, и поставил в нужном месте задержку, чтобы увидеть в живую, как
на экране как произойдет слет, так как до указанной строчки данных программа доходит с реальной задержкой, и это можно увидеть. Но я увидел что программа вовсе не запускается в таком случае. значит это не моя программа спотыкается.
И тут я представил, что видимо компилятор что то путает и мои данные пересекаются с кодом программа (затирают её).
Проверил еще раз.
метка .ORG одна как указана выше. Компилятор просто должен по порядку все уложить и все. Такого бага быть не должно.
Для проверки своей догадки я переместил данные в конец программ,
указав адрес размещения

.ORG 0xF000

и.... все заработало не зависимо от данных которые я пишу в эти данные!!!!

тогда я вернул все как было с глюком чтобы в дезассемблере посмотреть
что там накомпилила Atmel Studio.
И увидел следующее:

вот кусок флеша с моими данными:
prog 0x00021A 01 00 01 00 40 01 f0 00 03 00 e0 03 ff ff ....@.р...а.яя
prog 0x000228 0b 00 0b 00 1e 00 14 00 02 00 1f 00 00 f8 .............ш
prog 0x000236 3c 00 3c 00 1e 00 14 00 02 00 e0 03 00 f8 <.<.......а..ш
prog 0x000244 6e 00 6e 00 1e 00 14 00 02 00 1f 00 e0 03 n.n.........а.
prog 0x000252 a0 00 a0 00 1e 00 14 00 02 00 e6 f8 1f f8 *.*.......жш.ш
prog 0x000260 04 01 32 00 1e 00 14 00 02 00 1f 00 e6 f8 ..2.........жш
prog 0x00026E 00 00 80 c0 ea e1 f2 e0 25 90 35 90 22 20 ..ЂАкбта%ђ5ђ" <-- виден 00 00 тот что в конце моей таблицы

а вот дизассемблер c концом данных и дальнейшим кодом:

64: 260,50,30,20,2,0x001F,0xF8E6,\
00000134 ??? Memory out of bounds or read error
00000135 ??? Memory out of bounds or read error
64: 260,50,30,20,2,0x001F,0xF8E6,\
00000136 ??? Memory out of bounds or read error
65: 0 ;означает конец таблицы
00000137 ??? Memory out of bounds or read error
68: rjmp after_winds
00000138 ??? Memory out of bounds or read error
71: LDI ZL,low(wind<<1)
00000139 ??? Memory out of bounds or read error
72: LDI ZH,high(wind<<1)
0000013A ??? Memory out of bounds or read error
74: LPM pxl,Z+ ; L px
0000013B LPM R2,Z+ Load program memory and postincrement
75: LPM pxh,Z+ ; H px
0000013C LPM R3,Z+ Load program memory and postincrement
76: TST pxl ;pxl=0 ? проверка не конец ли таблицы?
0000013D TST R2 Test for Zero or Minus
77: BRNE go_pass
0000013E BRNE PC+0x04 Branch if not equal

Я правильно понимаю, что в строках 68-72 должны уже быть инструкции процессора
а там какой то "Memory out of bounds or read error"

Что это, компилятор накосячил? и если да, то почему такое произошло, и как этого избежать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2018, 18:49
Ответы с готовыми решениями:

AVR ассемблер. объявление массива .db в макросе .macro не работает!? Atmel Studio 7
.CSEG ;разумеется .macro lcd_pr .if @0==6 ; .org 0x11ff - и так пытался dat: .db...

Ассемблер для микроконтроллеров Atmel AVR
Всем приветы, люди кто может помочь с написанием программки на ассемблере для микроконтроллеров...

Ошибка компиляции (AVR Studio, ATMega8515)
Ребята сегодня впервые проходим avr вот теперь не могу запустить на avr studio программу пишет...

Ошибка при компиляции AVR Studio 4 & WinAVR
Сваял Hello World: // ok #include &lt;util/delay.h&gt; #include &lt;avr/iotn13.h&gt; void main(viod) {...

15
Тутошний я
2146 / 1201 / 225
Регистрация: 03.11.2009
Сообщений: 4,416
Записей в блоге: 2
15.04.2018, 13:55 2
Данные размещают после программы, после подпрограмм.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
15.04.2018, 14:18 3
Это не обязательно. Можно перемешивать данные и код как угодно. Ассемблер, он такой ассемблер. Главное чтобы управление не выкатывалось на данные.

HerrSchneider, Вот я не пользую Atmel Studio, только ассемблер командной строки. Но из моего опыта сначала откомпилировать, а потом дизассемблировать обратно это как-то дико неправильно. Atmel Studio наверняка вызывает ассемблер командной строки и она просто графическая оболочка вокруг этого ассемблера. Так вот заставь свой ассемблер создать файл листинга. Или указав что-то Atmel Studio или вручную компилируя ассемблером командной строки, который умеет это делать. Создай файл листинга и туда смотри. Там однозначно видно ЧТО накомпилировал ассемблер. И видно правильно это или не правильно. Можешь и нам показать этот файл листинга.
Я вот всегда создаю файл листинга при ассемблировании и сразу смотрю туда - верно ли накомпилировалось то, что я имел ввиду или что-то не так и я ошибся или даже может ассемблер начудил (заметил у AVR-ассемблера парочку багов). И если вижу, что в листинге все чики-пики, то уверен, что действительно чики-пики. Я программу отлаживаю даже больше глядя в листинг, чем в исходник. И тебе советую туда посматривать.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
15.04.2018, 14:25 4
Цитата Сообщение от Ethereal Посмотреть сообщение
Можно перемешивать данные и код как угодно.
можно, но нужно ли?
по крайней мере должны быть явные переходы(в основном безусловные), которые обходят блок данных, а у ТС я их не заметил
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
15.04.2018, 14:30 5
Добавлено через 28 секунд
Ну так я так и сказал
Цитата Сообщение от Ethereal Посмотреть сообщение
Главное чтобы управление не выкатывалось на данные.
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
можно, но нужно ли?
Когда приходилось ногами уминать функциональность в тощий чип было нужно. То есть иногда даже и приходится.
0
Тутошний я
2146 / 1201 / 225
Регистрация: 03.11.2009
Сообщений: 4,416
Записей в блоге: 2
15.04.2018, 14:51 6
Можно перемешивать данные и код как угодно.
За программой, между программой и/или подпрограммами.
Но не внутри кода.
Переходы добавляют кода, занимают стек.
0
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
15.04.2018, 20:07  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
по крайней мере должны быть явные переходы(в основном безусловные), которые обходят блок данных, а у ТС я их не заметил
ха ха вот я олух. Весь код то я вам не показал, а когда я писал этот топик у меня эти данные аккурат после
Main: были вставлены. и, конечно, программный счетчик по этим данным пробегал как по инструкциям после загрузки в первую очередь. Как только его не колбасило раньше, ведь работал же девайс!

Добавлено через 7 минут
ааа. да на моем примере это и видно, сразу после Main: данные идут.
в общем Решено. сам дурак...
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
15.04.2018, 21:53 8
А, ну хорошо, что у ТС-а проблема решена.
Цитата Сообщение от Grey Посмотреть сообщение
За программой, между программой и/или подпрограммами.
Но не внутри кода.
Тут у меня сразу включилось дежавю. Задумался когда-же мне приходилось втыкать данные так, чтобы исполнение прокатывалось по ним, как по коду. Ведь вроде бы приходилось. И вспомнил.
Цитата Сообщение от Ethereal Посмотреть сообщение
Оказалось, что словная таблица преобразования с
данными 1 2 4 8 10 20 40 80 трактуется Лампанелью как нуль-операции,
поэтому ее можно поместить в самое начало программы и начать исполнение
программы именно с нее. Зато в результате смещение в таблице оказывается
адресом в ней и выпадает команда сложения адреса и смещения.
Вот здесь : Игра Конвея Жизнь на Лампанели Но это был действительно чумовой случай
Там даже комментарии стоят
;NOP Проедемся по данным, как по коду
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
16.04.2018, 07:54 9
Цитата Сообщение от Ethereal Посмотреть сообщение
Вот здесь : Игра Конвея Жизнь на Лампанели
Assembler: i8080/8085/KP580
ты фонНемановскую архитектуру и гарвардскую не путай
для одной данные и команды одна суть, у другой разные вещи
посему, совет для ТС, данные правильней хранитьв предназначенном для них месте- EEEPROM
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,879
16.04.2018, 08:05 10
EEPROM предназначена для изменяющихся данных, а для констант лучше подходит flash. К тому же она больше.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
16.04.2018, 08:18 11
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
EEPROM предназначена для изменяющихся данных
или не изменяющихся EEPROM память данных
flash память команд
это плюс гарвардской архитектуры данные и команды разделены
кто их совмещает делает на свой страх и риск
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
16.04.2018, 11:37 12
Цитата Сообщение от ValeryS Посмотреть сообщение
ты фонНемановскую архитектуру и гарвардскую не путай
Гарвард-то он конечно гарвард, но когда в программе для AVR нужен большой объем констант (аж в EEPROM не влезут), то приходится помещать их во флеш с доступом к ним через команду lpm. И AVR-а сразу офоннейманивается - данные и код оказываются в одном месте, во флеш. Причем это-то уже никакое не трюкачество, это со всех сторон приличное решение и такое приходится делать довольно часто.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
кто их совмещает делает на свой страх и риск
А мы не боимся
1
Тутошний я
2146 / 1201 / 225
Регистрация: 03.11.2009
Сообщений: 4,416
Записей в блоге: 2
16.04.2018, 12:02 13
Я тоже во флеш записывал данные. Но между подпрограммами, а не внутрь кода.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
16.04.2018, 12:06 14
Просто ТС ошибся, но можно ведь понимать, что делаешь и не ошибаться.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
16.04.2018, 13:19 15
Цитата Сообщение от Ethereal Посмотреть сообщение
И AVR-а сразу офоннейманивается
так чистого гарварда я и не видел
вот например STM гарвард, а единое адресное пространство, вот тебе и фонНеман
Цитата Сообщение от Ethereal Посмотреть сообщение
А мы не боимся
так боятся не надо а опасаться стоит
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,879
16.04.2018, 22:27 16
Цитата Сообщение от ValeryS Посмотреть сообщение
так чистого гарварда я и не видел
младшие PIC'и (PIC16F84 например) вроде. У них нет команд считывания данных из флеша, вместо этого используются процедуры, возвращающие нужное значение.
Цитата Сообщение от ValeryS Посмотреть сообщение
или не изменяющихся EEPROM память данных
Вспомните сколько времени занимает чтение из EEPROM. Потому что из flash всего 3 такта.
0
16.04.2018, 22:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2018, 22:27
Помогаю со студенческими работами здесь

Atmel studio outlining (ассемблер)
в визуал студии есть вот такая замечательная штука. Как и в Атмел студии. но! почему то в файл...

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

AVR Simulator в Atmel Studio 6.0
Всем привет! Пишу простейшую программу для мигания LED для МК AT32UC3A1256 на языке С в Atmel...

Atmel Studio 6.0: Новичёк в AVR
Всем привет. Скачал и установил Atmel Studyo 6.0. Хочу разобраться с работой программы. Может мне...

AVR Studio 4.18 b и Atmel Software Framework 3.33
Доброго дня всем. Сейчас ковыряю от скуки ATxmega128A1... Пользуюсь AVR Studyo 4.18 и GNU AVR...

Вычисления с дробями на AVR (Atmel Studio)
Друзья , есть функция вида y = exp(x/218) + 0.05x . Использую МК Atmega, atmel studio,...

Atmel Studio 7 AVR и прерывания по умолчанию
Установил я Atmel Studyo 7 и обнаружил следующие, если прерывание объявленно, а обработка прервыная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru