Nios® V/II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® V/II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.

malloc problem

Altera_Forum
Honored Contributor II
1,440 Views

Hello 

 

I am using Quarts and Nios 9.1 versions. 

In my board I have external (altmemddr) and on-chip (inside Cyclone III) memory. 

In the system library properties all memory (including rwdata, heap and stack) is defined to use an on-chip memory. 

But in my applicaion I am tring to allocate part of the variables to the ddr: 

EXTERN unsigned char *CisSheetQueue __attribute__ ((section(".altmemddr.rwdata"))); // Locate this array in DDR 

Later on I am trying to allocate 64K of this memory: 

CisSheetQueue = malloc(CIS_SHEET_QUEUE*sizeof(unsigned char)); 

But this size is not allocated and limited only to ~6K. 

During the compilation of nios there is an info message 16Kbytes free for stack + heap. 

How I can use and allocate a large size (64K) speciphically in DDR?  

 

Thank you for the help.
0 Kudos
4 Replies
Altera_Forum
Honored Contributor II
756 Views

have you connected at least the data_master of the NIOS to the DDR-RAM?

0 Kudos
Altera_Forum
Honored Contributor II
756 Views

That isn't how malloc() and linker sections work. 

 

You can either put your heap in altmemddr and use malloc(), or you can statically allocate your array and use the section attribute (as you have attempted) to place that array in altmemddr.
0 Kudos
Altera_Forum
Honored Contributor II
756 Views

I don't want to put a heap on altmemddr as I want that all variables will be handled in fast way (as it is done on the on-chip memory). 

I have tried to allocate an array in this way: 

unsigned char CisSheetQueue[65535] __attribute__ ((section(".altmemddr.rwdata"))); // Locate this array in DDR 

But in this way the code (that burned to the flash memory) is jumping from 120K to 280K. And I have a limited space to program this code to the specific sector of the flash.
0 Kudos
Altera_Forum
Honored Contributor II
756 Views

The increase in code size is likely due to the .cinit to initialize the data. 

 

Instead of doing it this way, just do it with a pointer and a linker region: modify your linker script to create a region to hold your "CisSheetQueue" and then: 

 

unsigned char *pCisSheetQueue = (unsigned char *)the_address_of_the_region_you_just_created;  

 

If I recall, you can manage the linker script regions through the BSP editor.
0 Kudos
Reply