Разобрался как работать с внешней SDRAM, + как сказать компилятору ее размер (до 64КБ). Заморока теперь такая - При старте программы, в адресах близ 4352 (то есть на дне ВНУТРЕННЕЙ SDRAM) располагается используемая область. Вероятно это "стек" программы. Если задаем массив - граница данных приближается к стеку. При большом размере массива, например - byte Buffer[8192] ; компиляция идет без ошибок и алармов, но программа сбоит. Очевидно происходит наползание массива на стек. Вопрос - как вынести стек за пределы внутренней ОЗУ - во внешнюю SDRAM ? Очевидно какой-то директивой компилятора ??? Не ??? Какую строчку надо добавлять в скетч ? С уважением. ПС. Заказал с Али платки для ATmega128. Прилетели за две недели !!! Качество отличное. Теперь есть желание собрать свою разновидность Ардуины.
В Atmel Studio, когда пишеш на ASM , вершина стека задаётся "дном" RAM памяти. Эта величина, RAMEND, хранится в inc файле, который подключается к проекту вручную. Для каждого МК свой файл. Где эта величина хранится в Arduino IDE надо искать.
Бог с ней с вершиной. Как заставить компилятор вынести стек во внешнюю память ? Какой директивой ? Как вставить эту директиву в ардуиновский скетч ? Это возможно по ДШ -
Стек можно расположить в любом месте RAM. Вот это и задаётся вершиной стека. Как я понимаю, при подключении внешней SDRAM адресация оперативной памяти остаётся сквозной. Какой у вас получается последний адрес SDRAM с подключённой внешней?
Источник. Я так понял это можно воткнуть как ассемблерную вставку перед основным кодом, но лучше найти *.inc фаил и править его. Код (C++): ldi temp, LOW(RAMEND) ;Указатель стека указывает out SPL, temp ;на последний адрес ОЗУ ldi temp, HIGH(RAMEND) ;out SPH, temp ;!!! Не для всех моделей МК
1. Естественно так - в ассемблере. ЯВУ это делают автоматом, исполняя бог его знает что - директивы или настройки в .inc-файлах. Тупо воткнуть ассемблерную вставку в код - вряд ли сработает - компилятор ЯВУ так же тупо выставит стек где ЕМУ надо. 2. Да адресация памяти сквозная. Конечный адрес - будет зависеть от микры памяти. Пока изучаю теорию - в Протеусе. Пока нет уверенности в программном решении - нет смысла разрабатывать железо. ПС. Али быстро (2 нед) и не дорого доставляет отличные плАтки для АТмега128. Можно делать свою Ардуину. Правда разработчики здорово тупанули - Разъем внешнего питалова через кнопку пустили на шину +5В. Прямая дорога спалить процессор. Поэтому вместо кнопки - ставим диод и стабилизатор напряжения 7-15v / 5v .
1.Вы в какой среде собираетесь писать? 2. Если в Arduino IDE - inc файлы вам не к чему. Данные о МК закопаны где-то в её недрах. По крайней мере я не знаю где храняться. Но на сколько я знаю, ATmega128 там не поддерживается. Могу конечно ошибаться. 3. Если работаете в Atmel Studio то можно подправить существующий inc или создать его копию с небольшим изменением в названии и подключать к проекту свой файл. Файл правится в блокноте без проблем. Только там две величины Я честно не знаю что за величина XRAMEND. Я с этим камнем не работал. Нужно ДШ смотреть. А вот RAMEND = 0x10ff вполне соответствует вашему 4. Можно, как вам советовали, сделать ассемблерную вставку. Для указания места расположения стека достаточно адрес конца SDRAM записать в SPL и SPH. Да, компилятор создаст и вставит в код свою инициализацию стека в соответствии с концом внутренней SDRAM, но если после этого вы перепишете инициализацию на конец внешней SDRAM, то стек будет там. По этому я и спрашивал вас В вобщем решений вашей проблемы множество. И, к стати, директивы тут совсем ни при чём. Это совсем другая история.
1. Надо установить платформу MegaCore - она поддерживает АТмега128 в том числе. 2. XRAM - это и есть внешняя память (eXternal RAM). 3. Вероятно можно в начале кода установить SPL и SPH и без ассемблера. Но это надо делать очевидно не в скетче (язык Wiring), а грузить в Ардуино ИДЕ полноценный С++ файл с функцией main(). А я пока этого не умею. ПисАл же, что знаком с Си только по скетчам Ардуино ИДЕ. Пробовал в начале скетча выставить SP как мне надо - нет стек остается в районе 4352.
Виноват. Заблудился в соснах. Короче - соврал. Идея была выставить регистры SPL, SPH либо перед процедурой setup(). Но оно не компилируется. Либо в начале процедуры setup() - но это приводит к сбою программы. Тупо ошибся - вместо SPH = 0xFF; ставил SPH = 0x10; Оно тоже приводит к сбою, но не сразу. Куда ассемблерная вставка ? в ардуиновский скетч ? Команды SPH = 0xFF; SPL = 0xFF; сделают ровно то же самое. Если знаете решение - выложьте код, пожалуйста. Тут пяток строчек всего, как я понимаю.
То, что компилятор заругался на вашу попытку вставить операции присвоения до функции setup() это ожидаемо. Так делать нельзя. Немного поэксперементировал в протеусе. Создал в ардуино пустой скетч. Скомпилировал hex файл для arduino uno. Вкинул в протеусе Atmega 328P., залил в него прошивку. На старте в указателе стека как и положено 0x08FF. Потом меняется на 0x08FD. Ну это не так важно, это заумный ардуиновский скетч что-то туда пихает. Добавил в пустой скетч две строки. Значения взял наугад, лиш-бы в пределах адресов SRAM Код (C++): void setup() { // put your setup code here, to run once: SPL = 0x10; SPH = 0x07; } void loop() { // put your main code here, to run repeatedly: } Запустил. Теперь в указателе стека лежит 0x0710. Как-бы метод рабочий. Поясните, каким образом у вас получилось
1. Здесь в этой же ветке страница 3, Тема - " Как сказать компилятору размеры... ", сообщение 6. 2. Возможно у вас получилось потому что скетч пустой. А если бы вы до setup() подключили библиотеки Сериала, ЛСД дисплея и тд.Они ведь наверняка стек раньше съиспользуют. Я так пробовал в Протеусе, на Атмега128, - аварийно вылетает, об этом тут в #10.
Вы не совсем правильно понимаете как работают библиотеки. Когда вы директивой, ну скажем Код (C++): #include <LiquidCrystal.h> подключаете библиотеку, в исполняемый код ничего не транслируется. Вы объясняете клипилятору, что при компиляции нужно будет использовать данный файл. Потом вы поясняете компилятору как и с какими параметрами выдёргивать из библиотеки функции. Код (C++): const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); И опять в код ничего не транслируется. и только когда вы вызываете функцию из библиотеки, ну скажем Код (C++): lcd.begin(16, 2); в коде появляется что-то исполняемое. Всё, что вы пишете до setup() - это ваши пожелания для компилятора как надо скомпилировать скетч. Всё это ни как стек не использует. По поводу Посмотрю после работы. Вчера посмотрел этот вопрос в интернете, есть много нюансов в настройке камня для работы с внешней памятью. Может кто из форумчан в этом уже разобрался и подскажет как там организовуется адресация памяти.
там перед сетапом идет еще пара функций, в которых всякие там таймеры настраиваются и прочее. в avr\cores\arduino лежит файл main.cpp
Можете скинуть мне на мыло tab58293@rambler.ru проект из протеуса с подключенной внешней памятью. Хочу поэксперементировать со стеком в ассемблере.
Да никак она (адресация) не организуется. Просто продолжается после адреса 4352. Все что нужно, чтобы включить интерфейс внешней памяти. Код (C++): DDRC = 0xFF; // Port direction is OUTPUT PORTC = 0x00; // MCUCR = B11000000; // External memory interface enable XMCRA = B00001110; // Wait two cickles XMCRB = B10000000; // Нам нужны Все разряды адреса Поэтому физически первые 4352 байта микры внешней памяти остаются пустые. ПС. Отправил в почту протеусный проект и картинку. Пользуйтесь на здоровье. ППС. Не пробуйте убрать цепи задержки на пАрах инверторов. Работать перестанет. Я мозги себе пропарил, пока понял что их надо воткнуть..
Не поделитесь результатами экспериментов ? Вот вернулся к теме выноса стека во внешнюю память ATmega128.
Не получилось разобраться. Сначала протеус выделывался. При запуске вашего проекта почему-то вылетал с ошибкой. Потом возникли проблемы с компьютером. После ремонта переустанавливал винду и файлы потерялись. Так и забылось.
А мне надоело пенсионерить, устроился ремонтировать электронику на заводе. Так понравилось, что больше ничем не занимался всю осень. Теперь захотелось продолжить Ардуинные дела. Вопрос - как компилятору задают адрес, куда поместить стек ? Оченно хотелось бы увидеть пример строки-директивы с этой командой. Разработчики компиляторов AVR наверняка знают про внешнюю память и придумали директивы. Наверняка и компилятор Ардуин их понимает. ПС. Естественно Протеус вылетал с ошибкой - я не вставлял в проект для вас хекс-файл для АВР-а. А коль в проекте процессор - Протеусу вынь и положь хекс-файл