powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Алгоритм получения данных в С
14 сообщений из 14, страница 1 из 1
Алгоритм получения данных в С
    #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
Алгоритм получения данных в С
    #39669916
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

просто вложенные массивы
...
Рейтинг: 0 / 0
Алгоритм получения данных в С
    #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
Алгоритм получения данных в С
    #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
Алгоритм получения данных в С
    #39669971
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
авторно вместо else нужен while чтоб вычитать все страницы

В строчке читать из промежуточных блоков всё подразумевается цикл for
...
Рейтинг: 0 / 0
Алгоритм получения данных в С
    #39669973
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
подразумевается цикл for от startblock + 1 до endblock - 1
...
Рейтинг: 0 / 0
Алгоритм получения данных в С
    #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
Алгоритм получения данных в С
    #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
Алгоритм получения данных в С
    #39676174
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7как мне скоректировать ошибку?
Стандартно: отлаживайся. Иди отладчиком пошагово и смотри где поведение твоей программы начинает отличаться от ожидаемого тобою.
...
Рейтинг: 0 / 0
Алгоритм получения данных в С
    #39676486
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

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



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



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

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

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

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


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