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

 
 
> Локальные переменные.
Jenya7
сообщение Jan 20 2015, 11:33
Сообщение #1


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

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



Прочитал следующее в ARM System Developer's Guide.
Цитата
ARMv4-based processors can efficiently load and store 8-, 16-, and 32-bit data. However,
most ARM data processing operations are 32-bit only. For this reason, you should use
a 32-bit datatype, int or long, for local variables wherever possible. Avoid using char and
short as local variable types, even if you are manipulating an 8- or 16-bit value. The one
exception is when you want wrap-around to occur.

И переделал все локальные переменные на uint32_t.
Вопрос - как я понимаю это касается и аргументов передаваемых в функцию?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Jan 20 2015, 11:36
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Jenya7 @ Jan 20 2015, 14:33) *
Прочитал следующее в ARM System Developer's Guide.

И переделал все локальные переменные на uint32_t.
Вопрос - как я понимаю это касается и аргументов передаваемых в функцию?

Да. И возвращаемых значений тоже.
Не касается это лишь управляющих структур, массивов, которые используются в программе. Чтобы место экономить.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 20 2015, 11:50
Сообщение #3


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

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



Цитата(ViKo @ Jan 20 2015, 17:36) *
Да. И возвращаемых значений тоже.
Не касается это лишь управляющих структур, массивов, которые используются в программе. Чтобы место экономить.

Ну а вот например
Код
uint32_t MessageChecksum(unsigned char *p, uint32_t len)
{
    uint32_t csum = 0;
    while (len)
    {
      csum+=(*p)&0xFF;
      p++;
      len--;
    }
    return csum;
}

тут у меня unsigned char потому что это касается UART я передаю данные 8 бит. или все равно привести к uint32_t?

uint_fastXX_t это если я захочу перенести код на AVR sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 20 2015, 17:26
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Jenya7 @ Jan 20 2015, 13:50) *
тут у меня unsigned char потому что это касается UART я передаю данные 8 бит.
А складываете вы их всегда в массив unsigned char? И берете всегда из массива unsigned char? Эта функция по идее считает CRC чего угодно. Вот и передавать ей надо "указатель на что угодно", т.е void const *, а внутри заводите уже временную переменную типа "указатель на байт" и присваивайте ей переданный указатель с явным приведением типа. Это позволит написать
Код
typedef struct { ...... } message_t;

message_t Message = {.....};
Checksum = MessageChecksum(&Message, sizeof(Message));
избежав явного приведения типа (unsigned char const *)&Message в большинстве точек вызова. А это разгружает исходник, делая его более легкочитаемым.

Цитата(Jenya7 @ Jan 20 2015, 13:50) *
или все равно привести к uint32_t?
Привести к uint32_t что? Вы передает указатель. От того, на какой тип этот указатель указывает его размер не изменится. А вот если размер ваших сообщений по спецификации протокола не может превышать 255 или 65535 байт, то параметр len имеет смысл делать uint_fast8_t или uint_fast16_t.
Цитата(Jenya7 @ Jan 20 2015, 13:50) *
uint_fastXX_t это если я захочу перенести код на AVR sm.gif
Не обязательно AVR. Вы можете захотеть его перенести на 16- 32- или 64-битную архитектуру, которая умеет делать арифметику с числами 8- или 16-битной разрядности (MSP430 или персоналку). И чтобы этот код и на другой архитектуре тоже был оптимальным без перелопачивания тысяч строк кода, имеет смысл сразу писать его грамотно (или хотя бы стараться писать грамотно).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 20 2015, 19:05
Сообщение #5


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

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



Цитата(Сергей Борщ @ Jan 20 2015, 23:26) *
А складываете вы их всегда в массив unsigned char? И берете всегда из массива unsigned char? Эта функция по идее считает CRC чего угодно. Вот и передавать ей надо "указатель на что угодно", т.е void const *, а внутри заводите уже временную переменную типа "указатель на байт" и присваивайте ей переданный указатель с явным приведением типа. Это позволит написать
Код
typedef struct { ...... } message_t;

message_t Message = {.....};
Checksum = MessageChecksum(&Message, sizeof(Message));
избежав явного приведения типа (unsigned char const *)&Message в большинстве точек вызова. А это разгружает исходник, делая его более легкочитаемым.

а struct как определить? typedef struct {unsigned char paket[BUF_SIZE]} message_t; ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Локальные переменные.   Jan 20 2015, 11:33
|- - Сергей Борщ   А чтобы код оставался более-менее оптимальным при ...   Jan 20 2015, 11:42
|- - ViKo   Цитата(Jenya7 @ Jan 20 2015, 14:50) тут у...   Jan 20 2015, 11:56
|- - CrimsonPig   Цитата(Jenya7 @ Jan 20 2015, 11:50) Ну а ...   Jan 20 2015, 12:08
||- - Jenya7   Цитата(CrimsonPig @ Jan 20 2015, 18:08) Е...   Jan 20 2015, 12:15
||- - CrimsonPig   Цитата(Jenya7 @ Jan 20 2015, 12:15) это p...   Jan 20 2015, 12:28
||- - Jenya7   Цитата(CrimsonPig @ Jan 20 2015, 18:28) 1...   Jan 20 2015, 12:39
||- - CrimsonPig   Цитата(Jenya7 @ Jan 20 2015, 12:39) обрат...   Jan 20 2015, 12:47
||- - Jenya7   Цитата(CrimsonPig @ Jan 20 2015, 18:47) К...   Jan 20 2015, 12:58
||- - CrimsonPig   Цитата(Jenya7 @ Jan 20 2015, 12:58) нет и...   Jan 20 2015, 13:39
|- - CrimsonPig   Цитата(Сергей Борщ @ Jan 20 2015, 17:26) ...   Jan 20 2015, 17:40
||- - AHTOXA   Цитата(CrimsonPig @ Jan 20 2015, 22:40) v...   Jan 20 2015, 18:19
||- - CrimsonPig   Цитата(AHTOXA @ Jan 20 2015, 18:19) У Се...   Jan 20 2015, 18:27
|- - AHTOXA   Цитата(Jenya7 @ Jan 21 2015, 00:05) а str...   Jan 20 2015, 19:25
||- - ViKo   Цитата(AHTOXA @ Jan 20 2015, 22:25) Испол...   Jan 20 2015, 21:12
|- - Сергей Борщ   Цитата(Jenya7 @ Jan 20 2015, 21:05) а str...   Jan 21 2015, 07:10
- - Jenya7   спасибо. придется засучить рукава. этож тысячи стр...   Jan 20 2015, 12:06
- - Jenya7   спасибо. узнал много интересного. только вот Серг...   Jan 21 2015, 07:24
- - Сергей Борщ   Цитата(Jenya7 @ Jan 21 2015, 09:24) а в т...   Jan 21 2015, 07:56


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:13
Рейтинг@Mail.ru


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