реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Алгоритм вычисления страницы
Jenya7
сообщение Sep 17 2018, 05:45
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть память со следующей архитектурой
Код
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
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 17 2018, 06:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Код
#include <stdio.h>
#include <stdint.h>

void flash_read(uint32_t block, uint32_t page, uint32_t offset, uint32_t read_num){
  printf ("%d\t%d\t%d\t%d\n", block, page, offset, read_num);
}

void read (uint32_t address, uint32_t num){
  while (num){
    uint32_t block = address >> 16;
    uint32_t page = (address & 0xFFFF) >> 12;
    uint32_t offset = (address & 0x0FFF);
    uint32_t read_num = 0x1000 - offset;
    if (read_num > num) read_num = num;
    flash_read(block, page, offset, read_num);
    address += read_num;
    num -= read_num;
  }
}

int main(){
    read(0, 65530);
    read(65530, 65530);
    read(131060, 65530);
    read(196590, 65530);
    read(262120, 65530);
    read(327650, 65530);  
}
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 17 2018, 07:36
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(_pv @ Sep 17 2018, 11:47) *
int main(){
read(0, 65530);
read(65530, 65530);
read(131060, 65530);
read(196590, 65530);
read(262120, 65530);
read(327650, 65530);
}[/code]

я немного видоизменил
Код
void read (uint32_t address, uint32_t num)
{
    uint32_t block;
    uint32_t page;
    uint32_t offset;
    uint32_t read_num;
  while (num)
  {
    block = address >> 16;
    page = (address & 0xFFFF) >> 12;
    offset = (address & 0x0FFF);
    read_num = 0x1000 - offset;
    if (read_num > num) read_num = num;
    
    //flash_read(block, page, offset, read_num);
    printf ("block = %d \n", block);
    printf ("page = %d \n", page);
    printf ("offset = %d \n", offset);
    printf ("read_num = %d \n", read_num);
    printf ("-------------------\n");
          
    address += read_num;
    num -= read_num;
  }
}

и вот лог
CODE
block = 0
page = 0
offset = 0
read_num = 4096
-------------------
block = 0
page = 1
offset = 0
read_num = 4096
-------------------
block = 0
page = 2
offset = 0
read_num = 4096
-------------------
block = 0
page = 3
offset = 0
read_num = 4096
-------------------
block = 0
page = 4
offset = 0
read_num = 4096
-------------------
block = 0
page = 5
offset = 0
read_num = 4096
-------------------
block = 0
page = 6
offset = 0
read_num = 4096
-------------------
block = 0
page = 7
offset = 0
read_num = 4096
-------------------
block = 0
page = 8
offset = 0
read_num = 4096
-------------------
block = 0
page = 9
offset = 0
read_num = 4096
-------------------
block = 0
page = 10
offset = 0
read_num = 4096
-------------------
block = 0
page = 11
offset = 0
read_num = 4096
-------------------
block = 0
page = 12
offset = 0
read_num = 4096
-------------------
block = 0
page = 13
offset = 0
read_num = 4096
-------------------
block = 0
page = 14
offset = 0
read_num = 4096
-------------------
block = 0
page = 15
offset = 0
read_num = 4090
-------------------
block = 0
page = 15
offset = 4090
read_num = 6
-------------------
block = 1
page = 0
offset = 0
read_num = 4096
-------------------
block = 1
page = 1
offset = 0
read_num = 4096
-------------------
block = 1
page = 2
offset = 0
read_num = 4096
-------------------
block = 1
page = 3
offset = 0
read_num = 4096
-------------------
block = 1
page = 4
offset = 0
read_num = 4096
-------------------
block = 1
page = 5
offset = 0
read_num = 4096
-------------------
block = 1
page = 6
offset = 0
read_num = 4096
-------------------
block = 1
page = 7
offset = 0
read_num = 4096
-------------------
block = 1
page = 8
offset = 0
read_num = 4096
-------------------
block = 1
page = 9
offset = 0
read_num = 4096
-------------------
block = 1
page = 10
offset = 0
read_num = 4096
-------------------
block = 1
page = 11
offset = 0
read_num = 4096
-------------------
block = 1
page = 12
offset = 0
read_num = 4096
-------------------
block = 1
page = 13
offset = 0
read_num = 4096
-------------------
block = 1
page = 14
offset = 0
read_num = 4096
-------------------
block = 1
page = 15
offset = 0
read_num = 4084
-------------------
block = 1
page = 15
offset = 4084
read_num = 12
-------------------
block = 2
page = 0
offset = 0
read_num = 4096
-------------------
block = 2
page = 1
offset = 0
read_num = 4096
-------------------
block = 2
page = 2
offset = 0
read_num = 4096
-------------------
block = 2
page = 3
offset = 0
read_num = 4096
-------------------
block = 2
page = 4
offset = 0
read_num = 4096
-------------------
block = 2
page = 5
offset = 0
read_num = 4096
-------------------
block = 2
page = 6
offset = 0
read_num = 4096
-------------------
block = 2
page = 7
offset = 0
read_num = 4096
-------------------
block = 2
page = 8
offset = 0
read_num = 4096
-------------------
block = 2
page = 9
offset = 0
read_num = 4096
-------------------
block = 2
page = 10
offset = 0
read_num = 4096
-------------------
block = 2
page = 11
offset = 0
read_num = 4096
-------------------
block = 2
page = 12
offset = 0
read_num = 4096
-------------------
block = 2
page = 13
offset = 0
read_num = 4096
-------------------
block = 2
page = 14
offset = 0
read_num = 4096
-------------------
block = 2
page = 15
offset = 0
read_num = 4078
-------------------
block = 2
page = 15
offset = 4078
read_num = 18
-------------------
block = 3
page = 0
offset = 0
read_num = 4096
-------------------
block = 3
page = 1
offset = 0
read_num = 4096
-------------------
block = 3
page = 2
offset = 0
read_num = 4096
-------------------
block = 3
page = 3
offset = 0
read_num = 4096
-------------------
block = 3
page = 4
offset = 0
read_num = 4096
-------------------
block = 3
page = 5
offset = 0
read_num = 4096
-------------------
block = 3
page = 6
offset = 0
read_num = 4096
-------------------
block = 3
page = 7
offset = 0
read_num = 4096
-------------------
block = 3
page = 8
offset = 0
read_num = 4096
-------------------
block = 3
page = 9
offset = 0
read_num = 4096
-------------------
block = 3
page = 10
offset = 0
read_num = 4096
-------------------
block = 3
page = 11
offset = 0
read_num = 4096
-------------------
block = 3
page = 12
offset = 0
read_num = 4096
-------------------
block = 3
page = 13
offset = 0
read_num = 4096
-------------------
block = 3
page = 14
offset = 0
read_num = 4096
-------------------
block = 3
page = 15
offset = 0
read_num = 4072
-------------------
block = 3
page = 15
offset = 4072
read_num = 24
-------------------
block = 4
page = 0
offset = 0
read_num = 4096
-------------------
block = 4
page = 1
offset = 0
read_num = 4096
-------------------
block = 4
page = 2
offset = 0
read_num = 4096
-------------------
block = 4
page = 3
offset = 0
read_num = 4096
-------------------
block = 4
page = 4
offset = 0
read_num = 4096
-------------------
block = 4
page = 5
offset = 0
read_num = 4096
-------------------
block = 4
page = 6
offset = 0
read_num = 4096
-------------------
block = 4
page = 7
offset = 0
read_num = 4096
-------------------
block = 4
page = 8
offset = 0
read_num = 4096
-------------------
block = 4
page = 9
offset = 0
read_num = 4096
-------------------
block = 4
page = 10
offset = 0
read_num = 4096
-------------------
block = 4
page = 11
offset = 0
read_num = 4096
-------------------
block = 4
page = 12
offset = 0
read_num = 4096
-------------------
block = 4
page = 13
offset = 0
read_num = 4096
-------------------
block = 4
page = 14
offset = 0
read_num = 4096
-------------------
block = 4
page = 15
offset = 0
read_num = 4066
-------------------
block = 4
page = 15
offset = 4066
read_num = 30
-------------------
block = 5
page = 0
offset = 0
read_num = 4096
-------------------
block = 5
page = 1
offset = 0
read_num = 4096
-------------------
block = 5
page = 2
offset = 0
read_num = 4096
-------------------
block = 5
page = 3
offset = 0
read_num = 4096
-------------------
block = 5
page = 4
offset = 0
read_num = 4096
-------------------
block = 5
page = 5
offset = 0
read_num = 4096
-------------------
block = 5
page = 6
offset = 0
read_num = 4096
-------------------
block = 5
page = 7
offset = 0
read_num = 4096
-------------------
block = 5
page = 8
offset = 0
read_num = 4096
-------------------
block = 5
page = 9
offset = 0
read_num = 4096
-------------------
block = 5
page = 10
offset = 0
read_num = 4096
-------------------
block = 5
page = 11
offset = 0
read_num = 4096
-------------------
block = 5
page = 12
offset = 0
read_num = 4096
-------------------
block = 5
page = 13
offset = 0
read_num = 4096
-------------------
block = 5
page = 14
offset = 0
read_num = 4096
-------------------
block = 5
page = 15
offset = 0
read_num = 4060
-------------------
во второй итерации page = 15 и потом page = 0 а номер страницы должен продолжиться 16, 17, и так далее.

Сообщение отредактировал Jenya7 - Sep 17 2018, 07:37
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 17 2018, 08:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



арифметика подвела,
никогда не используйте магические константы в коде

#define PAGE_SIZE 12
#define BLOCK_SIZE 18

uint32_t block = address >> BLOCK_SIZE;
uint32_t page = (address & ((1 << BLOCK_SIZE) - 1) ) >> PAGE_SIZE;
uint32_t offset = (address & ((1 << PAGE_SIZE) - 1) );
uint32_t read_num = (1 << PAGE_SIZE) - offset;
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 17 2018, 08:40
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(_pv @ Sep 17 2018, 13:19) *
арифметика подвела,
никогда не используйте магические константы в коде

#define PAGE_SIZE 12
#define BLOCK_SIZE 18

uint32_t block = address >> BLOCK_SIZE;
uint32_t page = (address & ((1 << BLOCK_SIZE) - 1) ) >> PAGE_SIZE;
uint32_t offset = (address & ((1 << PAGE_SIZE) - 1) );
uint32_t read_num = (1 << PAGE_SIZE) - offset;


большое спасибо. по логу все выглядит хорошо. а как Вы пришли к #define PAGE_SIZE 12 #define BLOCK_SIZE 18 ?

убейте не понимаю как это работает. sm.gif
read_num = (12*2) - 65530 = ????????
однако вычисляется 4096

пардон read_num = (12*2) - 4090 = 6 это как ? sm.gif

Сообщение отредактировал Jenya7 - Sep 17 2018, 09:13
Go to the top of the page
 
+Quote Post
Swup
сообщение Sep 17 2018, 08:56
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Цитата(Jenya7 @ Sep 17 2018, 12:40) *
большое спасибо. по логу все выглядит хорошо. а как Вы пришли к #define PAGE_SIZE 12 #define BLOCK_SIZE 18 ?

Кажется так:
Код
PAGE_SIZE = log2(4096)
BLOCK_SIZE  = log2(4096*64)

4096 размер страницы
64 количество страниц в блоке
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 17 2018, 09:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Jenya7 @ Sep 17 2018, 14:40) *
убейте не понимаю как это работает. sm.gif
read_num = (12*2) - 65530 = ????????
однако вычисляется 4096


read_num = 4096 - offset; т.е. сколько осталось до конца страницы.
offset внутри страницы = address & 0xFFF т.е. от 0 до 4095
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 17 2018, 09:19
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Swup @ Sep 17 2018, 13:56) *
Кажется так:
Код
PAGE_SIZE = log2(4096)
BLOCK_SIZE  = log2(4096*64)

4096 размер страницы
64 количество страниц в блоке


а какое обратное действие log2? возведение в квадрат? я понимаю что шифт предпочтительней деления, тем более по модулю. не понимаю как до этого дошли sm.gif

Цитата(_pv @ Sep 17 2018, 14:17) *
read_num = 4096 - offset;
offset внутри страницы = address & 0xFFF т.е. от 0 до 4095


а как это (1 << PAGE_SIZE) это 4096 ?
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 17 2018, 09:26
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Jenya7 @ Sep 17 2018, 15:19) *
а какое обратное действие log2? возведение в квадрат? я понимаю что шифт предпочтительней деления, тем более по модулю. не понимаю как до этого дошли sm.gif

http://bfy.tw/Jv8I


Цитата(Jenya7 @ Sep 17 2018, 15:19) *
а как это (1 << PAGE_SIZE) это 4096 ?

1 << 12 == 0b 0001 0000 0000 0000 == 2 ^ 12 == 4096.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 17 2018, 09:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Sep 17 2018, 12:19) *
а какое обратное действие log2? возведение в квадрат? я понимаю что шифт предпочтительней деления, тем более по модулю. не понимаю как до этого дошли sm.gif
...
а как это (1 << PAGE_SIZE) это 4096 ?

Вам бы в школу что-ль походить... 05.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 17 2018, 09:46
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075




Цитата(_pv @ Sep 17 2018, 14:26) *
1 << 12 == 0b 0001 0000 0000 0000 == 2 ^ 12 == 4096.


ой. точно. спасибо sm.gif

небольшая коррекция #define BLOCK_SIZE 6

Сообщение отредактировал Jenya7 - Sep 17 2018, 09:48
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 17 2018, 10:58
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075




я тут набросал симулятор в .Net для тестирования в реальном железе.
CODE
private void buttonGet_Click(object sender, EventArgs e)
{
if (!serial_port.IsOpen)
{
MessageBox.Show("Serial Port is closed!");
return;
}

int offset;
int size;

int send_offset = 0;
int size_to_send = 0;
int total_size = 0;

int prog_val = 0;

byte[] bytes = new byte[13];
string str;

if (!int.TryParse(textBoxOffset.Text, out offset) ||
!int.TryParse(textBoxSize.Text, out size) ||
!int.TryParse(textBoxTotalSize.Text, out total_size) ||
comboBoxPartition.SelectedIndex == -1)
{
MessageBox.Show("Wrong Parameters!");
return;
}

send_offset = offset;
size_to_send = total_size;

progressBarGetData.Maximum = total_size;

while (size_to_send > 0)
{
bytes[0] = 0xAA;
bytes[1] = 3; //DATA REQUEST COMMAND
bytes[2] = 7; //?
bytes[3] = 0; //?
bytes[4] = (byte)comboBoxPartition.SelectedIndex; //1-DATA PARTITION
bytes[5] = (byte)send_offset;
bytes[6] = (byte)(send_offset >> 8);
bytes[7] = (byte)(send_offset >> 16);
bytes[8] = (byte)(send_offset >> 24);
bytes[9] = (byte)size;
bytes[10] = (byte)(size >> 8);

//clear rx buffer
serial_port.ReadExisting();

try
{
serial_port.Write(bytes, 0, 13);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

str = ReadComPort(ASCII, 100, 1);
richTextBoxLog.AppendText(str);

size_to_send -= 65530;
send_offset += 65530;

prog_val += 65530;
if (prog_val < progressBarGetData.Maximum)
progressBarGetData.Value = prog_val;
else
progressBarGetData.Value = progressBarGetData.Maximum;

Application.DoEvents();
}
}
вроде работает корректно. общий размер данных может быть не кратен 65530 но это проблема PC side я так понимаю.

Сообщение отредактировал Jenya7 - Sep 17 2018, 10:59
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 06:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01541 секунд с 7
ELECTRONIX ©2004-2016