|
Внешняя SRAM, Выбор скорости |
|
|
|
Mar 13 2007, 10:44
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Код И ещё далее по тексту вот так:[code] .data 0x00800100 0xcc load address 0x0000a6f0 0x00800100 PROVIDE (__data_start, .) *(.data) .data 0x00800100 0xc at.o .data 0x0080010c 0x1a common.o .... Секция дата расположена по адресу 0x00800100, а не нужном вам 0x00801100. Опция линкера "-Tdata" работает только для контроллеров, у которых внутренняя RAM начинается с адреса 0x60 (AT90S8515), и не работает для тех у которых начинается с 0x100 (ATmega128, ...) или 0x200(ATmega1280, ...). Для них используйте в опцию "--section-start .data=..." - она делает тоже самое и работает всегда. В LDFLAG вам нужно заменить "-Tdata=0x801100" на "--section-start,.data=0x801100". Анатолий.
|
|
|
|
|
Mar 13 2007, 11:46
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Цитата(aesok @ Mar 13 2007, 13:44)  Код И ещё далее по тексту вот так:[code] .data 0x00800100 0xcc load address 0x0000a6f0 0x00800100 PROVIDE (__data_start, .) *(.data) .data 0x00800100 0xc at.o .data 0x0080010c 0x1a common.o .... Секция дата расположена по адресу 0x00800100, а не нужном вам 0x00801100. Опция линкера "-Tdata" работает только для контроллеров, у которых внутренняя RAM начинается с адреса 0x60 (AT90S8515), и не работает для тех у которых начинается с 0x100 (ATmega128, ...) или 0x200(ATmega1280, ...). Для них используйте в опцию "--section-start .data=..." - она делает тоже самое и работает всегда. В LDFLAG вам нужно заменить "-Tdata=0x801100" на "--section-start,.data=0x801100". Анатолий. Кусочек мэйк файла: Код ## Linker flags LDFLAGS = $(COMMON) LDFLAGS += -Wl,-u,vfprintf -Wl,-Map=ppp.map LDFLAGS += -Wl,-section-start=.data=0x801100,--defsym=__heap_end=0x80ffff Кусочек мапа: Код Linker script and memory map
Address of section .data set to 0x800100 LOAD C:/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/crtm128.o Address of section .data set to 0x801100 0x0080ffff __heap_end = 0x80ffff
....
.data 0x00801100 0xd0 load address 0x0000abb0 0x00801100 PROVIDE (__data_start, .) *(.data) .data 0x00801100 0xc at.o .data 0x0080110c 0x1a common.o Ща буду пробовать что получилось.
|
|
|
|
|
Mar 13 2007, 12:32
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Получилась полная фигня. Берём и начинаем отлаживать JTAG'ом. Видим, что все переменные лежат >=0x1100 адресах, но в то же время их начальные значения: Код unsigned char str[]="Test"; JTAG'ом видны во внутреней памяти. Если же обратиться к переменной, то возвращается значение из внешней памяти, где конечно же помойка. Запись опять же идёт во внешнюю память. Короче прикольно как-то. Это я что-то не так делаю? Кстати. Если эмулировать AVRStudio Emulator'ом, то всё как надо.
|
|
|
|
|
Mar 14 2007, 14:48
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Alexey Belyaev @ Mar 13 2007, 12:32)  Получилась полная фигня. Берём и начинаем отлаживать JTAG'ом. Видим, что все переменные лежат >=0x1100 адресах, но в то же время их начальные значения: Код unsigned char str[]="Test"; JTAG'ом видны во внутреней памяти. В какой внутреней памяти: в RAM или FLASH? По каким адресам?
|
|
|
|
|
Mar 14 2007, 19:10
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(zorromen @ Mar 14 2007, 12:39)  Ахтунг ... Ша я обнаружил интересный факт ... Ноги которые идут на JTAG ... это 4 старших разряда памяти ... так они не дают работать со всей памятью ... т.е 8к мах ... Я тока отрубил фьюз JTAG и о чудо ноги стали работать ... Тока кать теперь отлаживать прогу? ерунда какаято со стороны разработчиков ... Смотрю осцилографом... Чуда никакого нет, старшие адреса перекрываются альтернативной функцией джейтага. Так что или рыбку или гвоздик(:-). По поводу отладки в описании говорится - ВСЁ, ЧТО НА КРИСТАЛЛЕ (extensive on-chip debug support) + программирование внешней памяти, еепром, фьюзов... Размещайте отлаженные куски выше по памяти, а нижние 8К - для отладки...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Mar 15 2007, 05:41
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Цитата(aesok @ Mar 14 2007, 17:48)  В какой внутреней памяти: в RAM или FLASH? По каким адресам? B RAM. Ну адреса как и положено для переменных внутренней РАМ от 0 и выше по порядку. В общем сделал я так: во внешку разместил только кучу, и все "громозкие" переменные объявил указателями и аллочу память на них. Пока работает.
|
|
|
|
|
Apr 20 2007, 20:19
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 5-12-06
Пользователь №: 23 156

|
Извените за ламерские вопросы, но все таки хочеться узнать. 1. К каким атмегам можно подрубить внешнию паметь, например к atmega32 можно? 2.Где бы прочитать, желательно на русском, про реализацию этого процесса?
|
|
|
|
|
Apr 20 2007, 20:32
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(Handler @ Apr 20 2007, 21:19)  ... 1. К каким атмегам можно подрубить внешнию паметь, например к atmega32 можно? 2.Где бы прочитать, желательно на русском, про реализацию этого процесса? 1) ATmega8515, ATmega162, ATmega64, ATmega128 2) http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/2_1.htm
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Apr 27 2007, 11:35
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Alexey Belyaev @ Apr 25 2007, 20:42)  А можно вернуться к моим папугаям? В смысле могу ли я использовать всю ОЗУ как одно целое, а не как "внутреняя" и "внешняя"? Точнее могу ли я сказать об этом компилятору? Напоминаю, что пока у меня мега128и 32к внешней СОЗУ. Внутреня адресуется как обычно, а во нешнюю перенесена куча (хип). Всё можно. Это нужно сказать линкеру, подкорректировав соответствующий командный файл или скрипт в зависимости от среды разработки. Цитата(Alexey Belyaev @ Apr 25 2007, 20:42)  ЗЫ. А можно, как-нить узнать объём и кол-во занятой памяти в результате работы программы? ну там переменные, их расположение и размер в куче? Это можно увидеть в map файле, выдаваемом линкером, включив соответствующую опцию. Размер кучи постоянен (как и размер стека) и также задаётся скриптом линкера, а вот её занятость определить также сложно как и занятость стека.
|
|
|
|
|
Apr 27 2007, 13:25
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Alexey Belyaev @ Apr 27 2007, 14:18)  А по подробнее в случае с WinAVR можно? Кое какая информация есть в avr-libc-user-manual в разделе 8.5 Using malloc(). Анатолий.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|