Перейти к содержанию
    

vik0

Свой
  • Постов

    381
  • Зарегистрирован

Сообщения, опубликованные vik0


  1. при использовании обычного объявления массива (например: char m)-линкер создаёт огроменный hex-файл образа программы с заполненными нулями в некоторых адресах.

    как добиться,чтобы линкер не делал так, тоесть массив не инициализирован,указатель хранить по адресу за программой.

    Как-то так:

    sdram_no_init NO_INIT {
      INPUT_SECTION_ALIGN(4)
      INPUT_SECTIONS($OBJECTS(sdram_no_init))
    }>MEM_SDRAM_BANK3

    #pragma section("sdram_no_init", NO_INIT)
    char m[size];

    как разместить стек,кучу в scratchpad?

    объявлена секция в лдф-файле,а линковщик упорно её избегает!

    Видимо неправильно объявлена. Для стека:

    scratchpad
    {
      INPUT_SECTION_ALIGN(4)
      RESERVE(heaps_and_stack_in_SCRATCHPAD, heaps_and_stack_in_SCRATCHPAD_length = 2K,4)
      RESERVE_EXPAND(heaps_and_stack_in_SCRATCHPAD, heaps_and_stack_in_SCRATCHPAD_length , 0, 4)
      ldf_stack_space = heaps_and_stack_in_SCRATCHPAD;
      ldf_stack_end = (ldf_stack_space + (((heaps_and_stack_in_SCRATCHPAD_length * 2K) / 2K) - 4)) & 0xfffffffc;
    } > MEM_L1_SCRATCH

    программа скомпилированная без оптимизации не запускается!

    стоит задать максимальную оптимизацию- сразу работает.

    почему?

    Включив телепатические способности, рискну предположить что у вас ошибка в строке 123 в файле foo.c

    Шутка.

    По поводу глюков - в 5.0 с парой апдейтов Expert Linker у меня так и не заработал, помучался я с ним, плюнул, и остался на 4.5

    А редактировать .ldf в текстовом виде уже не гламурно? ;)

    надо попробовать 4.5 как вы посоветовали ;)

    99.9% - не поможет. Ищите ошибки в своем коде.

  2. нужно ли кешировать data L1, code L1 ?

    Зачем? :07: L1 и так работает на частоте ядра

    где лучше разместить стек - в write-back SDRAM, cached L1 или в scratchpad ?

    где будет быстрее?

    Не в SDRAM однозначно. Если хватит 4к под стек (мне до сих пор хватало) - тогда в scratchpad. Если мало - в некэшируемой L1.

    По скорости L1 и scratchpad одинаковы.

  3. Вопросы:

    1. Правильны ли те мои действия, кот я описал выше?

    2. Как сформировать .ldr файл? .dxe файлы в папке проекта вижу, а .ldr нет.

    3. В настройках ldf я поставил галку использовать внешнюю память SDRAM. Я так понял linker сам раскидает что грузить в L1, что в SDRAM, так?

    Здравствуйте.

    1. Да, все правильно

    2. В окне Project Options поменять тип проекта (см. рис), и пересобрать проект.

    3. Да

    И потом, разрешать кеш данных...?

    Часто правильная организация потоков DMA позволяет обойтись без использования кэша данных.

    post-39233-1237382699_thumb.png

  4. мой загрузчик(который ldr, торчащий в L1, инициализирующий всё и грузящий в SDRAM) сам передаст управление на загруженный код в SDRAM

    Тогда в чем проблема? Как "прыгнуть" в SDRAM?

    разместить кучу, стек, интеррупт хэндлеры

    Не путайте мухи и котлеты. Кучу и стек в памяти программ вы не разместите. Интеррупт хэндлеры займут намного меньше чем 32кб. Зачем пихать всю програму в SDRAM?

    Код явно превышает 48кБ, а делить его и резать напообие оверлеев не совсем хочется.

    Нужен шустрый вычислитель

    Не режьте. Разместите критичные к скорости выполнения куски в L1 принудительно, код инициализации - в SDRAM (принудительно). Остальное оставьте на усмотрение линкера. И включите кэш. Все.

  5. проблема не в написании загрузчика, а в создании приложения, которое было бы с конкретно указанного адреса.

    Приложение НЕ МОЖЕТ стартовать с произвольного адреса. Либо с 0х20000000 (в режиме bypass), либо с начала L1 code. Все, других вариантов нет.

    нужно создать приложение, чтобы оно лежало уже в SDRAM и исполнялось там полностью!

    Вы можете объяснить зачем вам это нужно?? Что вы собираетесь делать с 32 (а то и 48, если не использовать кэш) килобайтами очень быстрой памяти програм? Зачем вам ставить 400 МГц DSP и сразу на корню убивать всю его производительность, исполняя код из тормозной SDRAM?? Видимо я что-то в этом мире не понимаю :wacko:

    Предлагаю уделить своё внимание SSL(Second Stage Loader)

    SSL - это специальный "костыль" для загрузки двухядерников, и AFAIK, в одноядерных финах он не поддерживается.

  6. 1) вначале в L1 грузится и исполняется инит-часть (включая инициализацию SDRAM)

    2) затем в SDRAM по адресу 0x00000000 грузится приложение

    3) инициализация SDRAM в виде функции на языке Си

    1 и 2. Смотрите пример из поста uriy.

    3. Увы, нет. Только для 54х семейства.

    там только можно L1 или 0x20000000(8bit flash)

    при задании других адресов - ошибка линкера (см. посты выше)

    Разместите в L1 main() и из нее вызывайте свой UserMain(), расположенный в SDRAM.

  7. может конденсатор в цепи сброса взять больше?

    Эээ. Простите, а вы и для фина reset формируете с помощью RC-цепочки?

    сможет ли блекфин нормально грузиться с еепром при подтяжках на miso/sck 100ком?, 43ком?

    Не вижу препятствий.

  8. Вы просто не умеете готовить plain C:

    Умею. Но просто мне больше по вкусу С++ :)

    ...

    Как видите, все намного проще :)

    Согласен. Я и не утверждал что это нельзя сделать на С. Просто (лично мне) С++ вариант кажется более изящным, что ли. А оверхеда (о чем, собственно, изначально и шла речь) он не вносит.

  9. Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "The Annotated C++ Reference Manual"..

    Нет, я говорю о The Design and Evolution of C++

    А че там?

    История развития языка с подробным описанием того, почему основные функции реализованы именно так, а не иначе.

    он скрывает связь с ресурсами - например внутри конструктора может быть другой new

    что сразу не очевидно.

    Ага. А на чистом "С" внутри функции типа InitSomething() не может быть вызвана InitSomethingElse() и, даже (о ужас!!), malloc??...

    Операторы могут быть переопределены...

    Ну и отлично! Лично я предпочту написать:

    complex a, b, c, d;
    ....
    a += b - c*d;

    а не:

    a = complex_add(a, complex_sub(b, complex_mul(c, d)));

    ...и получить на выходе тот же самый код.

    Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д.

    Ну и отлично! Лично я предпочту написать:

    int DoSomething()
    {
      CriticalSection cs;
      ...bla-bla-bla...
      if (foo)
        return 1;
      ...bla-bla-bla...
      if (bar)
        return 2;
      ...bla-bla-bla...
      if (baz)
        return 3;
      ...bla-bla-bla...
      return 0;
    }

    а не:

    int DoSomething()
    {
      DisableInterrupts();
      ...bla-bla-bla...
      if (foo) {
        RestoreInterrupts();
        return 1;
      }
      ...bla-bla-bla...
      if (bar) {
        RestoreInterrupts();
        return 2;
      }
      ...bla-bla-bla...
      if (baz) {
        RestoreInterrupts();
        return 3;
      }
      ...bla-bla-bla...
      RestoreInterrupts();
      return 0;
    }

    ...и получить на выходе (извините за самоцитирование :laughing: ) тот же самый код.

     

     

     

    Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать?

    +100

  10. Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные

    накладные расходы, предоставляя взамен кучу не всегда нужных фич.

    А вот людей которые могут не купиться на эти ненужные вещи не так уж и много...

    Согласен. Все упирается в поиск баланса - чем вы готовы пожертвовать ради упрощения процесса разработки. Правда это подразумевает неплохое (как минимум) знание языка. С++ - сложный инструмент. А для эффективного использования любого сложного инструмента необходимо его хорошее знание и понимание.

  11. Я так понял, что он вообще говоря немного устарел?

    Нет, почему же? Для своего класса задач вполне неплохое ядрышко.

    На чем вообще лучше учиться?

    Чему?

    И есть ли открытые ядра посложнее - например, чтобы можно было на С программы писать??

    http://opencores.org/?do=projects&cat=...y&stage=any

    На любой вкус и цвет. :rolleyes:

  12. расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн.

    У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете".

    Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует).

  13. ...буду рад если подскажете, где могут ждать неприятности...

    http://www.analog.com/static/imported-file...evE.10.8.08.pdf

    Аномалия 05000311.

    И вообще крайне желательно внимательно изучить данный документ. Все (известные на данный момент :) ) аппаратные "грабли" там расписаны.

  14. По-хорошему, код инициализации внешней шины лучше выполнять глобально. Ну не должен драйвер периферийного устройства знать подробности внешнего подключения данного устройства, не должен.

     

    Vik, Boom - cпасибо огромное за подсказки...

    Всегда пожалуйста :)

  15. Ничего модифицировать не надо.

    Достаточно правильно настроить EBIU (указать на необходимость работы с нужным банком асинхронной памяти в 16-ти битном режиме - биты 4-7 регистра EBIU_AMGCTL)

  16. А вам точно нужна плата на этом старье? Я бы делал макетку с 214х.

    По теме. Вы уверены что вам вообще нужно преобразовывать уровни? 90% ЖКИ вполне нормально воспринимают 3В сигналы.

    Если таки нужно преобразование - 74LVC4245 вам поможет.

  17. Коллега недавно "мучал" кит с 548-м.

    Вроде громко не ругался - рискну предположить что серьзных проблем не было :laughing:

    PPI "завелся" без проблем, USB нам не интересно. Выйдет из отпуска (через 2 недели) - узнаю подробней.

    PS. Anomaly list, надеюсь, читали?

  18. В исходниках libdsp, входящей в состав VisualDSP++.

    Информация для real FFT, к примеру:

    Cycles : Overhead of 25 cycles (n=0) and approximately nlogn (base 2) with the

    exact numbers for n=32 to n=8192 below:

    ~ for n=32, number of cycles = 390

    ~ for n=64, number of cycles = 498

    ~ for n=128, number of cycles = 1211

    ~ for n=256, number of cycles = 2179

    ~ for n=512, number of cycles = 5111

    ~ for n=1024, number of cycles = 10225

    ~ for n=2048, number of cycles = 23315

    ~ for n=4096, number of cycles = 47754

    ~ for n=8192, number of cycles = 106817

  19. Киты - для студентов, которые хотят повторить какой-нибудь экзампл, но руки кривоваты.

    Вы видели "кит" по ссылке HardJoker-а? Хочу я посмотреть на студента с этим "китом" и на его "экзампл" :07:

×
×
  • Создать...