1 自定义Stack
AB两个核有不同的Stack,以下定义仅针对A核。
1、 在ldf中定义要使用的内存块
MEM_L2_STACK { TYPE(RAM) START(0xFEB10000) END(0xFEB17FFF) WIDTH(8) }
2、 删除原有关于ldf_stack_start和ldf_stack_end的定义。
3、 添加关于ldf_stack_start和ldf_stack_end的定义,主要是ldf_stack_end的定义,这个定义在*_basic_crt.s中设置SP和FP指针时使用,由于Stack是从高地址向低地址递减的,因此这个值应该设置为Stack的高地址。
L2_stack
{
INPUT_SECTION_ALIGN(4)
ldf_stack_space = .;
ldf_stack_end = 0xFEB18000 - 4;
} > MEM_L2_STACK
4、更简单的办法是修改*_basiccrt.s中对SP的赋值。
2 自定义Heap
在创建工程时,VDSP默认设置了一个Heap,且将其放在
MEM_A_L1_DATA_A
{ TYPE(RAM) START(0xFF800000) END(0xFF807FFF) WIDTH(8) }
这段32K的地址空间中,当需要分配的存储空间大于32K时将分配失败。当然我们可以自己指定一块存储空间做为Heap。
1、 在*_heaptab.c中添加my_heap_space和my_heap_length的引用:
extern "asm" int ldf_heap_space;
extern "asm" int ldf_heap_length;
extern "asm" int my_heap_space;
extern "asm" int my_heap_length;
struct heap_table_t
{
void
*base;
unsigned long length;
long int
userid;
};
#pragma file_attr("libData=HeapTable")
#pragma section("constdata")
struct heap_table_t heap_table[3] =
{
{ &ldf_heap_space, (int) &ldf_heap_length, 0 },
{ &my_heap_space, (int) &my_heap_length, 0 },
{ 0, 0, 0 }
};
2、 在LDF文件中定义要使用的Heap空间:
MEM_L2_HEAP
{ TYPE(RAM) START(0xFEB00000) END(0xFEB0FFFF) WIDTH(8) }
3、 在LDF中p0的sections中添加my_heap_space和my_heap_length的定义:
L2_heap
{
INPUT_SECTION_ALIGN(4)
RESERVE(my_heap_in_L2_a, my_heap_in_L2_a_length = 64K, 4)
RESERVE_EXPAND(my_heap_in_L2_a, my_heap_in_L2_a_length, 0, 4)
my_heap_space = my_heap_in_L2_a;
my_heap_end = (my_heap_space + (((my_heap_in_L2_a_length * 2K) / 2K) - 4)) & 0xfffffffc;
my_heap_length = my_heap_end - my_heap_space;
} > MEM_L2_HEAP
4、 在p1的sections中同样添加my_heap_space和my_heap_length的定义。当然,需要指定一段不同的存储空间以免与A核冲突。
5、 使用时可以用heap_malloc指定要从哪个堆中分配空间。如果使用malloc则只能从默认的第1个堆中分配空间。