Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Алгоритм получения данных в С / 14 сообщений из 14, страница 1 из 1
05.07.2018, 11:24
    #39669912
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
Я тут совсем запутался.

Есть память. Она состоит из блоков. Каждый блок 64 страницы. Каждая страница 4096 байт.

Начальный блок данных начинается с блока 231 и всего под данные отведено 10 блоков.

Приходит запрос - выдай данные + офсет + длина данных в байтах.

То есть если придет запрос - выдай данные + 0 + 8192(2*4096) - то я из блока 231 считаю две страницы.
А если придет запрос - выдай данные + 262144(64*4096) + 8192(2*4096) - то я из блока 232 считаю две страницы.
А если придет запрос - выдай данные + 262144(64*4096) + 274432(67*4096) - то я считаю 64 страницы из блока 232 + 3 страницы из блока 233.

Вопрос как написать генерик функцию.
...
Рейтинг: 0 / 0
05.07.2018, 11:31
    #39669916
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
jenya7,

просто вложенные массивы
...
Рейтинг: 0 / 0
05.07.2018, 11:49
    #39669936
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
jenya7, примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
pagesize = 4096
blocksize = 64 * pagesize
zeroblock =231

startblock = zeroblock + offset div blocksize  //целочисленное деление
endblock = zeroblock + (offset + datasize) div blocksize

startpage = (offset mod blocksize) div pagesize
endpage = ((offset + datasize) mod blocksize) div pagesize

if (endblock == startblock):
   читать из startblock страницы от startpage до endpage
else:
   читать из startblock страницы от startpage до 63
   читать из промежуточных блоков всё
   читать из endblock страницы от 0 до endpage
...
Рейтинг: 0 / 0
05.07.2018, 12:24
    #39669967
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
MBojenya7, примерно так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
pagesize = 4096
blocksize = 64 * pagesize
zeroblock =231

startblock = zeroblock + offset div blocksize  //целочисленное деление
endblock = zeroblock + (offset + datasize) div blocksize

startpage = (offset mod blocksize) div pagesize
endpage = ((offset + datasize) mod blocksize) div pagesize

if (endblock == startblock):
   читать из startblock страницы от startpage до endpage
else:
   читать из startblock страницы от startpage до 63
   читать из промежуточных блоков всё
   читать из endblock страницы от 0 до endpage


спасибо. но вместо else нужен while чтоб вычитать все страницы или я ошибаюсь?
...
Рейтинг: 0 / 0
05.07.2018, 12:26
    #39669971
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
авторно вместо else нужен while чтоб вычитать все страницы

В строчке читать из промежуточных блоков всё подразумевается цикл for
...
Рейтинг: 0 / 0
05.07.2018, 12:27
    #39669973
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
подразумевается цикл for от startblock + 1 до endblock - 1
...
Рейтинг: 0 / 0
05.07.2018, 15:26
    #39670108
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
получилось вот что
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
uint16_t GetLoggerData(void)
{
	uint32_t pagesize = 4096;
	uint32_t blocksize = 64 * pagesize;
	uint32_t zeroblock, startblock, endblock;
	uint32_t startpage, endpage;
	uint32_t datasize;
	uint32_t offset;
	uint32_t block_idx, page_idx, page_idx_start, page_idx_end;
	uint32_t row_address;
	uint32_t partition;

	uint32_t u32CRC_Value = UTL_CRC_CRC16_INIT_VALUE;

	partition = msgBuff[4];

	offset = (msgBuff[8]<<24) | (msgBuff[7]<<16) | (msgBuff[6]<<8) | msgBuff[5];

	datasize = (msgBuff[10]<<8) | msgBuff[9];

	zeroblock = tPartOffset[partition];

	startblock = zeroblock + (offset / blocksize);
	endblock = zeroblock + (offset + datasize) / blocksize;

	startpage = (offset % blocksize) / pagesize;
	endpage = ((offset + datasize) % blocksize) / pagesize;

    if (startblock = endblock)
    {
        for (page_idx = startpage; page_idx < endpage; page_idx++)
    	{
    	    row_address =  (startblock << 6) | (page_idx & 0x3F);
    	    NFLASH_ReadPage(row_address, 0, log_buffer_data, pagesize);
    	}
     }
    else
    {
    	for (block_idx = startblock; block_idx < endblock; block_idx++)
    	{
    		if (block_idx == startblock) //first block
    		{
    			page_idx_start = startpage;
    			page_idx_end = 64;
    		}
    		else if (block_idx == (endblock-1)) //last block
    		{
    			page_idx_start = 0;
    			page_idx_end = endpage;
    		}
    		else  //middle block
    		{
    			page_idx_start = 0;
    			page_idx_end = 64;
    		}

    		for (page_idx = page_idx_start; page_idx < page_idx_end; page_idx++)
    		{
    		    row_address =  (startblock << 6) | (page_idx & 0x3F);
    		    NFLASH_ReadPage(row_address, 0, log_buffer_data, pagesize);
    		}
    	}
    }
}

теперь мне предстоит весь ужас верификации алгоритма.
Модератор: Просьба убирать большие исходники под спойлер
...
Рейтинг: 0 / 0
19.07.2018, 11:06
    #39676103
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
я сделал симуляцию в С#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
 private void buttonSimulate_Click(object sender, EventArgs e)
        {
            int data_offset;
            int data_size;

            if (!int.TryParse(textBoxOffset.Text, out data_offset) || !int.TryParse(textBoxSize.Text, out data_size))
            {
                MessageBox.Show("Wrong argument!");
                return;
            }

            int pagesize = 4096;
            int blocksize = 64 * pagesize;
            int zero_block = 231;
            int start_block, end_block;
            int start_page, end_page;
            int page_chunk;
            int page_idx = 0;
            int page_addr = 0;
            int pages, size, block, page;

            start_block = zero_block + (data_offset / blocksize);

            pages = (data_size / pagesize);

            start_page = (data_offset % blocksize) / pagesize;
            end_page = ((data_offset + data_size) % blocksize) / pagesize;

            block = start_block;
            page = start_page;

            for (page_idx = 0; page_idx < pages; page_idx++)
            {
                richTextBoxLog.AppendText("block = " + block.ToString() + "\r");
                richTextBoxLog.AppendText("page = " + page.ToString() + "\r");
                richTextBoxLog.AppendText("page_addr = " + page_addr.ToString() + "\r");
                richTextBoxLog.AppendText("------------------- " + "\r");

                page++;

                if (page > 63)
                {
                    page = 0;
                    block++;
                }
            }
        }


я беру каждый раз по 15 страниц и продвигаю офсет
offset datasize
0 61440 (4096*15)
61440 61440
122880 61440
184320 61440
и получаю правильный результат

block = 231
page = 0
page_addr = 0
-------------------
block = 231
page = 1
page_addr = 0
-------------------
block = 231
page = 2
page_addr = 0
-------------------
block = 231
page = 3
page_addr = 0
-------------------
block = 231
page = 4
page_addr = 0
-------------------
block = 231
page = 5
page_addr = 0
-------------------
block = 231
page = 6
page_addr = 0
-------------------
block = 231
page = 7
page_addr = 0
-------------------
block = 231
page = 8
page_addr = 0
-------------------
block = 231
page = 9
page_addr = 0
-------------------
block = 231
page = 10
page_addr = 0
-------------------
block = 231
page = 11
page_addr = 0
-------------------
block = 231
page = 12
page_addr = 0
-------------------
block = 231
page = 13
page_addr = 0
-------------------
block = 231
page = 14
page_addr = 0
-------------------
block = 231
page = 15
page_addr = 0
-------------------
block = 231
page = 16
page_addr = 0
-------------------
block = 231
page = 17
page_addr = 0
-------------------
block = 231
page = 18
page_addr = 0
-------------------
block = 231
page = 19
page_addr = 0
-------------------
block = 231
page = 20
page_addr = 0
-------------------
block = 231
page = 21
page_addr = 0
-------------------
block = 231
page = 22
page_addr = 0
-------------------
block = 231
page = 23
page_addr = 0
-------------------
block = 231
page = 24
page_addr = 0
-------------------
block = 231
page = 25
page_addr = 0
-------------------
block = 231
page = 26
page_addr = 0
-------------------
block = 231
page = 27
page_addr = 0
-------------------
block = 231
page = 28
page_addr = 0
-------------------
block = 231
page = 29
page_addr = 0
-------------------
block = 231
page = 30
page_addr = 0
-------------------
block = 231
page = 31
page_addr = 0
-------------------
block = 231
page = 32
page_addr = 0
-------------------
block = 231
page = 33
page_addr = 0
-------------------
block = 231
page = 34
page_addr = 0
-------------------
block = 231
page = 35
page_addr = 0
-------------------
block = 231
page = 36
page_addr = 0
-------------------
block = 231
page = 37
page_addr = 0
-------------------
block = 231
page = 38
page_addr = 0
-------------------
block = 231
page = 39
page_addr = 0
-------------------
block = 231
page = 40
page_addr = 0
-------------------
block = 231
page = 41
page_addr = 0
-------------------
block = 231
page = 42
page_addr = 0
-------------------
block = 231
page = 43
page_addr = 0
-------------------
block = 231
page = 44
page_addr = 0
-------------------
block = 231
page = 45
page_addr = 0
-------------------
block = 231
page = 46
page_addr = 0
-------------------
block = 231
page = 47
page_addr = 0
-------------------
block = 231
page = 48
page_addr = 0
-------------------
block = 231
page = 49
page_addr = 0
-------------------
block = 231
page = 50
page_addr = 0
-------------------
block = 231
page = 51
page_addr = 0
-------------------
block = 231
page = 52
page_addr = 0
-------------------
block = 231
page = 53
page_addr = 0
-------------------
block = 231
page = 54
page_addr = 0
-------------------
block = 231
page = 55
page_addr = 0
-------------------
block = 231
page = 56
page_addr = 0
-------------------
block = 231
page = 57
page_addr = 0
-------------------
block = 231
page = 58
page_addr = 0
-------------------
block = 231
page = 59
page_addr = 0
-------------------
block = 231
page = 60
page_addr = 0
-------------------
block = 231
page = 61
page_addr = 0
-------------------
block = 231
page = 62
page_addr = 0
-------------------
block = 231
page = 63
page_addr = 0
-------------------
block = 232
page = 0
page_addr = 0
-------------------
block = 232
page = 1
page_addr = 0
-------------------
block = 232
page = 2
page_addr = 0
-------------------
block = 232
page = 3
page_addr = 0
-------------------
block = 232
page = 4
page_addr = 0
-------------------
block = 232
page = 5
page_addr = 0
-------------------
block = 232
page = 6
page_addr = 0
-------------------
block = 232
page = 7
page_addr = 0
-------------------
block = 232
page = 8
page_addr = 0
-------------------
block = 232
page = 9
page_addr = 0
-------------------
block = 232
page = 10
page_addr = 0
-------------------

но алгоритм работает с размерами кратными 4096. если ставлю размер скажем 65530 - пропускается страница в следующем запросе.
как мне скоректировать ошибку?
...
Рейтинг: 0 / 0
19.07.2018, 13:38
    #39676174
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
jenya7как мне скоректировать ошибку?
Стандартно: отлаживайся. Иди отладчиком пошагово и смотри где поведение твоей программы начинает отличаться от ожидаемого тобою.
...
Рейтинг: 0 / 0
19.07.2018, 20:52
    #39676486
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
jenya7,

Ты модульные тесты писал когда нибудь?
...
Рейтинг: 0 / 0
19.07.2018, 21:29
    #39676500
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
jenya7,
Код: c#
1.
 pages = (data_size / pagesize);



Это откуда?
...
Рейтинг: 0 / 0
19.07.2018, 22:18
    #39676516
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
MBojenya7,
Код: c#
1.
 pages = (data_size / pagesize);



Это откуда?
мне нужно знать сколько страниц выдать за запрос. вроде все правильно.
...
Рейтинг: 0 / 0
20.07.2018, 07:51
    #39676591
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
jenya7,

Вычисление первой и последней страницы должно быть правильно, вот на это и надо ориентироваться, а такое нахождение количества страниц некорректно.
...
Рейтинг: 0 / 0
20.07.2018, 10:33
    #39676678
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм получения данных в С
MBojenya7,

Вычисление первой и последней страницы должно быть правильно, вот на это и надо ориентироваться, а такое нахождение количества страниц некорректно.
я понял. спасибо.

Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Алгоритм получения данных в С / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]