knowledge-database (beta)

Current group: comp.dsp

C6713 external memory problem

C6713 external memory problem  
Simone Winkler
 Re: C6713 external memory problem  
Simone Winkler
 Re: C6713 external memory problem  
Andreas Huennebeck
 Re: C6713 external memory problem  
Simone Winkler
 Re: C6713 external memory problem  
Simone Winkler
 Re: C6713 external memory problem  
Jerry Avins
 Re: C6713 external memory problem  
Brad Griffis
 Re: C6713 external memory problem  
Andreas Huennebeck
 Re: C6713 external memory problem  
Simone Winkler
 Re: C6713 external memory problem  
Andreas Huennebeck
From:Simone Winkler
Subject:C6713 external memory problem
Date:Mon, 17 Jan 2005 20:23:38 +0100
Hello,

I'm working with a TI C6713 processor. It has external SDRAM that is
connected via EMIF (CE2).
So I have a memory section called SDRAM in my cdb-file that has 0xb0000000
as its base and 0x01000000 as its length (16M).

The problem is:
When I allocate memory with malloc(), i can watch the desired variable in
the watch window, and so I can see the pointer address to that variable. But
the pointer doesn't point to a space within the numbers above! For example
allocating an array gives me something like 0xAFFFF848 or similar values. I
also received 0xbebebebe which is out of range as well. What can be the
problem??

The code section I use (it is C code of numerical recipes, not really
optimized and conventional C code, but it works):

with L=50 and M=401 (defined as preprocessor directives)

r=vector(1,L+M);

with the function vector like below:

#if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */

#include
#include
#include
#include "complex.h"
#define NR_END 1
#define FREE_ARG char*

float *vector(long nl, long nh)
/* allocate a float vector with subscript range v[nl..nh] */
{
float *v;

v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
if (!v) nrerror("allocation failure in vector()");
return v-nl+NR_END;
}

For this one I think I got the 0xAFFFF848 address.

What can I do?
Certainly, I cannot perform calculations upon the allocated arrays, because
they are not in a valid memory section, so this is really bad for me.
When I did the same thing in the internal RAM, everything was fine (for
smaller arrays for sure), but now I need a huge amount of memory because I'm
working with big matrices, and so I have to change my dynamic memory section
to the SDRAM.

Thank you!

Simone

Thank you!
From:Simone Winkler
Subject:Re: C6713 external memory problem
Date:Wed, 19 Jan 2005 18:06:41 +0100
I could solve some of the problems...
I am now able to statically allocate a variable in my SDRAM (which isn't
that easy either...)
You simply define your own additional cmd-file like below:

SECTIONS {
.userdef: {} > SDRAM
}

and in the source code you use

#pragma DATA_SECTION(test, ".userdef");
unsigned int test[10];

--------------------------------------------------

BUT: I still have problems with malloc(), it always gives me a NULL pointer.
So I tried to use MEM_alloc by entering SDRAM as segid:

MEM_alloc(SDRAM,0x3000,0);

But it doesn't recognize the symbol SDRAM!! I also tried IRAM and lots of
other things.... It simply doesn't know the identifier SDRAM as though I
really know and see in my cdb-file that its name definitely is SDRAM....!!
My cmd-file really knows the symbol SDRAM, I verified that. I also tried
_SDRAM, because sometimes DSP/BIOS needs all the functions with an
underscore in front of them. None of my attempts worked...

Do you have ANY idea???

Thank you very much...

Simone Winkler
From:Andreas Huennebeck
Subject:Re: C6713 external memory problem
Date:Thu, 20 Jan 2005 09:41:43 +0100
Simone Winkler wrote:

> BUT: I still have problems with malloc(), it always gives me a NULL
> pointer. So I tried to use MEM_alloc by entering SDRAM as segid:
>
> MEM_alloc(SDRAM,0x3000,0);
>
> But it doesn't recognize the symbol SDRAM!!

That is right. Please read the chapter "MEM module" (2.14) in TI's
DSP/BIOS API Reference Guide:

1. You have to call MEM_define first. 'base' should be the address
of your SDRAM, and you must #define SDRAM by yourself, e.g. if
SDRAM starts at 0x80000000, then

#define SDRAM 0x80000000

should do (you may have to cast it to void*).
MEM_define returns the segid for use in MEM_alloc.
2. As far as I remember you must have at least two heap segments
if you want to use the MEM module.
3. I don't think that using the MEM module helps you if standard
malloc() does not work. Even if you get MEM_alloc() to work
you cannot use any DSP/BIOS function that calls malloc() internally
when malloc() itsself does not work.

> My cmd-file really knows the symbol SDRAM, I verified that.

The cmd-file is used by the linker only. The compiler sees the
source code only.

best regards
Andreas
--
Andreas Hünnebeck | email: ah@despammed.com
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
From:Simone Winkler
Subject:Re: C6713 external memory problem
Date:Thu, 20 Jan 2005 10:06:02 +0100
> 3. I don't think that using the MEM module helps you if standard
> malloc() does not work. Even if you get MEM_alloc() to work
> you cannot use any DSP/BIOS function that calls malloc() internally
> when malloc() itsself does not work.

You're right, I use this code now.

segid_sdram=MEM_define((void *)0xB0000000,0x00100000,NULL);
test=(unsigned int *)MEM_alloc(segid_sdram,0x3000,0);

It compiles and runs, but it returns a segid of -1.
And so certainly MEM_alloc returns a null pointer.

:-(

Maybe I can continue with static variables even if this is not what I
wanted...:((

Thank you!
Simone
From:Simone Winkler
Subject:Re: C6713 external memory problem
Date:Thu, 20 Jan 2005 10:10:40 +0100
> It compiles and runs, but it returns a segid of -1.
> And so certainly MEM_alloc returns a null pointer.
>
> :-(
>

Hi!
I just made it work!! (the last thing I tried finally came out for good...)

Now I've got 2 heaps:
1) in IRAM
2) in SDRAM

the first one (IRAM) is used for the DSP/BIOS objects, the second one for
malloc()/free() (You can choose those two things within the MEM manager in
the DSP/BIOS.

When I use the following code:

segid_sdram=MEM_define((void *)0xB0000000,0x00100000,NULL);
test=(unsigned int *)MEM_alloc(segid_sdram,0x3000,0);

segid now returns 2 and test is going to 0xB00FD000. yibbieh!!

malloc() by itself still doesn't work...Maybe because of the 2 heaps.

Thank you for your help!

Simone
From:Jerry Avins
Subject:Re: C6713 external memory problem
Date:Thu, 20 Jan 2005 11:44:57 -0500
Simone Winkler wrote:

...

> Hi!
> I just made it work!! (the last thing I tried finally came out for good...)

Congratulations! (Of course the last thing you try makes it work. After
that, you stop trying.) I think compilers are more trouble than they're
worth unless you use them often.

...

Jerry
--
Engineering is the art of making what you want from things you can get.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
From:Brad Griffis
Subject:Re: C6713 external memory problem
Date:Tue, 18 Jan 2005 02:23:17 GMT
Have you defined your heap such that it is located in SDRAM? I believe this
is determined by where you define the .sysmem section to be located when
writing your linker command file. If you are configuring this through BIOS
I think you can do this through a GUI by right-clicking on the MEM section
and going to properties.

Brad

"Simone Winkler" wrote in message
news:41ec0ee6$1@e-post.inode.at...
> Hello,
>
> I'm working with a TI C6713 processor. It has external SDRAM that is
> connected via EMIF (CE2).
> So I have a memory section called SDRAM in my cdb-file that has 0xb0000000
> as its base and 0x01000000 as its length (16M).
>
> The problem is:
> When I allocate memory with malloc(), i can watch the desired variable in
> the watch window, and so I can see the pointer address to that variable.
> But the pointer doesn't point to a space within the numbers above! For
> example allocating an array gives me something like 0xAFFFF848 or similar
> values. I also received 0xbebebebe which is out of range as well. What can
> be the problem??
>
> The code section I use (it is C code of numerical recipes, not really
> optimized and conventional C code, but it works):
>
> with L=50 and M=401 (defined as preprocessor directives)
>
> r=vector(1,L+M);
>
> with the function vector like below:
>
> #if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */
>
> #include
> #include
> #include
> #include "complex.h"
> #define NR_END 1
> #define FREE_ARG char*
>
> float *vector(long nl, long nh)
> /* allocate a float vector with subscript range v[nl..nh] */
> {
> float *v;
>
> v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
> if (!v) nrerror("allocation failure in vector()");
> return v-nl+NR_END;
> }
>
> For this one I think I got the 0xAFFFF848 address.
>
> What can I do?
> Certainly, I cannot perform calculations upon the allocated arrays,
> because they are not in a valid memory section, so this is really bad for
> me.
> When I did the same thing in the internal RAM, everything was fine (for
> smaller arrays for sure), but now I need a huge amount of memory because
> I'm working with big matrices, and so I have to change my dynamic memory
> section to the SDRAM.
>
> Thank you!
>
> Simone
>
> Thank you!
>
From:Andreas Huennebeck
Subject:Re: C6713 external memory problem
Date:Tue, 18 Jan 2005 09:06:47 +0100
Simone Winkler wrote:

> Hello,
>
> I'm working with a TI C6713 processor. It has external SDRAM that is
> connected via EMIF (CE2).
> So I have a memory section called SDRAM in my cdb-file that has 0xb0000000
> as its base and 0x01000000 as its length (16M).
>
> The problem is:
> When I allocate memory with malloc(), i can watch the desired variable in
> the watch window, and so I can see the pointer address to that variable.
> But the pointer doesn't point to a space within the numbers above! For
> example allocating an array gives me something like 0xAFFFF848 or similar
> values. I also received 0xbebebebe which is out of range as well. What can
> be the problem??

Refer to the "Optimizing C Compilers Guide", page 5-13. You have to
define the heap size, the memory section (what you did), but you
also have to define the .sysmem segment.


> The code section I use (it is C code of numerical recipes, not really
> optimized and conventional C code, but it works):

Forget about this code and run this test first:
- call malloc() of 1k bytes: the returned address should be close to
the begin of your heap (here on a C6414 it's begin+8).
Make sure that the malloc() call above really is the first malloc(),
therefore run this test at begin of main().
- if this works, call malloc() of 1k bytes in a loop until it returns 0.
check if the number of successfull calls x 1 kBytes matches the
size of your heap (approximately).
If this all works, then start using application code with malloc.

best regards
Andreas
--
Andreas Hünnebeck | email: ah@despammed.com
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
From:Simone Winkler
Subject:Re: C6713 external memory problem
Date:Tue, 18 Jan 2005 21:53:48 +0100
Hi, thank you very much for your answer!

I figured out that the problem is more complicated than I thought...
I'm using D.SignT module which has a C6713 DSP, 16MB SDRAM, a CPLD and
several other things onboard.
So what I first had to do is to introduce the SDRAM into my EMIF
configuration. It uses CE3 space and now as it is refreshed, I can write and
read from/to my memory space by simply writing to a specific memory adress
within the address range of the SDRAM and reading it afterwards.

BUT: now malloc() returns a null pointer. I can then still write and read
to/from the allocated variable, but I suppose this is only possible because
the memory is not protected against writing to "wrong" addresses.

I didn't try to statically allocate a variable within my SDRAM, but I'll do
to verify everything.

One of my ideas is the following:
I've got 2 heaps:
1) in IRAM, because I've set the section for DSP/BIOS objects to IRAM
2) in SDRAM for the huge dynamically allocatable variables I need.
In the build options I also have to enter a heap size - should I enter the
sum of both heaps there? I suppose 2 heaps aren't that good!?

The second thing is, I couldn't find a .sysmem section. Just a field in the
DSP/BIOS configuration for choosing a memory segment for malloc()/free(). I
think this is what you meant, I've already set that one before. But this one
doesn't compile to a .sysmem section in the cmd-file.
When I tried to use malloc() with IRAM, everything worked, so I think that
then I did the right thing.

Do you have another idea?
Please help me!

Thank you very much,

Simone
From:Andreas Huennebeck
Subject:Re: C6713 external memory problem
Date:Wed, 19 Jan 2005 10:11:10 +0100
Simone Winkler wrote:

> I figured out that the problem is more complicated than I thought...
> I'm using D.SignT module which has a C6713 DSP, 16MB SDRAM, a CPLD and
> several other things onboard.
> So what I first had to do is to introduce the SDRAM into my EMIF
> configuration. It uses CE3 space and now as it is refreshed, I can write
> and read from/to my memory space by simply writing to a specific memory
> adress within the address range of the SDRAM and reading it afterwards.

OK, so the memory I/O works.

> BUT: now malloc() returns a null pointer. I can then still write and read
> to/from the allocated variable, but I suppose this is only possible
> because the memory is not protected against writing to "wrong" addresses.

??? You're writing to a NULL pointer?

> One of my ideas is the following:
> I've got 2 heaps:
> 1) in IRAM, because I've set the section for DSP/BIOS objects to IRAM
> 2) in SDRAM for the huge dynamically allocatable variables I need.
> In the build options I also have to enter a heap size - should I enter the
> sum of both heaps there? I suppose 2 heaps aren't that good!?

This is something i'd like to know as well. Currently I use only the SDRAM
as heap, but I would like to use SDRAM and IRAM. You can use different
heaps, see this excerpt from TI's support hotline:

For every "MEM" region you declare in BIOS, you are allowed to
define one heap and when you call MEM_alloc(), you can specify
which heap to try and get the memory from . So the maximum number
of user-defined heaps just depends on how many memory sections
you have in your memory map. Please refer to the MEM API's in
the DSP/BIOS API Reference Guide.

I haven't found out yet how to set the default heap for standard
malloc()/new and free()/delete operations. Maybe the DSP/BIOS
configuration as mentioned below is the hint I need.

> The second thing is, I couldn't find a .sysmem section. Just a field in
> the DSP/BIOS configuration for choosing a memory segment for
> malloc()/free(). I think this is what you meant, I've already set that one
> before. But this one doesn't compile to a .sysmem section in the cmd-file.

Well, I don't use the CC-Studio, just the naked compiler. I write the
cmd-file all by myself. The compilation is done within an imake based
make system which must run without user interaction.

> When I tried to use malloc() with IRAM, everything worked, so I think that
> then I did the right thing.
>
> Do you have another idea?

Try a manually written cmd-file.
And send me a mail if you get all this to work, please.

Tschau
Andreas
--
Andreas Hünnebeck | email: ah@despammed.com
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
   

Copyright © 2006 knowledge-database   -   All rights reserved