реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Глюки программирования mega128, в WinAvr или МикроПаскале
aiwa
сообщение Aug 15 2017, 18:55
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(KRS @ Aug 15 2017, 18:04) *
во 2 случае данные из флеша копируются в переменную размещенную в ОЗУ.
А в 1, размещаются в стеке

Зависит от компилятора, но сейчас они не размещают строки в стеке.
При соответствующих установках компилятор сгенерирует полностью идентичный код для обоих случаев, скормив функции в 1 первом случае адрес ER.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 16 2017, 07:01
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(aiwa @ Aug 15 2017, 21:55) *
При соответствующих установках компилятор сгенерирует полностью идентичный код для обоих случаев, скормив функции в 1 первом случае адрес ER.


А как он это сделает, если функция получает неконстантный буфер, т.е. может его модицифировать. В этом случае копирование во временный буфер не может быть соптимизировано...
Go to the top of the page
 
+Quote Post
Who_are_you?
сообщение Aug 16 2017, 12:16
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Похоже WinAVR в 1-ом случае и загоняет в стек - отсюда и глюки.

Ещё два вопроса возникло:
WinAVR-20100110
Как стал объем
Program: 50.0% Full,
То *.hex - файл не шьется
делаешь 49.9 - все норм
WinAVR- вроде как свободна для распространения?

А стал отлаживать обмен данными по порту по прерыванию и непонятка:
командный кадр приходит (вижу при передачи в комп), но
на LCD видно не первый, а второй кадр
(просто цикл for(); и в нем вывод)
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 16 2017, 14:40
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Непомнящий Евгений @ Aug 16 2017, 10:01) *
А как он это сделает, если функция получает неконстантный буфер, т.е. может его модицифировать. В этом случае копирование во временный буфер не может быть соптимизировано...

Да, виноват недосмотрел. Привык в последнее время, что все входящие буфера для вывода объявлены как 'const char*'.




Цитата(Who_are_you? @ Aug 16 2017, 15:16) *
Как стал объем
Program: 50.0% Full,
То *.hex - файл не шьется
делаешь 49.9 - все норм
WinAVR- вроде как свободна для распространения?


Наверное это связано с моделью памяти.
128-я регистрами может адресовать только 50% памяти - поэтому, пространство программ делится на две половины, выбор доступа к каждой из который осуществляется с помощью соответствующего бита в управляющем регистре.
Для маленьких моделей компилятор строит программу при условии что она будет располагаться в нижних 50% памяти.
Go to the top of the page
 
+Quote Post
Who_are_you?
сообщение Aug 17 2017, 08:50
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



И как обойти это или в WinAVR не возможно?

В конце концов не может же 50% висеть в воздухе!
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 17 2017, 10:19
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Who_are_you? @ Aug 17 2017, 11:50) *
И как обойти это или в WinAVR не возможно?

В конце концов не может же 50% висеть в воздухе!


бит RAMPZ0 регистра RAMPZ отвечает за выбор банка при адресации команд ELPM/SPM.
Я не знаю как в WinAVR, но в общем это обходится выбором модели памяти (huge) при компиляции.
Тогда компилятор начинает использовать ELPM вместо LMP и отслеживает манипуляции с RAMPZ0.

Сообщение отредактировал aiwa - Aug 17 2017, 10:20
Go to the top of the page
 
+Quote Post
Who_are_you?
сообщение Aug 17 2017, 13:12
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Из Даташит:

Внутрисистемно программируемая флэш-память программ ATmega128 содержит 128 кбайт
внутренней внутрисистемно перепрограммируемой флэш-памяти для хранения программы.
Поскольку все AVR-инструкции являются 16 или 32-разр., то флэш-память организована как 64
кбайт х 16. Для программной защиты флэш-память программ разделена на два сектора: сектор
программы начальной загрузки и сектор прикладной программы.

Регистр RAMPZ обычно используется для указания той страницы ОЗУ размером 64 кбайт, к
которой выполняется доступ через Z-указатель. Т.к. ATmega128 не поддерживает память на
статическом ОЗУ размером свыше 64 кбайт, то данный регистр используется только для выбора
страницы памяти программ, доступ к которой осуществляется с помощью инструкций ELPM/SPM.
Различные установки бита RAMPZ0 имеют следующий результат:
RAMPZ0 =0:
Инструкции ELPM/SPM осуществляют доступ к памяти программ в диапазоне адресов
$0000 - $7FFF (младшие 64 кбайт)
RAMPZ0 =1:
Инструкции ELPM/SPM выполняют доступ к памяти программ в диапазоне адресов
$8000 - $FFFF (старшие 64 кбайт)
Обратите внимание, что действие инструкции LPM не зависит от установки RAMPZ.


Получается программно нужно как-то расширять возможности записи программ больше 64к
или все приехали: на данном микроконтроллере дальше не уедешь?

Сообщение отредактировал Who_are_you? - Aug 17 2017, 13:15
Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 17 2017, 21:24
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Who_are_you? @ Aug 17 2017, 16:12) *
Получается программно нужно как-то расширять возможности записи программ больше 64к
или все приехали: на данном микроконтроллере дальше не уедешь?

Для переменных есть модификаторы типа памяти, наподобие __farflash, __hugeflash и т.д.
При использовании библиотек - соответствующую модель памяти.






Go to the top of the page
 
+Quote Post
aiwa
сообщение Aug 17 2017, 22:24
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Пример использования
Код
char ER [] = "Error_RS422: ";

#pragma location = 0x000100
__flash char ER_FLASH [] = "Error_RS422: ";

#pragma location = 0x010100
__hugeflash char ER_HUGE [] = "Error_RS422: ";

void main(void)
{

for(int i=0;i<10;i++)
  ER[i]=ER_HUGE[i];
for(int i=0;i<10;i++)
  ER[i]=ER_FLASH[i];
  
}

И работа компилятора
CODE

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

// 16 ER[i]=ER_HUGE[i];
MOV R26, R25
LSL R26
SBC R26, R26
MOV R27, R26
LDI R30, LOW(ER_HUGE)
LDI R31, HIGH(ER_HUGE)
LDI R19, (ER_HUGE) >> 16
ADD R30, R24
ADC R31, R25
ADC R19, R26
OUT 0x3B, R19 !!!!!!!!! заносим в RAMPZ третий байт адреса для нижних адресов это 0x00, для верхних адресов - 0x01
ELPM R16, Z !!!!!!!!! доступ к памяти программ через "длинный" вариант - ELP, т.е. через [RAMPZ0]:Z
MOVW R31:R30, R25:R24
SUBI R30, LOW((-(ER) & 0xFFFF))
SBCI R31, (-(ER) & 0xFFFF) >> 8
ST Z, R16

копируем из нижней половины. здесь двухбайтный адрес.
// 16 ER[i]=ER_HUGE[i];
MOV R26, R25
LSL R26
SBC R26, R26
MOV R27, R26
LDI R30, LOW(ER_HUGE)
LDI R31, HIGH(ER_HUGE)
LDI R19, (ER_HUGE) >> 16
ADD R30, R24
ADC R31, R25
ADC R19, R26
OUT 0x3B, R19
ELPM R16, Z !!!!!!!!! доступ к памяти программ через "короткий" вариант - LPМ, т.е. через Z
MOVW R31:R30, R25:R24
SUBI R30, LOW((-(ER) & 0xFFFF))
SBCI R31, (-(ER) & 0xFFFF) >> 8
ST Z, R16



Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 18 2017, 11:05
Сообщение #25


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Проблема в чём-то другом.
У вас ведь программа не состоит только из данных во флеше, а есть ещё и код программ.
avr-gcc (см скрипт линкера и map-файл) обычно размещает секцию с данными перед секцией кода.
Поэтому проблемы с заполнением памяти на 49% и 51% не следуют из вышеназванных предположений.

А на будущее рекомендую изучить файлик pgmspace.h
Цитата
a = pgm_read_byte_far(GET_FAR_ADDRESS(v));


Также есть смысл использовать более свежий тулчейн хотя бы avr-gcc-4.9.2 т.к. там появилась поддержка ключевого слова __flash (на подобии IAR).

https://sourceforge.net/projects/mobileches...%20%28Win32%29/


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 22:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016