Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
HerrSchneider
6 / 6 / 2
Регистрация: 08.07.2017
Сообщений: 59
1

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

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

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

код рабочий такой:
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2018, 18:49
Ответы с готовыми решениями:

Ассемблер для микроконтроллеров 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) {...

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

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

15
Grey
Тутошний я
1716 / 879 / 156
Регистрация: 03.11.2009
Сообщений: 2,712
Записей в блоге: 1
15.04.2018, 13:55 2
Данные размещают после программы, после подпрограмм.
0
Ethereal
5837 / 1993 / 263
Регистрация: 17.02.2013
Сообщений: 2,966
15.04.2018, 14:18 3
Это не обязательно. Можно перемешивать данные и код как угодно. Ассемблер, он такой ассемблер. Главное чтобы управление не выкатывалось на данные.

HerrSchneider, Вот я не пользую Atmel Studio, только ассемблер командной строки. Но из моего опыта сначала откомпилировать, а потом дизассемблировать обратно это как-то дико неправильно. Atmel Studio наверняка вызывает ассемблер командной строки и она просто графическая оболочка вокруг этого ассемблера. Так вот заставь свой ассемблер создать файл листинга. Или указав что-то Atmel Studio или вручную компилируя ассемблером командной строки, который умеет это делать. Создай файл листинга и туда смотри. Там однозначно видно ЧТО накомпилировал ассемблер. И видно правильно это или не правильно. Можешь и нам показать этот файл листинга.
Я вот всегда создаю файл листинга при ассемблировании и сразу смотрю туда - верно ли накомпилировалось то, что я имел ввиду или что-то не так и я ошибся или даже может ассемблер начудил (заметил у AVR-ассемблера парочку багов). И если вижу, что в листинге все чики-пики, то уверен, что действительно чики-пики. Я программу отлаживаю даже больше глядя в листинг, чем в исходник. И тебе советую туда посматривать.
0
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,508
Завершенные тесты: 1
15.04.2018, 14:25 4
Цитата Сообщение от Ethereal Посмотреть сообщение
Можно перемешивать данные и код как угодно.
можно, но нужно ли?
по крайней мере должны быть явные переходы(в основном безусловные), которые обходят блок данных, а у ТС я их не заметил
0
15.04.2018, 14:25
Ethereal
5837 / 1993 / 263
Регистрация: 17.02.2013
Сообщений: 2,966
15.04.2018, 14:30 5
Добавлено через 28 секунд
Ну так я так и сказал
Цитата Сообщение от Ethereal Посмотреть сообщение
Главное чтобы управление не выкатывалось на данные.
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
можно, но нужно ли?
Когда приходилось ногами уминать функциональность в тощий чип было нужно. То есть иногда даже и приходится.
0
Grey
Тутошний я
1716 / 879 / 156
Регистрация: 03.11.2009
Сообщений: 2,712
Записей в блоге: 1
15.04.2018, 14:51 6
Можно перемешивать данные и код как угодно.
За программой, между программой и/или подпрограммами.
Но не внутри кода.
Переходы добавляют кода, занимают стек.
0
HerrSchneider
6 / 6 / 2
Регистрация: 08.07.2017
Сообщений: 59
15.04.2018, 20:07  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
по крайней мере должны быть явные переходы(в основном безусловные), которые обходят блок данных, а у ТС я их не заметил
ха ха вот я олух. Весь код то я вам не показал, а когда я писал этот топик у меня эти данные аккурат после
Main: были вставлены. и, конечно, программный счетчик по этим данным пробегал как по инструкциям после загрузки в первую очередь. Как только его не колбасило раньше, ведь работал же девайс!

Добавлено через 7 минут
ааа. да на моем примере это и видно, сразу после Main: данные идут.
в общем Решено. сам дурак...
0
Ethereal
5837 / 1993 / 263
Регистрация: 17.02.2013
Сообщений: 2,966
15.04.2018, 21:53 8
А, ну хорошо, что у ТС-а проблема решена.
Цитата Сообщение от Grey Посмотреть сообщение
За программой, между программой и/или подпрограммами.
Но не внутри кода.
Тут у меня сразу включилось дежавю. Задумался когда-же мне приходилось втыкать данные так, чтобы исполнение прокатывалось по ним, как по коду. Ведь вроде бы приходилось. И вспомнил.
Цитата Сообщение от Ethereal Посмотреть сообщение
Оказалось, что словная таблица преобразования с
данными 1 2 4 8 10 20 40 80 трактуется Лампанелью как нуль-операции,
поэтому ее можно поместить в самое начало программы и начать исполнение
программы именно с нее. Зато в результате смещение в таблице оказывается
адресом в ней и выпадает команда сложения адреса и смещения.
Вот здесь : Игра Конвея Жизнь на Лампанели Но это был действительно чумовой случай
Там даже комментарии стоят
;NOP Проедемся по данным, как по коду
0
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,508
Завершенные тесты: 1
16.04.2018, 07:54 9
Цитата Сообщение от Ethereal Посмотреть сообщение
Вот здесь : Игра Конвея Жизнь на Лампанели
Assembler: i8080/8085/KP580
ты фонНемановскую архитектуру и гарвардскую не путай
для одной данные и команды одна суть, у другой разные вещи
посему, совет для ТС, данные правильней хранитьв предназначенном для них месте- EEEPROM
0
COKPOWEHEU
1327 / 960 / 219
Регистрация: 09.09.2017
Сообщений: 3,960
16.04.2018, 08:05 10
EEPROM предназначена для изменяющихся данных, а для констант лучше подходит flash. К тому же она больше.
0
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,508
Завершенные тесты: 1
16.04.2018, 08:18 11
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
EEPROM предназначена для изменяющихся данных
или не изменяющихся EEPROM память данных
flash память команд
это плюс гарвардской архитектуры данные и команды разделены
кто их совмещает делает на свой страх и риск
0
Ethereal
5837 / 1993 / 263
Регистрация: 17.02.2013
Сообщений: 2,966
16.04.2018, 11:37 12
Цитата Сообщение от ValeryS Посмотреть сообщение
ты фонНемановскую архитектуру и гарвардскую не путай
Гарвард-то он конечно гарвард, но когда в программе для AVR нужен большой объем констант (аж в EEPROM не влезут), то приходится помещать их во флеш с доступом к ним через команду lpm. И AVR-а сразу офоннейманивается - данные и код оказываются в одном месте, во флеш. Причем это-то уже никакое не трюкачество, это со всех сторон приличное решение и такое приходится делать довольно часто.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
кто их совмещает делает на свой страх и риск
А мы не боимся
1
Grey
Тутошний я
1716 / 879 / 156
Регистрация: 03.11.2009
Сообщений: 2,712
Записей в блоге: 1
16.04.2018, 12:02 13
Я тоже во флеш записывал данные. Но между подпрограммами, а не внутрь кода.
0
Ethereal
5837 / 1993 / 263
Регистрация: 17.02.2013
Сообщений: 2,966
16.04.2018, 12:06 14
Просто ТС ошибся, но можно ведь понимать, что делаешь и не ошибаться.
0
ValeryS
Модератор
7523 / 5700 / 736
Регистрация: 14.02.2011
Сообщений: 19,508
Завершенные тесты: 1
16.04.2018, 13:19 15
Цитата Сообщение от Ethereal Посмотреть сообщение
И AVR-а сразу офоннейманивается
так чистого гарварда я и не видел
вот например STM гарвард, а единое адресное пространство, вот тебе и фонНеман
Цитата Сообщение от Ethereal Посмотреть сообщение
А мы не боимся
так боятся не надо а опасаться стоит
0
COKPOWEHEU
1327 / 960 / 219
Регистрация: 09.09.2017
Сообщений: 3,960
16.04.2018, 22:27 16
Цитата Сообщение от ValeryS Посмотреть сообщение
так чистого гарварда я и не видел
младшие PIC'и (PIC16F84 например) вроде. У них нет команд считывания данных из флеша, вместо этого используются процедуры, возвращающие нужное значение.
Цитата Сообщение от ValeryS Посмотреть сообщение
или не изменяющихся EEPROM память данных
Вспомните сколько времени занимает чтение из EEPROM. Потому что из flash всего 3 такта.
0
16.04.2018, 22:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2018, 22:27

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru