13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
|
||||||
1 | ||||||
AVR ассемблер. объявление массива .db Atmel Studio 7, ошибка компиляции?14.04.2018, 18:49. Показов 2571. Ответов 15
Метки нет (Все метки)
Столкнулся со странной проблемой.
Написал код для дисплея. код рабочий такой:
рабочий девайс - 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
|
14.04.2018, 18:49 | |
Ответы с готовыми решениями:
15
AVR ассемблер. объявление массива .db в макросе .macro не работает!? Atmel Studio 7 Ассемблер для микроконтроллеров Atmel AVR Ошибка компиляции (AVR Studio, ATMega8515) Ошибка при компиляции AVR Studio 4 & WinAVR |
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
15.04.2018, 14:18 | 3 |
Это не обязательно. Можно перемешивать данные и код как угодно. Ассемблер, он такой ассемблер. Главное чтобы управление не выкатывалось на данные.
HerrSchneider, Вот я не пользую Atmel Studio, только ассемблер командной строки. Но из моего опыта сначала откомпилировать, а потом дизассемблировать обратно это как-то дико неправильно. Atmel Studio наверняка вызывает ассемблер командной строки и она просто графическая оболочка вокруг этого ассемблера. Так вот заставь свой ассемблер создать файл листинга. Или указав что-то Atmel Studio или вручную компилируя ассемблером командной строки, который умеет это делать. Создай файл листинга и туда смотри. Там однозначно видно ЧТО накомпилировал ассемблер. И видно правильно это или не правильно. Можешь и нам показать этот файл листинга. Я вот всегда создаю файл листинга при ассемблировании и сразу смотрю туда - верно ли накомпилировалось то, что я имел ввиду или что-то не так и я ошибся или даже может ассемблер начудил (заметил у AVR-ассемблера парочку багов). И если вижу, что в листинге все чики-пики, то уверен, что действительно чики-пики. Я программу отлаживаю даже больше глядя в листинг, чем в исходник. И тебе советую туда посматривать.
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
15.04.2018, 14:30 | 5 |
Добавлено через 28 секунд
Ну так я так и сказал Добавлено через 2 минуты Когда приходилось ногами уминать функциональность в тощий чип было нужно. То есть иногда даже и приходится.
0
|
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
|
|
15.04.2018, 20:07 [ТС] | 7 |
ха ха вот я олух. Весь код то я вам не показал, а когда я писал этот топик у меня эти данные аккурат после
Main: были вставлены. и, конечно, программный счетчик по этим данным пробегал как по инструкциям после загрузки в первую очередь. Как только его не колбасило раньше, ведь работал же девайс! Добавлено через 7 минут ааа. да на моем примере это и видно, сразу после Main: данные идут. в общем Решено. сам дурак...
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
15.04.2018, 21:53 | 8 |
А, ну хорошо, что у ТС-а проблема решена.
Тут у меня сразу включилось дежавю. Задумался когда-же мне приходилось втыкать данные так, чтобы исполнение прокатывалось по ним, как по коду. Ведь вроде бы приходилось. И вспомнил. Вот здесь : Игра Конвея Жизнь на Лампанели Но это был действительно чумовой случай Там даже комментарии стоят ;NOP Проедемся по данным, как по коду
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
|
|
16.04.2018, 07:54 | 9 |
для одной данные и команды одна суть, у другой разные вещи посему, совет для ТС, данные правильней хранитьв предназначенном для них месте- EEEPROM
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,879
|
|
16.04.2018, 08:05 | 10 |
EEPROM предназначена для изменяющихся данных, а для констант лучше подходит flash. К тому же она больше.
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
16.04.2018, 11:37 | 12 |
Гарвард-то он конечно гарвард, но когда в программе для AVR нужен большой объем констант (аж в EEPROM не влезут), то приходится помещать их во флеш с доступом к ним через команду lpm. И AVR-а сразу офоннейманивается - данные и код оказываются в одном месте, во флеш. Причем это-то уже никакое не трюкачество, это со всех сторон приличное решение и такое приходится делать довольно часто.
Добавлено через 2 минуты А мы не боимся
1
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
16.04.2018, 12:06 | 14 |
Просто ТС ошибся, но можно ведь понимать, что делаешь и не ошибаться.
0
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,879
|
|
16.04.2018, 22:27 | 16 |
младшие PIC'и (PIC16F84 например) вроде. У них нет команд считывания данных из флеша, вместо этого используются процедуры, возвращающие нужное значение.
Вспомните сколько времени занимает чтение из EEPROM. Потому что из flash всего 3 такта.
0
|
16.04.2018, 22:27 | |
16.04.2018, 22:27 | |
Помогаю со студенческими работами здесь
16
Atmel studio outlining (ассемблер) Почему AVR Studio 4, а не Atmel Studio 6? AVR Simulator в Atmel Studio 6.0 Atmel Studio 6.0: Новичёк в AVR AVR Studio 4.18 b и Atmel Software Framework 3.33 Вычисления с дробями на AVR (Atmel Studio) Atmel Studio 7 AVR и прерывания по умолчанию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |