|
Внешняя SRAM, Выбор скорости |
|
|
|
Nov 23 2006, 16:36
|

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

|
Цитата(zorromen @ Nov 22 2006, 19:50)  Вопрос таков...Какое должно быть время доступа к внешней SRAM...чтобы без проблем работать на 16Mhz... Основной параметр - время доступа к памяти, он не должен быть больше времени доступа МК к внешней памяти, отсюда и исходите. Например, время доступа к внешней памяти для атмеги128 составляет 3 машинных цикла, т.е. 62.5*3=187.5 нс без дополнительных циклов ожидания. Однако многое зависит от временных характеристик отдельных сигналов как МК, так и статической памяти. Нужно более внимательно смотреть на соответствующие временные формы конкретной памяти. Цитата(defunct @ Nov 22 2006, 21:04)  Если речь о настройках задержки шины памяти, то для 55ns и более быстрой памяти, задержка любая. для 70ns памяти - +1 холостой такт. Зачем нужен холостой такт, там же и так чтение/запись делается за 3 МЦ, вроде бы все проходит и так, скажем, для памяти HM62256B-7 (время доступа 70 нс) или HM62256B-8 (время доступа 85 нс)
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 23 2006, 20:14
|

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

|
Цитата(defunct @ Nov 23 2006, 15:07)  Цитата(=GM= @ Nov 23 2006, 16:36)  Зачем нужен холостой такт, там же и так чтение/запись делается за 3 МЦ, вроде бы все проходит и так, скажем, для памяти HM62256B-7 (время доступа 70 нс) или HM62256B-8 (время доступа 85 нс)
На свой в очередной раз веселый вопрос, Вы сможете ответить себе самостоятельно после того, как заглянете в даташит и посмотрите на длительности сигналов RD/WR. Веселый термин МЦ применяйте относительно к Ц51, у AVR все меряется тактами. Минимальная длительность сигналов RD/WR у атмеги128 равна 52,125 нс (документ 2467n, с.331). Максимальная длительность сигналов ОЕ/WR для HM62256B-7(8) составляет 40(45)/50(55) нс (дейташит на HM62256B, с.7-8). Давайте посмеемся вместе. Где тут надо смеяться(:-)? Насчет МЦ. Привык использовать в DSP, слишком много понятий связано с понятием такт, да и тактов разных в процессоре немеряно, поэтому иногда проще поискать эквивалентное понятие, машинный цикл неплохо звучит, не хуже других. Например, у меня два DMACа выполняются за один МС 10нс (machine cycle), как мне говорить, за полтакта? На самом деле, если копнуть чуток поглубже, эта команда размазывается на 8 клоков (тактов) процессора(:-(. Конвейер, понимаете ли, а вы говорите такты! Да и в самих аврках есть одноуровневый конвейер, так что и там такты, как мера выполнения команды сомнительна. Хотя на бытовом уровне, пожалуй, использовать можно(:-). Цитата(singlskv @ Nov 23 2006, 15:22)  Цитата(defunct @ Nov 23 2006, 18:07)  Свой веселый термин МЦ применяйте относительно к Ц51, у AVR все меряется тактами.
+1 Еще Microchip любит МЦ, чтобы было непонятно, что реальная производительность =20МГц/4такта.  -2 Вроде еще не пятница, неплохо бы и по делу что-нибудь сказать? Поближе к теме ветки(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 24 2006, 00:35
|

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

|
Цитата(zorromen @ Nov 23 2006, 22:33)  ... на 4 мегагерца идет и то с глюками... Почти наверняка битая SRAM или AVR. Мне ни разу не удалось поймать сбои при работе на 16 мГц и 70нс. Кстати, конденсатор по питанию около памяти очень даже желателен. Ещё посмотреть бы осциллографом сигналы адреса и управления прямо на выводах SRAM. Если проводники тонкие и длинные тогда, возможно, звон портит вам всю картину.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Nov 24 2006, 00:52
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Nov 23 2006, 20:14)  Минимальная длительность сигналов RD/WR у атмеги128 равна 52,125 нс (документ 2467n, с.331). Максимальная длительность сигналов ОЕ/WR для HM62256B-7(8) составляет 40(45)/50(55) нс (дейташит на HM62256B, с.7-8). Давайте посмеемся вместе. Где тут надо смеяться(:-)? что ж, давайте посмеемся. В даташитах на SRAM обычно не приводят такой параметр как макс. длительность WE строба, следовательно цифры 50(55) приведенные вами есть ни что иное как мин. длительность WE строба. Получается с одной стороны мин. длительность WE строба (70ns памяти) = 55ns, с другой стороны мин. длительность WE меги 52.125. 55 несколько больше чем 52.125 не так ли? Тут и начинаются глюки. Как они проявляются - можете поэкспеременитировать. Мне даже не нужно приводить данные из даташитов других производителей памяти (хотя я запросто могу это сделать), достаточно цифр из вашего. Цитата Например, у меня два DMACа выполняются за один МС 10нс (machine cycle), как мне говорить, за полтакта? простите, чего у вас выполняется? Вы постоянно сорите какими-то аббревиатурами которые слабо вяжутся со смыслом.
|
|
|
|
|
Nov 24 2006, 14:04
|

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

|
Цитата(defunct @ Nov 23 2006, 21:52)  Цитата(=GM= @ Nov 23 2006, 20:14)  Минимальная длительность сигналов RD/WR у атмеги128 равна 52,125 нс (документ 2467n, с.331). Максимальная длительность сигналов ОЕ/WR для HM62256B-7(8) составляет 40(45)/50(55) нс (дейташит на HM62256B, с.7-8). Давайте посмеемся вместе. Где тут надо смеяться(:-)?
что ж, давайте посмеемся. В даташитах на SRAM обычно не приводят такой параметр как макс. длительность WE строба, следовательно цифры 50(55) приведенные вами есть ни что иное как мин. длительность WE строба. Не, смешнее не стало, но к счастью, разобрался. Всё не так работает. Для конкретности будем говорить о 70-ти наносекундной памяти. Начнем с самого начала. При появлении строба OE статическая память должна выдать данные и как можно быстрее. Максимальное время выдачи для нашей памяти достигает 40 нс, т.е. гарантированно через 40 нс после начала строба чтения появятся достоверные данные. В то же время минимальная длительность строба чтения от атмеги128 составляет 52 нс. Казалось бы все хорошо, ан нет! Судя по временным графикам на МК, необходимо обеспечить наличие достоверных данных за 40 нс до конца строба чтения. Вывод такой. Для 55-, 70- и 85-наносекундной памяти необходим один дополнительный такт ожидания. Иными словами, для соответствия спецификации чтение SRAM должно осуществляться не менее, чем за 4 такта МК. Цитата(defunct @ Nov 23 2006, 21:52)  Получается с одной стороны мин. длительность WE строба (70ns памяти) = 55ns, с другой стороны мин. длительность WE меги 52.125. 55 несколько больше чем 52.125 не так ли? Тут и начинаются глюки. Как они проявляются - можете поэкспеременитировать. Мне даже не нужно приводить данные из даташитов других производителей памяти (хотя я запросто могу это сделать), достаточно цифр из вашего. Вообще, замечу в скобках, именно для памяти длительность строба чтения может быть любая, но не меньше допустимого времени на выдачу достоверных данных. То что вы процитировали - 55 нс - это минимальное время записи для 85-нс памяти, для 70-ти нс памяти это время будет равно 50 нс (конкретно на запись). Но с записью в память почти всегда полный порядок, проблемы с чтением из памяти. Цитата(defunct @ Nov 23 2006, 21:52)  Цитата Например, у меня два DMACа выполняются за один МС 10нс (machine cycle), как мне говорить, за полтакта? простите, чего у вас выполняется? Вы постоянно сорите какими-то аббревиатурами которые слабо вяжутся со смыслом. Прошу прощения за непонятки. Как всегда предполагается, что все люди делают примерно тоже самое, и нет нужды повторяться. Поясню смысл аббревиатуры. DMAC это команда цифрового сигнального процессора TMS320F2812. D-double, т.е. двойной, MAC-multiply and accumulate. То есть берется два 16-битных операнда из разных участков памяти, перемножаются, получается 32-битный результат, который складывается с содержимым аккумулятора. За один такт (10 нс !) выполняется два таких MACа, отсюда DMAC. Не знаю как вас, но меня такой результат впечатляет. Чтобы добиться подобного результата, применяют конвейерную обработку, каждая команда разбивается на 8 частей и в процессоре одновременно выполняются 8 команд на разной стадии выполнения. Для стороннего наблюдателя процесс выглядит как если бы одна команда выполнялась за ОДИН такт, хотя на самом деле она выполняется за 8 тактов. Вот тот ОДИН такт и называют машинным циклом, возможно неправомерно, но так уж сложилось. Надеюсь, теперь вам стало более понятно, что я имел в виду? Упоминая о DMAC, я просто хотел показать, что имеет смысл применять понятие машинный цикл (МЦ) вместо слова "такт".
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 24 2006, 16:10
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Nov 24 2006, 14:04)  Не, смешнее не стало, но к счастью, разобрался. Всё не так работает. Для конкретности будем говорить о 70-ти наносекундной памяти. Начнем с самого начала. При появлении строба OE статическая память должна выдать данные и как можно быстрее. Максимальное время выдачи для нашей памяти достигает 40 нс, т.е. гарантированно через 40 нс после начала строба чтения появятся достоверные данные. В то же время минимальная длительность строба чтения от атмеги128 составляет 52 нс. Казалось бы все хорошо, ан нет! Судя по временным графикам на МК, необходимо обеспечить наличие достоверных данных за 40 нс до конца строба чтения. Достойный ответ, и, что радует - без смайликов. искрене рад за Вас, что в итоге здравый смысл победил амбиции и желание просто поспорить. Цитата Вывод такой. Для 55-, 70- и 85-наносекундной памяти необходим один дополнительный такт ожидания. Иными словами, для соответствия спецификации чтение SRAM должно осуществляться не менее, чем за 4 такта МК. Согласен с выводом, тем более он не противоречит рекомендациям от Atmel.
|
|
|
|
|
Nov 24 2006, 16:55
|

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

|
Цитата(defunct @ Nov 24 2006, 13:10)  Достойный ответ, и, что радует - без смайликов. искрене рад за Вас, что в итоге здравый смысл победил амбиции и желание просто поспорить. Что вы так прицепились к этим смайликам(:-)? На мой взгляд они добавляют немного живости к обсуждаемым темам и показывают эмоции автора. "Суха теория, мой друг, но древо жизни вечно зеленеет" (С)Гейне. Вы что, всегда по жизни такой мрачный? Меняйтесь пока не поздно, а то не доживете до пенсии(:-). И, позвольте, какие амбиции? Я ж ВАС спрашивал, почему нельзя использовать три такта, а не утверждал, что можно их использовать (см. пост №3). Высказывал, так сказать, сомнения. Последнее, пожалуйста, отвечайте адекватнее по поводу веселых вопросов и смайликов, поскольку ничего веселого в моем изначальном посте (№3) не было и смайликов тоже, формулировка "веселые вопросы" появилась в вашем посте. Цитата(defunct @ Nov 24 2006, 13:10)  Цитата Вывод такой. Для 55-, 70- и 85-наносекундной памяти необходим один дополнительный такт ожидания. Иными словами, для соответствия спецификации чтение SRAM должно осуществляться не менее, чем за 4 такта МК. Согласен с выводом, тем более он не противоречит рекомендациям от Atmel. Зато он противоречит вашей рекомендации для 55-ти нс памяти (см. пост №2).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 26 2006, 13:49
|

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

|
Цитата(defunct @ Nov 24 2006, 23:34)  Цитата(=GM= @ Nov 24 2006, 16:55)  Зато он противоречит вашей рекомендации для 55-ти нс памяти (см. пост №2).
Да, потому что тайминг Tdvrh = 40ns, который вы взяли из даташита соответствует частоте тактирования 8Mhz. Мы же речь ведем о 16Mhz, т.о. длительность Tdvrh будет в два раза меньше, т.е. 20ns, что годится для 55ns памяти. Странно, но в дейташите Tdvrh = 40ns как для 8 МГц, так и для 16 МГц, возможно вы посмотрели не в ту графу таблицы. Но даже если бы Tdvrh=20 нс, то это не поможет, поскольку минимальная длительность импульса записи RD равна 52.5 нс, а 55-ти наносекундная память обеспечивает выдачу стабильных данных через 35 нс, т.е. минимальная длительность RD должна быть 35+20=55 нс. Возможно, что отдельные экземпляры памяти и МК как-то будут работать, но мы же говорим о соответствии спецификации (по-нашему - техническим условиям) на МК и SRAM, чтобы обеспечить работу системы в любых допустимых условиях эксплуатации.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 27 2006, 14:02
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(=GM= @ Nov 26 2006, 13:49)  Но даже если бы Tdvrh=20 нс, то это не поможет, поскольку минимальная длительность импульса записи RD равна 52.5 нс, а 55-ти наносекундная память обеспечивает выдачу стабильных данных через 35 нс, т.е. минимальная длительность RD должна быть 35+20=55 нс. Возможно, что отдельные экземпляры памяти и МК как-то будут работать, но мы же говорим о соответствии спецификации (по-нашему - техническим условиям) на МК и SRAM, чтобы обеспечить работу системы в любых допустимых условиях эксплуатации. Output Enable to Output Valid 35ns это опять же время для 70ns памяти. У 55ns памяти это время чуть-чуть меньше. Например у памяти Winbond W24258-55LL парамер Output Enable to Output Valid = 27ns, 27ns+20ns = 47ns итого имеем даже запас: 52.125ns-47ns = 5.125ns
|
|
|
|
|
Nov 27 2006, 17:41
|

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

|
Цитата(defunct @ Nov 27 2006, 11:02)  Цитата(=GM= @ Nov 26 2006, 13:49)  Но даже если бы Tdvrh=20 нс, то это не поможет, поскольку минимальная длительность импульса записи RD равна 52.5 нс, а 55-ти наносекундная память обеспечивает выдачу стабильных данных через 35 нс, т.е. минимальная длительность RD должна быть 35+20=55 нс. Возможно, что отдельные экземпляры памяти и МК как-то будут работать, но мы же говорим о соответствии спецификации (по-нашему - техническим условиям) на МК и SRAM, чтобы обеспечить работу системы в любых допустимых условиях эксплуатации.
Output Enable to Output Valid 35ns это опять же время для 70ns памяти. У 55ns памяти это время чуть-чуть меньше. Например у памяти Winbond W24258-55LL парамер Output Enable to Output Valid = 27ns, 27ns+20ns = 47ns итого имеем даже запас: 52.125ns-47ns = 5.125ns Насчет 27 нс понятно, вначале вроде упоминалась W24257, а не W24258. Тем не менее, запаса нет, вы принимаете Tdvrh равным 20 нс, а на самом деле Tdvrh=40 нс, следовательно, импульс чтения не может быть меньше, чем 27+40=67 нс. Не поленился, скачал свежий документ doc2467.pdf (10/06, ver.O). Проверьте сами, Tdvrh=40 нс для 16 МГц, с.331, таблица 137, строка 9.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jan 30 2007, 15:00
|

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

|
ребят, не пинайте больно если что не так, но у меня ничего не работает  Есть ATMega128 и есть 2 диповых памяти выколупанных из старой i386 мамки, в частности MOSEL MS62256H-20NC. Всё это дело я присобачил к меге через защёлку 74ACT573PC и транзистор RK7002 в качестве ивертора CS второй "страницы" памяти. Пробую писать в память и ничего не пишеться - JTAGом смотрю что там в памяти с помощью той же меги. Инициализирую работу пробовал так: Код MCUCR |= _BV(SRE) | _BV(SRW10); // enable external memory (xram) XMCRA |= _BV(SRW01) | _BV(SRW00) | _BV(SRW11) | _BV(SRW10); XMCRB &= ~(_BV(XMM2) | _BV(XMM1) | _BV(XMM0)); дабы увеличить все задержки, но так же пробовал и максимально быстро, короче как тока не пробовал. Что я не так сдела можете подсказать? Ах да. Мега работает с кварцем 18.432MHz
|
|
|
|
|
Jan 30 2007, 15:42
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Alexey Belyaev @ Jan 30 2007, 14:00)  Есть ATMega128 и есть 2 диповых памяти выколупанных из старой i386 мамки, в частности MOSEL MS62256H-20NC. Задержек определенно не надо. Наиболее вероятно - ошибка в разводке.. Проверить наличие сигналов RD/WR Проверить также сигнал ALE на входе LE защелки. CS защелки - на землю. Цитата Ах да. Мега работает с кварцем 18.432MHz не расчитана она на такую частоту. Цитата 74ACT573PC ACT серия часом не 3V? Mega с кварцем 18.432 на 3V будет сбоить.
|
|
|
|
|
Jan 31 2007, 13:06
|

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

|
Цитата(defunct @ Jan 30 2007, 18:42)  Цитата(Alexey Belyaev @ Jan 30 2007, 14:00)  Есть ATMega128 и есть 2 диповых памяти выколупанных из старой i386 мамки, в частности MOSEL MS62256H-20NC.
Задержек определенно не надо. Наиболее вероятно - ошибка в разводке.. Проверить наличие сигналов RD/WR Проверить также сигнал ALE на входе LE защелки. CS защелки - на землю. Цитата Ах да. Мега работает с кварцем 18.432MHz не расчитана она на такую частоту. Цитата 74ACT573PC ACT серия часом не 3V? Mega с кварцем 18.432 на 3V будет сбоить. Всё решено, спасибо за помощь. Защёлка оказалась дохлой. Купил новую всё заработало.
|
|
|
|
|
Jan 31 2007, 22:55
|
Группа: Новичок
Сообщений: 4
Регистрация: 31-01-07
Пользователь №: 24 916

|
Реально пользуем память 55 нс с полным временем 3 цикла (16/3 = 5,33 Мгц) По datasheet рассчитывать временные параметры далеко не подарок. Даже Samsung 55 нс память со скрипом пролазит по временным характеристикам.
А 20МГц ATMEGA с внешней памятью в природе существуют?
Сообщение отредактировал I_AM_WINER - Jan 31 2007, 22:58
|
|
|
|
|
Mar 10 2007, 16:41
|

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

|
В общем проблема у меня. Ресетится устройство. Понятно что из-за переполнения. Вот что у меня после компилдяции: Код AVR Memory Usage ---------------- Device: atmega128
Program: 42940 bytes (32.8% Full) (.text + .data + .bootloader)
Data: 5282 bytes (129.0% Full) (.data + .bss + .noinit)
EEPROM: 66 bytes (1.6% Full) (.eeprom)
Build succeeded with 0 Warnings... Линкуется вот так: Код avr-gcc.exe -mmcu=atmega128 -Wl,-u,vfprintf -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff -Wl,-Map=ppp.map at.o common.o fcs.o icmp.o ip.o main.o ppp.o tcp.o udp.o mmc.o logger.o time.o lcd.o ff.o -lprintf_flt -lm -o ppp.elf имею внешнюю оперативку в размере 64к. Делаю тест вот так: Код u16 SRAM_Test(void) { unsigned short j;
Reset_WD();
for (j = 0; j < RAM_SIZE; j++) { _SFR_MEM8(j + EXT_MEM_START) = (unsigned char)(j); Reset_WD(); } for (j = 0; j < RAM_SIZE; j++) { if (_SFR_MEM8(j + EXT_MEM_START) != (unsigned char)(j)) return j; Reset_WD(); }
return 0xffff; // past it's test } В JTAG вижу, что в память всё пишеться и наверное даже читается ибо тест проходит. Но блин когда начинаются обращения из кода типа: Код T_PPP PPP; .... memcpy_P((char*)&PPP.OUR_IP.ip32, OurIP, 4); .... рано или поздно оно ресетится. Помогите победить! ХЕЛП!
|
|
|
|
|
Mar 10 2007, 17:41
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Alexey Belyaev @ Mar 10 2007, 16:41)  Линкуется вот так: Код avr-gcc.exe -mmcu=atmega128 -Wl,-u,vfprintf -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff -Wl,-Map=ppp.map at.o common.o fcs.o icmp.o ip.o main.o ppp.o tcp.o udp.o mmc.o logger.o time.o lcd.o ff.o -lprintf_flt -lm -o ppp.elf Какая версия avr-ld? Или WinAVR? Вместо "-Tdata=0x801100" попробуйте использовать "--section-start,.data=0x801100". И проверте в .map файле в каких адресах расположена секция .data Анатолий.
|
|
|
|
|
Mar 13 2007, 05:27
|

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

|
Вот что видно в мапе: Код Memory Configuration
Name Origin Length Attributes text 0x00000000 0x00020000 xr data 0x00800060 0x0000ffa0 rw !x eeprom 0x00810000 0x00010000 rw !x *default* 0x00000000 0xffffffff
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 0x0080ffff __heap_end = 0x80ffff И ещё далее по тексту вот так: Код .data 0x00800100 0xcc load address 0x0000a6f0 0x00800100 PROVIDE (__data_start, .) *(.data) .data 0x00800100 0xc at.o .data 0x0080010c 0x1a common.o 0x00800110 MainBufferWr_Rx 0x0080010c rtc .data 0x00800126 0x48 main.o .data 0x0080016e 0x20 ppp.o .data 0x0080018e 0x2 tcp.o 0x0080018e TCP_Socket .data 0x00800190 0x1 mmc.o .data 0x00800191 0x2d logger.o .data 0x008001be 0xa ff.o .data 0x008001c8 0x4 C:/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5\libc.a(rand.o) *(.gnu.linkonce.d*) 0x008001cc . = ALIGN (0x2) 0x008001cc _edata = . 0x008001cc PROVIDE (__data_end, .)
.bss 0x008001cc 0x13d6 0x008001cc PROVIDE (__bss_start, .) *(.bss) .bss 0x008001cc 0xc common.o 0x008001d5 TimerIntCounter 0x008001cd UART0_RxBufferRd 0x008001cf UART1_RxBufferRd 0x008001ce UART0_RxBufferWr 0x008001d7 LastResetReason 0x008001d1 MainBufferWr_Tx 0x008001d3 MainBufferRd_Rx 0x008001cc GPSModeSet 0x008001d0 UART1_RxBufferWr 0x008001d6 WatchdogCounter .bss 0x008001d8 0x2 icmp.o 0x008001d8 ICMP_Header .bss 0x008001da 0x4 ppp.o 0x008001da CodeHeader 0x008001dc PPPHeader .bss 0x008001de 0x4 tcp.o 0x008001e0 TCP_TmpPort 0x008001de TCP_Header .bss 0x008001e2 0x2 udp.o 0x008001e2 UDP_Header .bss 0x008001e4 0x2 mmc.o .bss 0x008001e6 0x899 logger.o .bss 0x00800a7f 0xc time.o .bss 0x00800a8b 0x4 ff.o *(COMMON) COMMON 0x00800a8f 0x5 at.o 0x00800a8f AT COMMON 0x00800a94 0x642 common.o .... Что скажете? ХЕЛП!
|
|
|
|
|
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(). Анатолий.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|