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

ADSP-21160 и malloc

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

Пришлось перелезать с 2181 на 21160 и возникает куча вопросов.

В среде VDSP 2.0 SHARK появилось очень многое. Например карта памяти (*.LDF)

Теперь, возникает простейшая задача, нужно разместить в памяти массив и с ним работать долгое время. Достался мне в наследство проект со статическими адресами. Теперь меня интересует, когда я пишу нечто:

 

double* v=(double *)malloc(KOL_ANGLE*urr[uRR_KKD]);

 

, где он разместит переменную v?

 

Привожу листинг LDF файла:

ARCHITECTURE(ADSP-21160)

// ADSP-21160 Memory Map:
//   ------------------------------------------------
//   Internal memory  0x0000 0000 to 0x000f ffff
//   ------------------------------------------------
//                    0x0000 0000 to 0x0000 0?ff  IOP Regs
//                    0x0000 0?00 to 0x0001 ffff  (reserved)
//           Block 0  0x0002 0000 to 0x0002 7fff  Long Word (64) Addresses
//           Block 1  0x0002 8000 to 0x0002 ffff  Long Word (64) Addresses
//                    0x0003 0000 to 0x0003 ffff  (reserved)
//           Block 0  0x0004 0000 to 0x0004 ffff  Normal Word (32/48) Addresses
//           Block 1  0x0005 0000 to 0x0005 ffff  Normal Word (32/48) Addresses
//                    0x0006 0000 to 0x0007 ffff  (reserved)
//           Block 0  0x0008 0000 to 0x0009 ffff  Short Word (16) Addresses
//           Block 1  0x000a 0000 to 0x000b ffff  Short Word (16) Addresses
//                    0x000c 0000 to 0x000f ffff  (reserved)
//   ------------------------------------------------
//   Multiproc memory 0x0010 0000 to 0x007f ffff
//   ------------------------------------------------
//                    0x0010 0000 to 0x001f ffff  Hammerhead ID=001 Internal memory
//                    0x0020 0000 to 0x002f ffff  Hammerhead ID=010 Internal memory
//                    0x0030 0000 to 0x003f ffff  Hammerhead ID=011 Internal memory
//                    0x0040 0000 to 0x004f ffff  Hammerhead ID=100 Internal memory
//                    0x0050 0000 to 0x005f ffff  Hammerhead ID=101 Internal memory
//                    0x0060 0000 to 0x006f ffff  Hammerhead ID=110 Internal memory
//                    0x0070 0000 to 0x007f ffff  Hammerhead ID=all Internal memory
//   ------------------------------------------------
//   External memory  0x0080 0000 to 0xffff ffff
//   ------------------------------------------------
//

SEARCH_DIR( $ADI_DSP\211xx\lib )

$LIBRARIES = system.dlb, libdsp160.dlb, lib160.dlb, libc160.dlb, libio160_32.dlb , libsdsp1.dlb, libsdsp2.dlb, libsdsp3.dlb;

$OBJECTS =  $COMMAND_LINE_OBJECTS;

MEMORY
{
    seg_rth  { TYPE(PM RAM) START(0x00040000) END(0x000400ff) WIDTH(48) }
    seg_init { TYPE(PM RAM) START(0x00040100) END(0x000401FF) WIDTH(48) }
    seg_pmco { TYPE(PM RAM) START(0x00040200) END(0x00049000) WIDTH(48) }
    seg_pmda { TYPE(PM RAM) START(0x0004e800) END(0x0004f3df) WIDTH(32) }
    seg_pm_cfdn_um{ TYPE(PM RAM) START(0x0004F3E0) END(0x0004F3FF) WIDTH(32) }
    seg_pm_cfdn { TYPE(PM RAM) START(0x0004F400) END(0x0004F5FF) WIDTH(32) }
    seg_pm_bs { TYPE(PM RAM) START(0x0004F600) END(0x0004F7FF) WIDTH(32) }
                seg_idat { TYPE(PM RAM) START(0x0004f800) END(0x0004ffff) WIDTH(32) }
                seg_in   { TYPE(DM RAM) START(0x00051000) END(0x000517ff) WIDTH(32) }
                seg_rdat { TYPE(DM RAM) START(0x00051800) END(0x00051bff) WIDTH(32) } 
    seg_dm_isr { TYPE(DM RAM) START(0x00054000) END(0x00054000) WIDTH(32) }
    seg_dm_cmd { TYPE(DM RAM) START(0x00054001) END(0x00054001) WIDTH(32) }
    seg_dm_state { TYPE(DM RAM) START(0x00054002) END(0x00054002) WIDTH(32) }
    seg_dm_source{ TYPE(DM RAM) START(0x00054003) END(0x00054003) WIDTH(32) }
    seg_dm_link_buf{ TYPE(DM RAM) START(0x00054004) END(0x00054004) WIDTH(32) }
    seg_dm_recieve_ack{ TYPE(DM RAM) START(0x00054005) END(0x00054005) WIDTH(32) }
    seg_dm_urr { TYPE(DM RAM) START(0x00054006) END(0x00054041) WIDTH(32) }
    seg_dm_akkr { TYPE(DM RAM) START(0x00054042) END(0x00054061) WIDTH(32) }
    seg_dm_aksr { TYPE(DM RAM) START(0x00054062) END(0x00054071) WIDTH(32) }
    seg_dm_upor { TYPE(DM RAM) START(0x00054072) END(0x000540B1) WIDTH(32) }
    seg_dm_apap { TYPE(DM RAM) START(0x000540B2) END(0x000540F1) WIDTH(32) }
    seg_dm_warning_excess { TYPE(DM RAM) START(0x000540F2) END(0x000540F2) WIDTH(32) }
    seg_dm_link_r{ TYPE(DM RAM) START(0x000545F3) END(0x000545F3) WIDTH(32) }
    seg_dm_adr_buf{ TYPE(DM RAM) START(0x000545F4) END(0x000545F4) WIDTH(32) }
    seg_dmda { TYPE(DM RAM) START(0x000545F5) END(0x00055FFF) WIDTH(32) }
    seg_twid { TYPE(DM RAM) START(0x00056000) END(0x00056fff) WIDTH(32) }
    seg_heap { TYPE(DM RAM) START(0x0005c000) END(0x0005dfff) WIDTH(32) }
    seg_addition { TYPE(DM RAM) START(0x0005e000) END(0x0005efff) WIDTH(32) }
    seg_stak { TYPE(DM RAM) START(0x0005f000) END(0x0005ffff) WIDTH(32) }
}

PROCESSOR p0
{
    LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST)
    OUTPUT( $COMMAND_LINE_OUTPUT_FILE )

    SECTIONS
    {
        // .text output section
        seg_rth
        {
            INPUT_SECTIONS( $OBJECTS(seg_rth) $LIBRARIES(seg_rth))
        } >seg_rth

        seg_init
        {
            INPUT_SECTIONS( $OBJECTS(seg_init) $LIBRARIES(seg_init))
        } >seg_init

        seg_pmco
        {
            INPUT_SECTIONS( $OBJECTS(seg_pmco) $LIBRARIES(seg_pmco))
        } >seg_pmco

        seg_addition
        {
            INPUT_SECTIONS( $OBJECTS(seg_addition) $LIBRARIES(seg_addition))
        } > seg_addition


        seg_pmda
        {
            INPUT_SECTIONS( $OBJECTS(seg_pmda) $LIBRARIES(seg_pmda))
        } >seg_pmda

        seg_pm_cfdn
        {
            INPUT_SECTIONS( $OBJECTS(seg_pm_cfdn) $LIBRARIES(seg_pm_cfdn))
        } >seg_pm_cfdn

        seg_pm_cfdn_um
        {
            INPUT_SECTIONS( $OBJECTS(seg_pm_cfdn_um) $LIBRARIES(seg_pm_cfdn_um))
        } >seg_pm_cfdn_um

        seg_pm_bs
        {
            INPUT_SECTIONS( $OBJECTS(seg_pm_bs) $LIBRARIES(seg_pm_bs))
        } >seg_pm_bs


        seg_dm_isr
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_isr) $LIBRARIES(seg_dm_isr))
        } > seg_dm_isr

        seg_dm_cmd
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_cmd) $LIBRARIES(seg_dm_cmd))
        } > seg_dm_cmd

        seg_dm_state
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_state) $LIBRARIES(seg_dm_state))
        } > seg_dm_state

        seg_dm_source
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_source) $LIBRARIES(seg_dm_source))
        } > seg_dm_source

        seg_dm_link_buf
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_link_buf) $LIBRARIES(seg_dm_link_buf))
        } > seg_dm_link_buf

        seg_dm_link_r
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_link_r) $LIBRARIES(seg_dm_link_r))
        } > seg_dm_link_r

        seg_dm_adr_buf
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_adr_buf) $LIBRARIES(seg_dm_adr_buf))
        } > seg_dm_adr_buf

        seg_dm_recieve_ack
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_recieve_ack) $LIBRARIES(seg_dm_recieve_ack))
        } > seg_dm_recieve_ack

        seg_dm_urr
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_urr) $LIBRARIES(seg_dm_urr))
        } > seg_dm_urr

        seg_dm_akkr
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_akkr) $LIBRARIES(seg_dm_akkr))
        } > seg_dm_akkr

        seg_dm_aksr
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_aksr) $LIBRARIES(seg_dm_aksr))
        } > seg_dm_aksr 

        seg_dm_upor
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_upor) $LIBRARIES(seg_dm_upor))
        } > seg_dm_upor

        seg_dm_apap
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_apap) $LIBRARIES(seg_dm_apap))
        } > seg_dm_apap

        seg_dm_warning_excess
        {
            INPUT_SECTIONS( $OBJECTS(seg_dm_warning_excess) $LIBRARIES(seg_dm_warning_excess))
        } > seg_dm_warning_excess


            seg_dmda
        {
            INPUT_SECTIONS( $OBJECTS(seg_dmda) $LIBRARIES(seg_dmda))
        } > seg_dmda

        seg_twid
        {
            INPUT_SECTIONS( $OBJECTS(seg_twid) $LIBRARIES(seg_twid))
        } > seg_twid

        seg_in
        {
            INPUT_SECTIONS( $OBJECTS(seg_in) $LIBRARIES(seg_in))
        } > seg_in

        seg_rdat
        {
            INPUT_SECTIONS( $OBJECTS(seg_rdat) $LIBRARIES(seg_rdat))
        } > seg_rdat

        seg_idat
        {
            INPUT_SECTIONS( $OBJECTS(seg_idat) $LIBRARIES(seg_idat))
        } > seg_idat

        stackseg
        {

            // allocate a stack for the application
            ldf_stack_space = .;
            ldf_stack_length = MEMORY_SIZEOF(seg_stak);
        } > seg_stak

        heap
        {
            // allocate a heap for the application
            ldf_heap_space = .;
            ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(seg_heap) - 1;
            ldf_heap_length = ldf_heap_end - ldf_heap_space;        
        } > seg_heap
    }
}

 

 

Я конечно могу писать в статические адреса, но не хочется так делать...........

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если переменная не локальная - долже в seg_dmda.

Вот только VDSP 2.0 SHARK версия уж больно старая...

 

А вообще можно было:

1) посмотреть док-ю;

2) скомпилить и глянуть где лежит.

И ещё, по ссылке:

http://ln.com.ua/~openxs/articles/smart-qu...-ru.html#before

Изменено пользователем Builder

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, уже так сделал, посмотрел в Карту памяти куда чего кладёт.

Согласен про версию 2,0, но если ставить новую версию, весь проект не компилируется, очень много ошибок. РАзбираться в чём дело времени нет. Любому начальнику наплевать, что у тебя стоит старая версия, ему подавай результат.

 

 

PS

А если не сложно, скажите ссылки на интересные конференции по ДСП программированию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счет того, что не компилится это зря у меня с 2-ки даже в 4-ке работет. А вообще malloc как впринципе и new все в heap кладет, если сами алтернативный heap не сделали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы очень правильно сказали, что у Вас компилится. Мой же проект использует стороннюю библиотеку, в которой и возникают проблеммы.

[Warning li2060] The following input section(s) that contain program code
        and/or data have not been placed into the executable for processor 'P0'
        as there are no relevant commands specified in the LDF:

        libc160.dlb[irptl.doj](seg_int_code)
[Error li1060] The following symbols are referenced, but not mapped:
        'modify_instr' referenced from libc160.dlb[interrup.doj](seg_pmco)
        'modify_two_instrs' referenced from libc160.dlb[interrup.doj](seg_pmco)

Это последняя ошибка одного из проектов.

 

Прочитав в помощи об ошибке Error li1060, я не совсем понял кто должен добовлять перечисленные переменные в сегменты памяти. Толи это должен разработчик библиотеки при компиляции, то ли я, используя её у себя в проекте. Может я вообще ошибаюсь, но если долго мучАться, то что-нибудь получится.

Кароче переход с ошибками из одной среды в другую это отдельная эпопея, умноженная на обьём проекта и используемых компонент.

 

Будем разбираться....Благодарю за ответы :tort:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вообще malloc как впринципе и new все в heap кладет, если сами алтернативный heap не сделали.

Хмммм.... и локальной и глобальной делал переменную, но кладёт он её исключительно в seg_dmda. Альтернативный хиип не делал, карта памяти представленна выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вообще malloc как впринципе и new все в heap кладет, если сами алтернативный heap не сделали.

Хмммм.... и локальной и глобальной делал переменную, но кладёт он её исключительно в seg_dmda. Альтернативный хиип не делал, карта памяти представленна выше.

Тут немного путаница возникла, в терминах. Сама переменная должна лежеать в seg_dmda, а вот данные по ней (блок памяти полученный по malloc) - уже в сегменте heap, если другой не переназначен.

В исходном вопроссе именно про саму переменную спрашивали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, теперь всё встало на свои места, что, где и на кого лежит :)

Благодарю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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