|
Глюки программирования mega128, в WinAvr или МикроПаскале |
|
|
|
Aug 15 2017, 18:55
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(KRS @ Aug 15 2017, 18:04)  во 2 случае данные из флеша копируются в переменную размещенную в ОЗУ. А в 1, размещаются в стеке Зависит от компилятора, но сейчас они не размещают строки в стеке. При соответствующих установках компилятор сгенерирует полностью идентичный код для обоих случаев, скормив функции в 1 первом случае адрес ER.
|
|
|
|
|
Aug 16 2017, 14:40
|
Местный
  
Группа: Участник
Сообщений: 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% памяти.
|
|
|
|
|
Aug 17 2017, 10:19
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 17 2017, 21:24
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Who_are_you? @ Aug 17 2017, 16:12)  Получается программно нужно как-то расширять возможности записи программ больше 64к или все приехали: на данном микроконтроллере дальше не уедешь? Для переменных есть модификаторы типа памяти, наподобие __farflash, __hugeflash и т.д. При использовании библиотек - соответствующую модель памяти.
|
|
|
|
|
Aug 17 2017, 22: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
|
|
|
|
|
Aug 18 2017, 11:05
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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/
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|