Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Считать лог в С. / 20 сообщений из 20, страница 1 из 1
19.10.2015, 15:20
    #39080230
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
есть массив(память) который заполняется записями. каждая запись 2 байта.
я хочу взять скажем 100 последних записей кусками по 20 байт. как мне это сделать?
Есть START_ADDRESS, LAST_ADDRESS, chunk = 20;
...
Рейтинг: 0 / 0
19.10.2015, 15:30
    #39080240
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Что значит "массив(память)" как конкретно он объявлен?
"хочу взять" что под этим подразумевается?
LAST_ADDRESS это что?

Пиши подробнее. Телепатов тут нет.
...
Рейтинг: 0 / 0
19.10.2015, 15:33
    #39080246
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima TЧто значит "массив(память)" как конкретно он объявлен?
"хочу взять" что под этим подразумевается?
LAST_ADDRESS это что?

Пиши подробнее. Телепатов тут нет.

"массив(память)" - это внешняя память.

Кое что я набросал. Но мне это не нравиться.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
uint32_t chank = 20; 
uint32_t last_log_addr = (logNum * DELTA_SIZE) + START_LOG_ADRESS;
uint32_t packet_size;
uint32_t current_addr = last_log_addr;  

//check if the overflow occurred
while (current_addr > START_LOG_ADRESS)
{
    packet_size = chank;

    uint8_t buf[packet_size];

    LOGGER_Readlog(current_addr,packet_size,buf);

    SendBuf(buf);

    current_addr -= chank; 
}
// send the rest of data ???
...
Рейтинг: 0 / 0
19.10.2015, 15:41
    #39080253
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
jenya7"массив(память)" - это внешняя память.
так и скажи - есть файл

chank - лучше писать ch u nk
...
Рейтинг: 0 / 0
19.10.2015, 15:43
    #39080258
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
jenya7Кое что я набросал. Но мне это не нравиться.
Этот код рабочий?

Если рабочий, то что не нравится?

PS Ну нет тут телепатов.
...
Рейтинг: 0 / 0
19.10.2015, 15:52
    #39080261
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima Tjenya7Кое что я набросал. Но мне это не нравиться.
Этот код рабочий?

Если рабочий, то что не нравится?

PS Ну нет тут телепатов.

функции рабочие. сам код запустить пока не могу. ну если только создать какой нибудь массив эмулирующий память. я считываю из внешней памяти посредством микроконтролера. вопрос все ли алгоритмически исполнено правильно.
...
Рейтинг: 0 / 0
19.10.2015, 15:57
    #39080263
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
У тебя тут возможно зацикливание:
Код: sql
1.
2.
3.
4.
uint32_t current_addr = last_log_addr; 
while (current_addr > START_LOG_ADRESS) {
    current_addr -= chank; 
}


Например при
Код: sql
1.
2.
3.
START_LOG_ADRESS = 0
current_addr = 10
chank = 20


Для типа uint32_t 10-20 = 4млрд. с копейками.

Может лучше использовать знаковый int или int32_t ?
...
Рейтинг: 0 / 0
19.10.2015, 15:59
    #39080265
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima T,

он говорит про микросхему памяти, которая подключена у него к микроконтроллеру по какому-то стандартному интерфейсу вроде SPI или I²C.
...
Рейтинг: 0 / 0
19.10.2015, 16:03
    #39080273
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
jenya7функции рабочие. сам код запустить пока не могу. ну если только создать какой нибудь массив эмулирующий память. я считываю из внешней памяти посредством микроконтролера. вопрос все ли алгоритмически исполнено правильно.
Про типы я тебе уже написал.
По функциям как минимум надо еще проверять что они успешно выполнились и ошибки обрабатывать. Как это делать - читай документацию на эти функции.

while() можно на for() заменить
Код: sql
1.
2.
3.
for(uint32_t current_addr = (logNum * DELTA_SIZE) + START_LOG_ADRESS; current_addr > START_LOG_ADRESS; current_addr -= chank) {
...
}


Это уже дело вкуса.
...
Рейтинг: 0 / 0
19.10.2015, 16:09
    #39080288
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima TУ тебя тут возможно зацикливание:
Код: sql
1.
2.
3.
4.
uint32_t current_addr = last_log_addr; 
while (current_addr > START_LOG_ADRESS) {
    current_addr -= chank; 
}


Например при
Код: sql
1.
2.
3.
START_LOG_ADRESS = 0
current_addr = 10
chank = 20


Для типа uint32_t 10-20 = 4млрд. с копейками.

Может лучше использовать знаковый int или int32_t ?

да это верно. переменная должна быть знаковая. а как мне взять остаток который не уложился в последний пакет?
...
Рейтинг: 0 / 0
19.10.2015, 16:20
    #39080309
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
jenya7как мне взять остаток который не уложился в последний пакет?
посчитать
Код: sql
1.
2.
3.
4.
5.
6.
7.
if(current_addr - START_LOG_ADRESS > chank) {
 packet_size = chank;
} else {
 packet_size = current_addr - START_LOG_ADRESS;
}
...
current_addr -= packet_size;


Тут опять же надо это учесть не меняет ли LOGGER_Readlog() значение packet_size
SendBuf() как-то должен узнать о размере.
...
Рейтинг: 0 / 0
19.10.2015, 16:26
    #39080323
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima Tjenya7как мне взять остаток который не уложился в последний пакет?
посчитать
Код: sql
1.
2.
3.
4.
5.
6.
7.
if(current_addr - START_LOG_ADRESS > chank) {
 packet_size = chank;
} else {
 packet_size = current_addr - START_LOG_ADRESS;
}
...
current_addr -= packet_size;


Тут опять же надо это учесть не меняет ли LOGGER_Readlog() значение packet_size
SendBuf() как-то должен узнать о размере.

спасибо. как раз то что нужно. LOGGER_Readlog() не меняет значений. ну кроме буфера конечно.
...
Рейтинг: 0 / 0
19.10.2015, 16:43
    #39080361
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Проверку ошибок не забудь добавить.
...
Рейтинг: 0 / 0
19.10.2015, 16:44
    #39080364
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
а если мне нужно посчитать сколько пакетов по 20 байт выйдет то мне нужно вставить
Код: 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.
   uint32_t chunk = 20; 
   uint32_t last_log_addr = (logNum * DELTA_SIZE) + START_LOG_ADRESS;
   uint32_t packet_size;
   int32_t current_addr = last_log_addr;  
   uint32_t num_of_packets = 0;
    
    while (current_addr > START_LOG_ADRESS)
    {
      current_addr -= chunk;
      num_of_packets++;
    }

    //check if the overflow occurred
    while (current_addr > START_LOG_ADRESS)
    {
    	if(current_addr - START_LOG_ADRESS >= chunk)
    	    packet_size = chunk;
    	else
    	    packet_size = current_addr -START_LOG_ADRESS;

    	uint8_t buf[packet_size];

    	LOGGER_Read(current_addr,packet_size,buf);

    	SendBuf(buf);

    	current_addr -= chunk; 
    }


досадно. два раза цикл прогонять.
...
Рейтинг: 0 / 0
19.10.2015, 16:56
    #39080390
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Зачем два цикла? Вставь num_of_packets++ во второй. Первый не нужен.
Код: sql
1.
2.
3.
4.
5.
6.
    //check if the overflow occurred
    while (current_addr > START_LOG_ADRESS)
    {
        num_of_packets++;
    	if(current_addr - START_LOG_ADRESS >= chunk)
...
...
Рейтинг: 0 / 0
19.10.2015, 16:59
    #39080398
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Это
Код: plaintext
1.
2.
3.
4.
  	if(current_addr - START_LOG_ADRESS >= chunk)
    	    packet_size = chunk;
    	else
    	    packet_size = current_addr -START_LOG_ADRESS;

можно писать одной строкой
Код: sql
1.
    	    packet_size = (current_addr - START_LOG_ADRESS >= chunk) ? chunk : (current_addr - START_LOG_ADRESS);
...
Рейтинг: 0 / 0
19.10.2015, 17:01
    #39080407
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima TЗачем два цикла? Вставь num_of_packets++ во второй. Первый не нужен.
Код: sql
1.
2.
3.
4.
5.
6.
    //check if the overflow occurred
    while (current_addr > START_LOG_ADRESS)
    {
        num_of_packets++;
    	if(current_addr - START_LOG_ADRESS >= chunk)
...



а мне надо знать количество пакетов до посылки.
приемная часть должна знать сколько пакетов принять.
...
Рейтинг: 0 / 0
19.10.2015, 17:07
    #39080417
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima TЭто
Код: plaintext
1.
2.
3.
4.
  	if(current_addr - START_LOG_ADRESS >= chunk)
    	    packet_size = chunk;
    	else
    	    packet_size = current_addr -START_LOG_ADRESS;

можно писать одной строкой
Код: sql
1.
    	    packet_size = (current_addr - START_LOG_ADRESS >= chunk) ? chunk : (current_addr - START_LOG_ADRESS);



спасибо. как то не привык пользоваться тернарной записью. ну надо начинать. что называется почувствуй себя крутым кодером. :)
...
Рейтинг: 0 / 0
19.10.2015, 17:08
    #39080419
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
jenya7а мне надо знать количество пакетов до посылки.
приемная часть должна знать сколько пакетов принять.
Тогда посчитай.
Код: plaintext
1.
2.
3.
4.
num_of_packets = (current_addr - START_LOG_ADRESS) / chunk; // количество целых пакетов
if((current_addr - START_LOG_ADRESS) % chunk != 0) { // неровно делится на chunk 
  num_of_packets++; // +1 неполный пакет
}


Циклы тут не нужны.
...
Рейтинг: 0 / 0
19.10.2015, 17:16
    #39080437
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Считать лог в С.
Dima Tjenya7а мне надо знать количество пакетов до посылки.
приемная часть должна знать сколько пакетов принять.
Тогда посчитай.
Код: plaintext
1.
2.
3.
4.
num_of_packets = (current_addr - START_LOG_ADRESS) / chunk; // количество целых пакетов
if((current_addr - START_LOG_ADRESS) % chunk != 0) { // неровно делится на chunk 
  num_of_packets++; // +1 неполный пакет
}


Циклы тут не нужны.

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


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