Вопрос по стэку компилятора для atmega128.

Тема в разделе "Arduino & Shields", создана пользователем Ariadna-on-Line, 7 авг 2021.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Разобрался как работать с внешней SDRAM, + как сказать компилятору ее размер (до 64КБ).
    Заморока теперь такая - При старте программы, в адресах близ 4352 (то есть на дне ВНУТРЕННЕЙ SDRAM) располагается используемая область. Вероятно это "стек" программы. Если задаем массив - граница данных приближается к стеку. При большом размере массива, например -
    byte Buffer[8192] ;
    компиляция идет без ошибок и алармов, но программа сбоит. Очевидно происходит наползание массива на стек.
    Вопрос - как вынести стек за пределы внутренней ОЗУ - во внешнюю SDRAM ? Очевидно какой-то директивой компилятора ??? Не ??? Какую строчку надо добавлять в скетч ? С уважением.
    ПС. Заказал с Али платки для ATmega128. Прилетели за две недели !!! Качество отличное. Теперь есть желание собрать свою разновидность Ардуины.
     
    Последнее редактирование: 7 авг 2021
  2. a1000

    a1000 Гуру

    В Atmel Studio, когда пишеш на ASM , вершина стека задаётся "дном" RAM памяти. Эта величина, RAMEND, хранится в inc файле, который подключается к проекту вручную. Для каждого МК свой файл. Где эта величина хранится в Arduino IDE надо искать.
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Бог с ней с вершиной. Как заставить компилятор вынести стек во внешнюю память ? Какой директивой ? Как вставить эту директиву в ардуиновский скетч ? Это возможно по ДШ -
     

    Вложения:

  4. a1000

    a1000 Гуру

    Стек можно расположить в любом месте RAM. Вот это и задаётся вершиной стека. Как я понимаю, при подключении внешней SDRAM адресация оперативной памяти остаётся сквозной. Какой у вас получается последний адрес SDRAM с подключённой внешней?
     
  5. Un_ka

    Un_ka Гуру

    Источник.
    Я так понял это можно воткнуть как ассемблерную вставку перед основным кодом, но лучше найти *.inc фаил и править его.
    Код (C++):
    ldi temp, LOW(RAMEND) ;Указатель стека указывает
    out SPL,  temp        ;на последний адрес ОЗУ
    ldi temp, HIGH(RAMEND)
    ;out SPH,  temp       ;!!! Не для всех моделей МК
     
    Ariadna-on-Line нравится это.
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Естественно так - в ассемблере. ЯВУ это делают автоматом, исполняя бог его знает что - директивы или настройки в .inc-файлах.
    Тупо воткнуть ассемблерную вставку в код - вряд ли сработает - компилятор ЯВУ так же тупо выставит стек где ЕМУ надо.
    2. Да адресация памяти сквозная. Конечный адрес - будет зависеть от микры памяти. Пока изучаю теорию - в Протеусе. Пока нет уверенности в программном решении - нет смысла разрабатывать железо.
    ПС. Али быстро (2 нед) и не дорого доставляет отличные плАтки для АТмега128. Можно делать свою Ардуину. Правда разработчики здорово тупанули - Разъем внешнего питалова через кнопку пустили на шину +5В. Прямая дорога спалить процессор. Поэтому вместо кнопки - ставим диод и стабилизатор напряжения 7-15v / 5v .
     
    Последнее редактирование: 15 авг 2021
  7. a1000

    a1000 Гуру

    1.Вы в какой среде собираетесь писать?
    2. Если в Arduino IDE - inc файлы вам не к чему. Данные о МК закопаны где-то в её недрах. По крайней мере я не знаю где храняться. Но на сколько я знаю, ATmega128 там не поддерживается. Могу конечно ошибаться.
    3. Если работаете в Atmel Studio то можно подправить существующий inc или создать его копию с небольшим изменением в названии и подключать к проекту свой файл. Файл правится в блокноте без проблем. Только там две величины
    Я честно не знаю что за величина XRAMEND. Я с этим камнем не работал. Нужно ДШ смотреть. А вот RAMEND = 0x10ff вполне соответствует вашему
    4. Можно, как вам советовали, сделать ассемблерную вставку. Для указания места расположения стека достаточно адрес конца SDRAM записать в SPL и SPH. Да, компилятор создаст и вставит в код свою инициализацию стека в соответствии с концом внутренней SDRAM, но если после этого вы перепишете инициализацию на конец внешней SDRAM, то стек будет там. По этому я и спрашивал вас
    В вобщем решений вашей проблемы множество. И, к стати, директивы тут совсем ни при чём. Это совсем другая история.
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Надо установить платформу MegaCore - она поддерживает АТмега128 в том числе.
    2. XRAM - это и есть внешняя память (eXternal RAM).
    3. Вероятно можно в начале кода установить SPL и SPH и без ассемблера. Но это надо делать очевидно не в скетче (язык Wiring), а грузить в Ардуино ИДЕ полноценный С++ файл с функцией main(). А я пока этого не умею. ПисАл же, что знаком с Си только по скетчам Ардуино ИДЕ.
    Пробовал в начале скетча выставить SP как мне надо - нет стек остается в районе 4352.
     
  9. a1000

    a1000 Гуру

    Покажите как вы это делали.
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Виноват. Заблудился в соснах. Короче - соврал. Идея была выставить регистры SPL, SPH либо перед процедурой setup(). Но оно не компилируется. Либо в начале процедуры setup() - но это приводит к сбою программы. Тупо ошибся - вместо SPH = 0xFF; ставил SPH = 0x10; Оно тоже приводит к сбою, но не сразу.

    Куда ассемблерная вставка ? в ардуиновский скетч ? Команды SPH = 0xFF; SPL = 0xFF; сделают ровно то же самое.
    Если знаете решение - выложьте код, пожалуйста. Тут пяток строчек всего, как я понимаю.
     
    Последнее редактирование: 16 авг 2021
  11. a1000

    a1000 Гуру

    То, что компилятор заругался на вашу попытку вставить операции присвоения до функции 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. Как-бы метод рабочий.
    Поясните, каким образом у вас получилось
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    1. Здесь в этой же ветке страница 3, Тема - " Как сказать компилятору размеры... ", сообщение 6.
    2. Возможно у вас получилось потому что скетч пустой. А если бы вы до setup() подключили библиотеки Сериала, ЛСД дисплея и тд.Они ведь наверняка стек раньше съиспользуют. Я так пробовал в Протеусе, на Атмега128, - аварийно вылетает, об этом тут в #10.
     
    Последнее редактирование: 17 авг 2021
  13. a1000

    a1000 Гуру

    Вы не совсем правильно понимаете как работают библиотеки. Когда вы директивой, ну скажем
    Код (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() - это ваши пожелания для компилятора как надо скомпилировать скетч. Всё это ни как стек не использует.
    По поводу
    Посмотрю после работы. Вчера посмотрел этот вопрос в интернете, есть много нюансов в настройке камня для работы с внешней памятью. Может кто из форумчан в этом уже разобрался и подскажет как там организовуется адресация памяти.
     
  14. akl

    akl Гуру

    там перед сетапом идет еще пара функций, в которых всякие там таймеры настраиваются и прочее.
    в avr\cores\arduino лежит файл main.cpp
     
    Ariadna-on-Line нравится это.
  15. a1000

    a1000 Гуру

    Можете скинуть мне на мыло tab58293@rambler.ru проект из протеуса с подключенной внешней памятью. Хочу поэксперементировать со стеком в ассемблере.
     
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Да никак она (адресация) не организуется. Просто продолжается после адреса 4352.
    Все что нужно, чтобы включить интерфейс внешней памяти.
    Код (C++):
    DDRC = 0xFF;                    // Port direction is OUTPUT
    PORTC = 0x00;                   //
    MCUCR = B11000000;              // External memory interface enable
    XMCRA = B00001110;              // Wait two cickles
    XMCRB = B10000000;              // Нам нужны Все разряды адреса
     
    Поэтому физически первые 4352 байта микры внешней памяти остаются пустые.
    ПС. Отправил в почту протеусный проект и картинку. Пользуйтесь на здоровье.
    ППС. Не пробуйте убрать цепи задержки на пАрах инверторов. Работать перестанет. Я мозги себе пропарил, пока понял что их надо воткнуть..
     
    Последнее редактирование: 17 авг 2021
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не поделитесь результатами экспериментов ? Вот вернулся к теме выноса стека во внешнюю память ATmega128.
     
  18. a1000

    a1000 Гуру

    Не получилось разобраться. Сначала протеус выделывался. При запуске вашего проекта почему-то вылетал с ошибкой. Потом возникли проблемы с компьютером. После ремонта переустанавливал винду и файлы потерялись. Так и забылось.
     
  19. Un_ka

    Un_ka Гуру

     
  20. Ariadna-on-Line

    Ariadna-on-Line Гуру

    А мне надоело пенсионерить, устроился ремонтировать электронику на заводе. Так понравилось, что больше ничем не занимался всю осень. Теперь захотелось продолжить Ардуинные дела.
    Вопрос - как компилятору задают адрес, куда поместить стек ? Оченно хотелось бы увидеть пример строки-директивы с этой командой. Разработчики компиляторов AVR наверняка знают про внешнюю память и придумали директивы. Наверняка и компилятор Ардуин их понимает.
    ПС. Естественно Протеус вылетал с ошибкой - я не вставлял в проект для вас хекс-файл для АВР-а. А коль в проекте процессор - Протеусу вынь и положь хекс-файл
     

    Вложения:

    Последнее редактирование: 3 дек 2021