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

 
 
> Cortex M3, M4 - разрядность переменных.
Allregia
сообщение Jul 11 2014, 11:47
Сообщение #1


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Какую разрядность переменных, лучше выбирать в случае когда "а пофиг" ?
Например флаг, который может быть 0 или1, максимум -1, или считающий до 10 счетчик, и тому подобное, когда можно и u8, и s8, и u32б и s32.
Памяти-то в Кортексах обычно более чем достаточно, и экономить нужно не всегда, но влияет-ли это на быстродействие программы?
Есть ли разница для локальных и глобальных переменных, и для volatile?

Спасибо.
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 14)
ViKo
сообщение Jul 11 2014, 12:03
Сообщение #2


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

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



Есть. Задавайте всё int, если ОЗУ у вас с избытком. Иные типы потребуют дополнительных команд (или байтов в команде). Оценить эффективность использования сможете, рассматривая листинг программы.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 11 2014, 16:10
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Allregia @ Jul 11 2014, 17:47) *
Есть ли разница для локальных и глобальных переменных, и для volatile?

Для локальных переменных, аргументов/результатов функций, используйте всегда нативные типы данных - int/uint.
Даже в случае экономии ОЗУ.
По занимаемому ОЗУ не будет никакой разницы, но кол-во команд однозначно будет меньше.
Для хранения в static памяти, нет большой разницы, но всё-же нативные типы тоже в некоторых случаях требуют меньше команд (или команды короче), так что для одиночных переменных - лучше они.
Для массивов лучше элементы меньшей разрядности (и в целях быстродействия операций с ними - тоже лучше). Но это моё имхо, не уверен, но надеюсь на повсеместное наличие write-back caching в M3/M4. Так что здесь предпочтение: u8/s8/u16/s16.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2014, 06:33
Сообщение #4


Гуру
******

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



На любом совершенно процессоре подключить к программе заголовочный файл stdint.h и всегда использовать объявленные в нем типы: uintXX_t - для данных, которым важен точный размер переменной, uint_fastXX_t - для данных, при работе с которыми важна скорость. Из фундаментальных типов в программе использовать только char и только для переменных, хранящих текстовые символы.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jul 12 2014, 07:06
Сообщение #5


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

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



И еще stdbool.h, и использовать bool тип.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 12 2014, 08:41
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ViKo @ Jul 12 2014, 11:06) *
И еще stdbool.h, и использовать bool тип.
Ну это как раз спорно.
Т.к. sizeof(bool) are implementation-defined и зачастую sizeof(bool)==sizeof(int), что для 8-ми битных контроллеров весьма печально.
Поэтому у меня наложено табу на stdbool.h в ембедед разработках.
А про uint_fast8_t Сергей дело говорит.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 12 2014, 09:03
Сообщение #7


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

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



Цитата(demiurg_spb @ Jul 12 2014, 11:41) *
Ну это как раз спорно.
Т.к. sizeof(bool) are implementation-defined и зачастую sizeof(bool)==sizeof(int), что для 8-ми битных контроллеров весьма печально.

Вижу, что в Keil для STM32 под bool выделяется байт. Да, пожалуй, неэффективно, ни по размеру ОЗУ, ни по коду. Но и целое слово выделять для логической переменной жалко. Тогда - битовые поля.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jul 12 2014, 09:42
Сообщение #8


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Разница конечно есть, но она ничтожна, нужно использовать тот тип данных который нужен. ИМХО простота и понятность программы важнее.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 12 2014, 09:56
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ViKo @ Jul 12 2014, 13:03) *
Тогда - битовые поля.
И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте.
Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы.

Цитата(skripach @ Jul 12 2014, 13:42) *
Разница конечно есть, но она ничтожна, нужно использовать тот тип данных который нужен.
uint_fast8_t - наше всёsm.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 12 2014, 10:33
Сообщение #10


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

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



Цитата(demiurg_spb @ Jul 12 2014, 12:56) *
И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте.
Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы.

Не единственный. Еще есть команды эксклюзивного доступа. LDREX и т.д. И соответствующие им интринсики для компилятора __LDREX().

И утрамбовать поля в слова можно так, чтобы не поганить одно поле при доступе к другому.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 12 2014, 10:42
Сообщение #11


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(demiurg_spb @ Jul 12 2014, 11:56)
1268117[/url]']
И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте.
Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы.

uint_fast8_t - наше всё sm.gif


Спасибо всем.Чем отличается uint_fast8_t от просто u8 ? Насколько я понимаю, и то и то - байт?
Хотя нет - фаст это инт, т.е. 32 бита.
Тогда непонятно - зачем фаст8, фаст16, фаст32, если все это инт?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 12 2014, 10:49
Сообщение #12


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

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



Цитата(Allregia @ Jul 12 2014, 13:42) *
Спасибо всем.Чем отличается uint_fast8_t от просто u8 ? Насколько я понимаю, и то и то - байт?

Первое - не байт, а самое быстрое использование байта, конкретно, в STM32 должно превратиться в int.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 12 2014, 22:03
Сообщение #13


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Еще пара вопросов про плавающую точку:

1) как я понял, чтобы М4 использовал FPU, надо чтобы все переменные были только float, а если double - то FPU не задействуется?

2) На такую строчку:
Код
static float b0, b1;
...

  b0 = b0* 0.99765 + b1*0.0990460;


Keil дает ворнинг:
#1035-D: single-precision operand implicitly converted to double-precision

Откуда тут double берется, и будет ли это считаться через FPU или мимо?
Go to the top of the page
 
+Quote Post
ms1
сообщение Jul 12 2014, 22:22
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 150
Регистрация: 13-10-05
Пользователь №: 9 614



Цитата(Allregia @ Jul 13 2014, 01:03) *
Откуда тут double берется, и будет ли это считаться через FPU или мимо?


У Вас константы типа double, соответственно переменные также приводятся к double и вычисления будут двойной точности и "FPU мимо".
Добавьте к константам суффикс F
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 13 2014, 04:29
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Jul 12 2014, 16:49) *
Первое - не байт, а самое быстрое использование байта, конкретно, в STM32 должно превратиться в int.

Тогда сильно сомневаюсь, что заполнение массива uint_fast8_t в цикле будет быстрее, чем массива u8.
Скорее - наоборот. Так как по размеру/кол-ву команд - одинаково, но кэш обратной записи предпочтёт u8.
Да и на чтение - аналогично.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 03:36
Рейтинг@Mail.ru


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