Процессор TMS320DM642. Имеется буфер, состоящий из 64 ячеек по 256 Кб. Размещается в некэшируемой внешней памяти. Регулярно идет помещение объектов в буфер и доставание их оттуда. Приблизительно через час после начала работы в какой-то момент времени функция BUF_alloc возвращает неадеквадное значение (не 0 и не адрес свободного буфера). Через watch смотрел состояние буфера, вроде бы значения там адеквадные. Каким образом и что могло привести к подобному поведению?


Подробности:

Фрагмент кода:

QUE_Elem *p= (QUE_Elem *) BUF_alloc( m_phBUF );

в какой-то момент возвращает значение 0x0033525B или 0x0035525B (зависание поймано два раза).
такого адреса в конфигурации dspbios нет. Он находится между внутренней и внешней памятью.


Конфигурация DSPBIOS:

bios.MEM.create("MONRAM");
bios.MEM.instance("MONRAM").base = 0x00030000;
bios.MEM.instance("MONRAM").len = 0x00010000;

bios.MEM.instance("IRAM").len = 0x00030000;
bios.MEM.instance("IRAM").createHeap = 1;
bios.MEM.instance("IRAM").heapSize = 0x00004000;

bios.MEM.create("CEXTDRAM");
bios.MEM.instance("CEXTDRAM").base = 0x80000000;
bios.MEM.instance("CEXTDRAM").len = 0x01000000;
bios.MEM.instance("CEXTDRAM").createHeap = 0;
bios.MEM.instance("CEXTDRAM").space = "data";
bios.MEM.instance("CEXTDRAM").comment = "кэшируемая внешняя память";

bios.MEM.create("UEXTDRAM");
bios.MEM.instance("UEXTDRAM").base = bios.MEM.instance("CEXTDRAM").base + bios.MEM.instance("CEXTDRAM").len;
bios.MEM.instance("UEXTDRAM").len = 0x06800000;
bios.MEM.instance("UEXTDRAM").createHeap = 0;
bios.MEM.instance("UEXTDRAM").space = "code/data";
bios.MEM.instance("UEXTDRAM").comment = "некэшируемая внешняя память";

bios.BUF.create("BUF_SendResults");
bios.BUF.instance("BUF_SendResults").size = 65536*4 + 16;
bios.BUF.instance("BUF_SendResults").bufCount = 64;
bios.BUF.instance("BUF_SendResults").align = 4;
bios.BUF.instance("BUF_SendResults").comment = "IFG Send Results";
bios.BUF.instance("BUF_SendResults").bufSeg = prog.get("UEXTDRAM");


Map-файл:
name origin length used unused attr fill
---------------------- -------- --------- -------- -------- ---- --------
IRAM 00000000 00030000 0002f4e8 00000b18 RWIX
MONRAM 00030000 00010000 00008000 00008000 RWIX
CEXTDRAM 80000000 01000000 004fccf0 00b03310 RWIX
UEXTDRAM 81000000 06800000 06000800 007ff800 RWIX


.BUF_SendResults$data
* 0 86000000 01000400 UNINITIALIZED


0002f284 _BUF_Registrar
0002f25c _BUF_SendResults
00022680 _BUF_alloc

81000000 _g_aRegDataLarge
86000000 BUF_SendResults$databeg
87000400 TSK_myLoop$stack