Перейти к содержанию
    

Алгоритм вычисления страницы

Есть память со следующей архитектурой

MEMORY = 1815 BLOCKS
1 BLOCK = 64 PAGES
1 PAGE = 4096 BYTE

То есть память разделена на блоки, блоки разделены на страницы, каждая страница 4К.

Мне передают в качестве аргументов офсет и размер данных и на основе этих двух параметров я должен вытащить данные.Для облегчения задачи мне передают фиксированный размер 65530 байт, соответственно офсет увеличивается на 65530.

#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;
}

получаю лог

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.

 

Теперь я изменяю функцию

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 цикл, но если посмотреть лог

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#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);   
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;
  }
}

и вот лог

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

арифметика подвела,

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

 

#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

 

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 ?

 

убейте не понимаю как это работает. :)

read_num = (12*2) - 65530 = ????????

однако вычисляется 4096

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Кажется так:

PAGE_SIZE = log2(4096)
BLOCK_SIZE  = log2(4096*64)

4096 размер страницы

64 количество страниц в блоке

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

убейте не понимаю как это работает. :)

read_num = (12*2) - 65530 = ????????

однако вычисляется 4096

 

read_num = 4096 - offset; т.е. сколько осталось до конца страницы.

offset внутри страницы = address & 0xFFF т.е. от 0 до 4095

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кажется так:

PAGE_SIZE = log2(4096)
BLOCK_SIZE  = log2(4096*64)

4096 размер страницы

64 количество страниц в блоке

 

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

 

read_num = 4096 - offset;

offset внутри страницы = address & 0xFFF т.е. от 0 до 4095

 

а как это (1 << PAGE_SIZE) это 4096 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

http://bfy.tw/Jv8I

 

 

а как это (1 << PAGE_SIZE) это 4096 ?

1 << 12 == 0b 0001 0000 0000 0000 == 2 ^ 12 == 4096.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

а как это (1 << PAGE_SIZE) это 4096 ?

Вам бы в школу что-ль походить... :05:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

1 << 12 == 0b 0001 0000 0000 0000 == 2 ^ 12 == 4096.

 

ой. точно. спасибо :)

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

я тут набросал симулятор в .Net для тестирования в реальном железе.

 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...