|
Типы даных, ARM7 NXP |
|
|
|
Jul 21 2009, 08:28
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137

|
Постоянно читаю форум, но так и не уяснил для себя какой тип данных лучше использовать для максимального быстродействия, камень LPC2148. Например, в цикле Код #define VALUE 100
for(... i; i < VALUE; i++) {
/* code */
} как объявить переменную i - uchar, uint, ulong? И если в коде используется много семафоров что лучше использовать: битовые операции, или для каждого флага объявлять свою переменную (какого типа)?
|
|
|
|
|
Jul 21 2009, 08:44
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Наиболее быстро - объявить ее локальной и как register. Если Вы внимательно посмотрите на то место, куда топикстартер желает вставить идентификатор типа, то увидите, что переменная и так будет локальной. К сожалению, современные компиляторы очень зря игнорируют ключевое слово register. Посему главное - чтобы переменная занимала ровно один регистр, ни больше, ни меньше (грубо говоря). Для этого есть специальные волшебные слова, описанные в stdint.h
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 21 2009, 08:53
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137

|
Спасибо за ответы  . Ответ на второй вопрос меня волнует не меньше первого ))
|
|
|
|
|
Jul 21 2009, 09:22
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137

|
Цитата(Rst7 @ Jul 21 2009, 12:59)  Если Вы работаете с этим переменными в ОЗУ, то быстее всего будет volatile(если надо) uint8_t. Это, конечно, будет проигрыш по ОЗУ, но зато выигрыш по быстродействию. Понятно. А как они будут укладываться в ОЗУ: 4 переменных типа uint8_t подряд или одна будет занимать 32 бита? И еще вопрос: если же особого быстродействия не требуется то лучше объявить одну переменную и проверять биты CODE #define FLAG0 0 #define FLAG1 1 /*...................*/
uint FLAGS;
/*...............*/
main(void) { if(FLAGS & (1 << FLAGn) /* do something */ ;
} ?
|
|
|
|
|
Jul 21 2009, 09:33
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата А как они будут укладываться в ОЗУ: 4 переменных типа uint8_t подряд или одна будет занимать 32 бита? Обычно компилятор складывает их вместе. Более точно ответы на Ваши вопросы даст ассемблеровский листинг, генерируемый компилятором и map-файл, генерируемый линкером. Цитата И еще вопрос: если же особого быстродействия не требуется то лучше объявить одну переменную и проверять биты Да. Но это увеличивает объем программного кода.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 21 2009, 10:17
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137

|
Если не затруднит, приведите пожалуйста пример, в каком случае следует использовать 2-ные слова. На будущее.
|
|
|
|
|
Jul 21 2009, 10:51
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата быстее всего будет volatile Это будет медленнее всего. Это волшебное слово означает, что чтение данной переменной ВСЕГДА будет осуществлятся из места пребывания, и никогда не будет сохранятся даже для временных целей. К примеру , компилятор бы рад расположить переменную цикла в регистре (что будет быстро и экономно), но volatile это дело запретит. Далее. IAR легко воспринимает слово register. Зависимость скорости обращения от разряднсти переменной. Зависит кроме всего прочего от схемы электрической принципиальной.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Jul 21 2009, 10:54
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137

|
Цитата(Rst7 @ Jul 21 2009, 14:19)  Дык в цикле Вам предложено сделать именно 32хбитную переменную. Для Вашего процессора uint_fast8_t соответствует uint32_t. Мдаааа. Чувстую себя дурак - дураком, после АВР в моем мозгу прочно засело вредное заблуждение, что unsigned int всегда имеет размерность 2 байта (((. Только что проверил с помощью нехитрого кода что заблуждался.. Значит вся вот эта красота: Код /* fastest minimum-width unsigned integer types */ typedef unsigned int uint_fast8_t; typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; для обеспечения переносимости?
|
|
|
|
|
Jul 21 2009, 10:59
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Это будет медленнее всего. Это волшебное слово означает Вы, похоже, не читаете, что я пишу. Написано же в скобках - "если надо". Цитата К примеру , компилятор бы рад расположить переменную цикла в регистре (что будет быстро и экономно), но volatile это дело запретит. Причем тут переменная цикла? Обсуждаем уже второй вопрос - про флаги. Цитата Далее. IAR легко воспринимает слово register. Путем игнорирования. Цитата Зависимость скорости обращения от разряднсти переменной. Зависит кроме всего прочего от схемы электрической принципиальной. Я может чего пропустил, но у заявленного проца внешней шины вроде не видать  Цитата для обеспечения переносимости? Даже для обеспечения оптимальности кода независимо от разрядности проца. Хоть 8, хоть 64 бита.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|