Есть память со следующей архитектурой
Код
MEMORY = 1815 BLOCKS
1 BLOCK = 64 PAGES
1 PAGE = 4096 BYTE
То есть память разделена на блоки, блоки разделены на страницы, каждая страница 4К.
Мне передают в качестве аргументов офсет и размер данных и на основе этих двух параметров я должен вытащить данные.Для облегчения задачи мне передают фиксированный размер 65530 байт, соответственно офсет увеличивается на 65530.
CODE
#define PAGESIZE 4096
#define BLOCKSIZE 262144 //64 * 4096;
uint32_t startpage, endpage, pages;
uint32_t page, block, page_chunk;
uint32_t block_idx, page_idx, uart_byte_idx, page_addr;
uint32_t row_address;
uint32_t last_chunk;
uint32_t total_sent_size;
void GetLoggerDataFast(uint32_t offset, uint32_t datasize)
{
total_sent_size = 0;
last_chunk = datasize % PAGESIZE;
pages = (datasize / PAGESIZE);
if (pages == 0)
pages = 1;
else
{
if(last_chunk)
pages++;
}
startpage = (offset % BLOCKSIZE) / PAGESIZE;
endpage = ((offset + datasize) % BLOCKSIZE) / PAGESIZE;
page = startpage;
for (page_idx = 0; page_idx < pages; page_idx++)
{
if (page_idx == 0)
{
if (datasize > PAGESIZE)
{
page_chunk = PAGESIZE - (offset % PAGESIZE);
page_addr = (offset % PAGESIZE);
}
else
{
page_chunk = datasize;
page_addr = 0;
}
}
else if (page_idx == ( pages-1))
{
page_chunk = datasize - ((pages-1) * PAGESIZE);
//page_chunk = datasize - total_sent_size;
page_addr = 0;
}
else
{
page_chunk = PAGESIZE;
page_addr = 0;
}
printf ("page num = %d \n", page);
printf ("page addr = %d \n", page_addr);
printf ("page chunk = %d \n", page_chunk);
printf ("-------------------\n");
total_sent_size += page_chunk;
page++;
if (page > 63)
{
page = 0;
}
}
printf ("total size = %d \n", total_sent_size);
printf ("\n\n");
}
проверяю
Код
int main()
{
GetLoggerDataFast(0, 65530);
GetLoggerDataFast(65530, 65530);
GetLoggerDataFast(131060, 65530);
GetLoggerDataFast(196590, 65530);
GetLoggerDataFast(262120, 65530);
GetLoggerDataFast(327650, 65530);
return 0;
}
получаю лог
CODE
page num = 0
page addr = 0
page chunk = 4096
-------------------
page num = 1
page addr = 0
page chunk = 4096
-------------------
page num = 2
page addr = 0
page chunk = 4096
-------------------
page num = 3
page addr = 0
page chunk = 4096
-------------------
page num = 4
page addr = 0
page chunk = 4096
-------------------
page num = 5
page addr = 0
page chunk = 4096
-------------------
page num = 6
page addr = 0
page chunk = 4096
-------------------
page num = 7
page addr = 0
page chunk = 4096
-------------------
page num = 8
page addr = 0
page chunk = 4096
-------------------
page num = 9
page addr = 0
page chunk = 4096
-------------------
page num = 10
page addr = 0
page chunk = 4096
-------------------
page num = 11
page addr = 0
page chunk = 4096
-------------------
page num = 12
page addr = 0
page chunk = 4096
-------------------
page num = 13
page addr = 0
page chunk = 4096
-------------------
page num = 14
page addr = 0
page chunk = 4096
-------------------
page num = 15
page addr = 0
page chunk = 4090
-------------------
total size = 65530
page num = 15
page addr = 4090
page chunk = 6
-------------------
page num = 16
page addr = 0
page chunk = 4096
-------------------
page num = 17
page addr = 0
page chunk = 4096
-------------------
page num = 18
page addr = 0
page chunk = 4096
-------------------
page num = 19
page addr = 0
page chunk = 4096
-------------------
page num = 20
page addr = 0
page chunk = 4096
-------------------
page num = 21
page addr = 0
page chunk = 4096
-------------------
page num = 22
page addr = 0
page chunk = 4096
-------------------
page num = 23
page addr = 0
page chunk = 4096
-------------------
page num = 24
page addr = 0
page chunk = 4096
-------------------
page num = 25
page addr = 0
page chunk = 4096
-------------------
page num = 26
page addr = 0
page chunk = 4096
-------------------
page num = 27
page addr = 0
page chunk = 4096
-------------------
page num = 28
page addr = 0
page chunk = 4096
-------------------
page num = 29
page addr = 0
page chunk = 4096
-------------------
page num = 30
page addr = 0
page chunk = 4090
-------------------
total size = 61440
page num = 31
page addr = 4084
page chunk = 12
-------------------
page num = 32
page addr = 0
page chunk = 4096
-------------------
page num = 33
page addr = 0
page chunk = 4096
-------------------
page num = 34
page addr = 0
page chunk = 4096
-------------------
page num = 35
page addr = 0
page chunk = 4096
-------------------
page num = 36
page addr = 0
page chunk = 4096
-------------------
page num = 37
page addr = 0
page chunk = 4096
-------------------
page num = 38
page addr = 0
page chunk = 4096
-------------------
page num = 39
page addr = 0
page chunk = 4096
-------------------
page num = 40
page addr = 0
page chunk = 4096
-------------------
page num = 41
page addr = 0
page chunk = 4096
-------------------
page num = 42
page addr = 0
page chunk = 4096
-------------------
page num = 43
page addr = 0
page chunk = 4096
-------------------
page num = 44
page addr = 0
page chunk = 4096
-------------------
page num = 45
page addr = 0
page chunk = 4096
-------------------
page num = 46
page addr = 0
page chunk = 4090
-------------------
total size = 61446
Первая итерация все правильно - 16 страниц - последняя на 6 байт меньше - все правильно.
Вторая итерация все правильно - начали с 15-ой страницы, добрали 6 байт а потом все сломалось - последняя страница 30 а не 31.
Теперь я изменяю функцию
CODE
void GetLoggerDataFast(uint32_t offset, uint32_t datasize)
{
total_sent_size = 0;
last_chunk = datasize % PAGESIZE;
pages = (datasize / PAGESIZE);
if (pages == 0)
pages = 1;
else
{
if(last_chunk)
pages++;
}
startpage = (offset % BLOCKSIZE) / PAGESIZE;
endpage = ((offset + datasize) % BLOCKSIZE) / PAGESIZE;
page = startpage;
for (page = startpage; page < endpage+1; page++)
{
if (page == startpage)
{
if (datasize > PAGESIZE)
{
page_chunk = PAGESIZE - (offset % PAGESIZE);
page_addr = (offset % PAGESIZE);
}
else
{
page_chunk = datasize;
page_addr = 0;
}
}
else if (page == endpage)
{
page_chunk = datasize - ((pages-1) * PAGESIZE);
//page_chunk = datasize - total_sent_size;
page_addr = 0;
}
else
{
page_chunk = PAGESIZE;
page_addr = 0;
}
printf ("page num = %d \n", page);
printf ("page addr = %d \n", page_addr);
printf ("page chunk = %d \n", page_chunk);
printf ("-------------------\n");
total_sent_size += page_chunk;
}
printf ("total size = %d \n", total_sent_size);
printf ("\n\n");
}
я изменил только for цикл, но если посмотреть лог
CODE
page num = 0
page addr = 0
page chunk = 4096
-------------------
page num = 1
page addr = 0
page chunk = 4096
-------------------
page num = 2
page addr = 0
page chunk = 4096
-------------------
page num = 3
page addr = 0
page chunk = 4096
-------------------
page num = 4
page addr = 0
page chunk = 4096
-------------------
page num = 5
page addr = 0
page chunk = 4096
-------------------
page num = 6
page addr = 0
page chunk = 4096
-------------------
page num = 7
page addr = 0
page chunk = 4096
-------------------
page num = 8
page addr = 0
page chunk = 4096
-------------------
page num = 9
page addr = 0
page chunk = 4096
-------------------
page num = 10
page addr = 0
page chunk = 4096
-------------------
page num = 11
page addr = 0
page chunk = 4096
-------------------
page num = 12
page addr = 0
page chunk = 4096
-------------------
page num = 13
page addr = 0
page chunk = 4096
-------------------
page num = 14
page addr = 0
page chunk = 4096
-------------------
page num = 15
page addr = 0
page chunk = 4090
-------------------
total size = 65530
page num = 15
page addr = 4090
page chunk = 6
-------------------
page num = 16
page addr = 0
page chunk = 4096
-------------------
page num = 17
page addr = 0
page chunk = 4096
-------------------
page num = 18
page addr = 0
page chunk = 4096
-------------------
page num = 19
page addr = 0
page chunk = 4096
-------------------
page num = 20
page addr = 0
page chunk = 4096
-------------------
page num = 21
page addr = 0
page chunk = 4096
-------------------
page num = 22
page addr = 0
page chunk = 4096
-------------------
page num = 23
page addr = 0
page chunk = 4096
-------------------
page num = 24
page addr = 0
page chunk = 4096
-------------------
page num = 25
page addr = 0
page chunk = 4096
-------------------
page num = 26
page addr = 0
page chunk = 4096
-------------------
page num = 27
page addr = 0
page chunk = 4096
-------------------
page num = 28
page addr = 0
page chunk = 4096
-------------------
page num = 29
page addr = 0
page chunk = 4096
-------------------
page num = 30
page addr = 0
page chunk = 4096
-------------------
page num = 31
page addr = 0
page chunk = 4090
-------------------
total size = 65536
page num = 31
page addr = 4084
page chunk = 12
-------------------
page num = 32
page addr = 0
page chunk = 4096
-------------------
page num = 33
page addr = 0
page chunk = 4096
-------------------
page num = 34
page addr = 0
page chunk = 4096
-------------------
page num = 35
page addr = 0
page chunk = 4096
-------------------
page num = 36
page addr = 0
page chunk = 4096
-------------------
page num = 37
page addr = 0
page chunk = 4096
-------------------
page num = 38
page addr = 0
page chunk = 4096
-------------------
page num = 39
page addr = 0
page chunk = 4096
-------------------
page num = 40
page addr = 0
page chunk = 4096
-------------------
page num = 41
page addr = 0
page chunk = 4096
-------------------
page num = 42
page addr = 0
page chunk = 4096
-------------------
page num = 43
page addr = 0
page chunk = 4096
-------------------
page num = 44
page addr = 0
page chunk = 4096
-------------------
page num = 45
page addr = 0
page chunk = 4096
-------------------
page num = 46
page addr = 0
page chunk = 4096
-------------------
page num = 47
page addr = 0
page chunk = 4090
-------------------
то во второй итерации последняя страница вычисляется правильно. алгоритм неправильный но как изменение цикла меняет предидущий код.
вобщем нужна помощь найти ошибку.
Сообщение отредактировал Jenya7 - Sep 17 2018, 06:06