Перейти к содержанию
    

Cortex M3, M4 - разрядность переменных.

Какую разрядность переменных, лучше выбирать в случае когда "а пофиг" ?

Например флаг, который может быть 0 или1, максимум -1, или считающий до 10 счетчик, и тому подобное, когда можно и u8, и s8, и u32б и s32.

Памяти-то в Кортексах обычно более чем достаточно, и экономить нужно не всегда, но влияет-ли это на быстродействие программы?

Есть ли разница для локальных и глобальных переменных, и для volatile?

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть. Задавайте всё int, если ОЗУ у вас с избытком. Иные типы потребуют дополнительных команд (или байтов в команде). Оценить эффективность использования сможете, рассматривая листинг программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли разница для локальных и глобальных переменных, и для volatile?

Для локальных переменных, аргументов/результатов функций, используйте всегда нативные типы данных - int/uint.

Даже в случае экономии ОЗУ.

По занимаемому ОЗУ не будет никакой разницы, но кол-во команд однозначно будет меньше.

Для хранения в static памяти, нет большой разницы, но всё-же нативные типы тоже в некоторых случаях требуют меньше команд (или команды короче), так что для одиночных переменных - лучше они.

Для массивов лучше элементы меньшей разрядности (и в целях быстродействия операций с ними - тоже лучше). Но это моё имхо, не уверен, но надеюсь на повсеместное наличие write-back caching в M3/M4. Так что здесь предпочтение: u8/s8/u16/s16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще stdbool.h, и использовать bool тип.
Ну это как раз спорно.

Т.к. sizeof(bool) are implementation-defined и зачастую sizeof(bool)==sizeof(int), что для 8-ми битных контроллеров весьма печально.

Поэтому у меня наложено табу на stdbool.h в ембедед разработках.

А про uint_fast8_t Сергей дело говорит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну это как раз спорно.

Т.к. sizeof(bool) are implementation-defined и зачастую sizeof(bool)==sizeof(int), что для 8-ми битных контроллеров весьма печально.

Вижу, что в Keil для STM32 под bool выделяется байт. Да, пожалуй, неэффективно, ни по размеру ОЗУ, ни по коду. Но и целое слово выделять для логической переменной жалко. Тогда - битовые поля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда - битовые поля.
И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте.

Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы.

 

Разница конечно есть, но она ничтожна, нужно использовать тот тип данных который нужен.
uint_fast8_t - наше всё:)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте.

Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы.

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

 

И утрамбовать поля в слова можно так, чтобы не поганить одно поле при доступе к другому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1268117[/url]']

И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте.

Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы.

 

uint_fast8_t - наше всё :)

 

Спасибо всем.Чем отличается uint_fast8_t от просто u8 ? Насколько я понимаю, и то и то - байт?

Хотя нет - фаст это инт, т.е. 32 бита.

Тогда непонятно - зачем фаст8, фаст16, фаст32, если все это инт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо всем.Чем отличается uint_fast8_t от просто u8 ? Насколько я понимаю, и то и то - байт?

Первое - не байт, а самое быстрое использование байта, конкретно, в STM32 должно превратиться в int.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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 или мимо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда тут double берется, и будет ли это считаться через FPU или мимо?

 

У Вас константы типа double, соответственно переменные также приводятся к double и вычисления будут двойной точности и "FPU мимо".

Добавьте к константам суффикс F

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первое - не байт, а самое быстрое использование байта, конкретно, в STM32 должно превратиться в int.

Тогда сильно сомневаюсь, что заполнение массива uint_fast8_t в цикле будет быстрее, чем массива u8.

Скорее - наоборот. Так как по размеру/кол-ву команд - одинаково, но кэш обратной записи предпочтёт u8.

Да и на чтение - аналогично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...