|
Локальные переменные. |
|
|
|
Jan 20 2015, 11:33
|
Профессионал
    
Группа: Участник
Сообщений: 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. Вопрос - как я понимаю это касается и аргументов передаваемых в функцию?
|
|
|
|
|
 |
Ответов
|
Jan 20 2015, 11:50
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jan 20 2015, 12:08
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Jan 20 2015, 11:50)  Ну а вот например Код 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? Если есть ну очень сильное желание, то этот код можно соптимизировать, чтобы он работал с 32-битными значениями. А оно сильно надо ? Этот код критичен к скорости выполнения ? Да, тогда еще возникнет ряд проблем, если размер массива не будет кратен 4 байтам, придется вводить пляски с бубном. Кроме того, могут возникнуть проблемы с выравниванием всего массива входных данных по границе слова. Если char* автоматически выравнен по границе байта, то uint32* будет выравнен по границе 4-х байтов. Если попытаться вычислить сумму начиная с невыравненного адреса, будут проблемы, в т.ч и с производительностью  Общие замечания: 1. в качестве первого параметра надо использовать const unsigned char*, облегчается жизнь себе и компилятору 2. эта контрольная сумма - дерьмо. Она не обнаруживает перестановку байтов, например. Есть гораздо более надежные методы и довольно простые - adler, fletcher checksum, ну и классические CRC
Сообщение отредактировал CrimsonPig - Jan 20 2015, 12:09
|
|
|
|
|
Jan 20 2015, 12:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(CrimsonPig @ Jan 20 2015, 18:08)  Если есть ну очень сильное желание, то этот код можно соптимизировать, чтобы он работал с 32-битными значениями. А оно сильно надо ? Этот код критичен к скорости выполнения ? Да, тогда еще возникнет ряд проблем, если размер массива не будет кратен 4 байтам, придется вводить пляски с бубном. Кроме того, могут возникнуть проблемы с выравниванием всего массива входных данных по границе слова. Если char* автоматически выравнен по границе байта, то uint32* будет выравнен по границе 4-х байтов. Если попытаться вычислить сумму начиная с невыравненного адреса, будут проблемы, в т.ч и с производительностью  Общие замечания: 1. в качестве первого параметра надо использовать const unsigned char*, облегчается жизнь себе и компилятору 2. эта контрольная сумма - дерьмо. Она не обнаруживает перестановку байтов, например. Есть гораздо более надежные методы и довольно простые - adler, fletcher checksum, ну и классические CRC это poor man CRC - быстро и просто без заморочек. а вообще прибор работает от батарейки поэтому скорость любой функции для меня важна - быстро отработал и пошел спать. а чем const упрощает жизнь кроме того что не дает модифицировать строку?
Сообщение отредактировал Jenya7 - Jan 20 2015, 12:17
|
|
|
|
|
Jan 20 2015, 12:28
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Jan 20 2015, 12:15)  это poor man CRC - быстро и просто без заморочек. а вообще прибор работает от батарейки поэтому скорость любой функции для меня важна - быстро отработал и пошел спать. а чем const упрощает жизнь кроме того что не дает модифицировать строку? 1. "Просто и без заморочек" - это очень хорошо... только вот с обнаружением ошибок будет весьма плохо. 2. про батарейку - вопрос спорный "быстро отработал" - не значит "мало съел". "Скорость любой функции" соптимизировать невозможно. Например, после долгого вырывания волос из попы автор таки соптимизирует свой алгоритм для работы с 32-битными числами. При этом размер кода вырастет в 2 раза, скорость выполнения увеличится на 0.1%, в то время как эта функция как вызывалась раз в секунду, так и вызывается. Оно того стоило ? Все равно потребление электричества надо будет мерять. Не факт что оптимизация по скорости уменьшит потребление энергии. 3. если гениальный автор с бодуна в своей функции напишет не val=*p++, а *p++ = val, и не протестирует (а некоторые вещи почти невозможно протестировать), то впоследствии может быть горько и обидно. Для меня использование const - это как личная гигиена.
|
|
|
|
Сообщений в этой теме
Jenya7 Локальные переменные. Jan 20 2015, 11:33 Сергей Борщ А чтобы код оставался более-менее оптимальным при ... Jan 20 2015, 11:42  ViKo Цитата(Jenya7 @ Jan 20 2015, 14:50) тут у... Jan 20 2015, 11:56     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  Сергей Борщ Цитата(Jenya7 @ Jan 20 2015, 13:50) тут у... Jan 20 2015, 17:26   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   Jenya7 Цитата(Сергей Борщ @ Jan 20 2015, 23:26) ... Jan 20 2015, 19:05    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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|