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

AlphaLaiman

Участник
  • Постов

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

  • Посещение

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


  1. Cекцию .httpContent в исключения попробуй.

     

    Огромное спасибо, это помогло!

     

    Кстати, вопрос топикстартеру. Зачем вы код в RAM тянете? Не знаю на каком чипе вы работаете, но почти уверен что у него отдельная шина к flash. Вешая код и данные на одну шину можно потерять в скорости, осоюенно если туда DMA запустить. Да и просто, RAM лишняя не бывает.

     

    STM32F4. Обычно этого не делаю, но тут довольно специфическая задача - разрабатываю OSD контроллер для VGA. Картинка отправляется построчно с помощью SPI пина MOSI. Для этого задействован DMA. Так вот при работе из Flash картинка на экране искажается, некоторые строки сдвигаются, особенно если что-то писать в буфер, где хранится картинка. Я не знаю точно, что служило причиной этому, но запуск из RAM исправил ситуацию. Тем более, я еще задействовал ремаппинг, поэтому время выполнения кода по сравнению с flash не ухудшилось

  2. Но я ведь вроде все также сделал, как у Вас. Может, Вы не все показали?

     

    Инициализация массива:

    static BYTE const font[] @ ".httpContent" = {
    #include "table_char_5x7.h"
    };

     

    icf файл:

    /*###ICF### Section handled by ICF editor, don't touch! ****/
    /*-Editor annotation file-*/
    /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x08000000;
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__    = 0x08000000;
    define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
    define symbol __ICFEDIT_region_RAM_start__    = 0x00000000;
    define symbol __ICFEDIT_region_RAM_end__      = 0x0002FFFF;
    define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
    define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
    /*-Sizes-*/
    define symbol __ICFEDIT_size_cstack__ = 0x2000;
    define symbol __ICFEDIT_size_heap__   = 0x2000;
    /**** End of ICF editor section. ###ICF###*/
    
    /* intvec location in RAM after remapping in SystemInit */
    define symbol RAM_intvec_start = 0x00000000;
    
    define memory mem with size = 4G;
    define region FLASHC_regionC  = mem:[from 0x08080000   to __ICFEDIT_region_ROM_end__];
    define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to 0x0807FFFF];
    define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
    define region CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];
    
    define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
    define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
    
    initialize by copy { readonly, readwrite };
    
    do not initialize  { section .noinit };
    
    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
    place at address mem:RAM_intvec_start { section .intvec_RAM };
    /*place at address mem:RAM_intvec_start { readonly section .intvec };*/
    
    place in FLASHC_regionC  { section .httpContent};
    place in ROM_region   { readonly };
    place in RAM_region   { readwrite };
    place in CCMRAM_region { section .ccmram, block CSTACK, block HEAP };

  3. Так ищите где у Вас косяк

    При замене Вашего кода

    .cpp:
    static char const t[] @ ".httpContent" = {...};

     

    например на

     

    .cpp:
    static char const t[] @ ".ccmram" = {...};

    все работает. Но ccmram тоже не хочется забивать этим массивом

     

     

    Предлагаю заглянуть в .map файл.

     

    Если воспользоваться советом jcxz, то в map файле следующее:

    "P1":                                                  0x207c
      P1 s0                           0x08000190   0x207c  <Init block>
        .httpContent    inited   0x08000190   0x207c  graphics.o [1]
                                       - 0x0800220c   0x207c

    вроде тут все норм

  4. Попробовал, результат следующий: в отладчике массив лежит во Flash, как и хотелось, но теперь другой косяк - вместо значений из .cpp файла в нем одни нули

    UPD: а иногда одни 0xFF

  5. Перенести этот массив во FLASH-регион описанный в .icf.

    Вот я и пытаюсь понять, как это сделать, чтобы не копировалось. Пробовал, например, #pragma location = ".rodata", не помогает

    .icf файл.:

    /*###ICF### Section handled by ICF editor, don't touch! ****/
    /*-Editor annotation file-*/
    /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x08000000;
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__    = 0x08000000;
    define symbol __ICFEDIT_region_ROM_end__      = 0x080FFFFF;
    define symbol __ICFEDIT_region_RAM_start__    = 0x00000000;
    define symbol __ICFEDIT_region_RAM_end__      = 0x0002FFFF;
    define symbol __ICFEDIT_region_CCMRAM_start__ = 0x10000000;
    define symbol __ICFEDIT_region_CCMRAM_end__   = 0x1000FFFF;
    /*-Sizes-*/
    define symbol __ICFEDIT_size_cstack__ = 0x2000;
    define symbol __ICFEDIT_size_heap__   = 0x2000;
    /**** End of ICF editor section. ###ICF###*/
    
    /* intvec location in RAM after remapping in SystemInit */
    define symbol RAM_intvec_start = 0x00000000;
    
    define memory mem with size = 4G;
    define region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
    define region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];
    define region CCMRAM_region   = mem:[from __ICFEDIT_region_CCMRAM_start__   to __ICFEDIT_region_CCMRAM_end__];
    
    define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
    define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
    
    initialize by copy { readonly, readwrite };
    
    do not initialize  { section .noinit };
    
    place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
    place at address mem:RAM_intvec_start { section .intvec_RAM };
    /*place at address mem:RAM_intvec_start { readonly section .intvec };*/
    
    place in ROM_region   { readonly };
    place in RAM_region   { readwrite };
    place in CCMRAM_region { section .ccmram, block CSTACK, block HEAP };

     

  6. Реализовал выполнение кода из ОЗУ на STM32, отредактировав .icf файл. Вопрос в следующем: у меня в коде присутствует большой константный массив данных (картинка). Как мне сказать компилятору, чтобы он не копировал её в оперативку и не забивал память почем зря?

  7. Курок вы ещё не спустили, но карабин в сторону голеностопа уже направили. Линкер справился бы с этим не хуже, размещая статические объекты.

     

     

    Полноценная поддержка кучи достаточно дорогое удовольствие, а упрощённые её реализации дают неэффективное использование памяти.

     

    Всем спасибо за помощь, буду использовать статические

  8. Так уберите из new функцию выделения памяти, оставьте только вызов конструктора. Читайте что такое placement new. А потом выделяйте память где душе угодно.

     

    PS: А вообще - для embedded-применений лучше не использовать без динамическую память. Без лишней необходимости.

    Спасибо, placement new помогло. А почему динамическую лучше не использовать?

  9. Пишу на C++ под STM32. Проблема в следующем - пытаюсь задействовать в проекте одновременно CCMRAM и DMA. Соответствующим образом скорректировал .icf файл, без DMA все работает, все объекты создаются в памяти CCMRAM.

    Но, как известно, DMA-контроллер не работает с памятью, размещенной в области CCMRAM. Как мне сделать так, чтобы нужные мне объекты классов, которые я собираюсь использовать с DMA, создавались оператором new не в CCMRAM, а в обычной RAM?

    Всякие #pragma location не помогают

  10. Требование х86 - обязательное? Проще и дешевле использовать, например, Raspberry PI

    Что-то вроде такого:

    http://www.aliexpress.com/item-img/Raspber...368095026.html#

     

    Пишите, сделаем! [email protected]

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