Allregia 9 11 июля, 2014 Опубликовано 11 июля, 2014 · Жалоба Какую разрядность переменных, лучше выбирать в случае когда "а пофиг" ? Например флаг, который может быть 0 или1, максимум -1, или считающий до 10 счетчик, и тому подобное, когда можно и u8, и s8, и u32б и s32. Памяти-то в Кортексах обычно более чем достаточно, и экономить нужно не всегда, но влияет-ли это на быстродействие программы? Есть ли разница для локальных и глобальных переменных, и для volatile? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 11 июля, 2014 Опубликовано 11 июля, 2014 · Жалоба Есть. Задавайте всё int, если ОЗУ у вас с избытком. Иные типы потребуют дополнительных команд (или байтов в команде). Оценить эффективность использования сможете, рассматривая листинг программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 июля, 2014 Опубликовано 11 июля, 2014 · Жалоба Есть ли разница для локальных и глобальных переменных, и для volatile? Для локальных переменных, аргументов/результатов функций, используйте всегда нативные типы данных - int/uint. Даже в случае экономии ОЗУ. По занимаемому ОЗУ не будет никакой разницы, но кол-во команд однозначно будет меньше. Для хранения в static памяти, нет большой разницы, но всё-же нативные типы тоже в некоторых случаях требуют меньше команд (или команды короче), так что для одиночных переменных - лучше они. Для массивов лучше элементы меньшей разрядности (и в целях быстродействия операций с ними - тоже лучше). Но это моё имхо, не уверен, но надеюсь на повсеместное наличие write-back caching в M3/M4. Так что здесь предпочтение: u8/s8/u16/s16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба На любом совершенно процессоре подключить к программе заголовочный файл stdint.h и всегда использовать объявленные в нем типы: uintXX_t - для данных, которым важен точный размер переменной, uint_fastXX_t - для данных, при работе с которыми важна скорость. Из фундаментальных типов в программе использовать только char и только для переменных, хранящих текстовые символы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба И еще stdbool.h, и использовать bool тип. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба И еще stdbool.h, и использовать bool тип.Ну это как раз спорно. Т.к. sizeof(bool) are implementation-defined и зачастую sizeof(bool)==sizeof(int), что для 8-ми битных контроллеров весьма печально. Поэтому у меня наложено табу на stdbool.h в ембедед разработках. А про uint_fast8_t Сергей дело говорит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба Ну это как раз спорно. Т.к. sizeof(bool) are implementation-defined и зачастую sizeof(bool)==sizeof(int), что для 8-ми битных контроллеров весьма печально. Вижу, что в Keil для STM32 под bool выделяется байт. Да, пожалуй, неэффективно, ни по размеру ОЗУ, ни по коду. Но и целое слово выделять для логической переменной жалко. Тогда - битовые поля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба Разница конечно есть, но она ничтожна, нужно использовать тот тип данных который нужен. ИМХО простота и понятность программы важнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба Тогда - битовые поля.И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте. Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы. Разница конечно есть, но она ничтожна, нужно использовать тот тип данных который нужен.uint_fast8_t - наше всё:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте. Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы. Не единственный. Еще есть команды эксклюзивного доступа. LDREX и т.д. И соответствующие им интринсики для компилятора __LDREX(). И утрамбовать поля в слова можно так, чтобы не поганить одно поле при доступе к другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба 1268117[/url]'] И потом для обеспечения атомарного доступа обрамлять к ним доступ критическими секциями. Увольте. Единственный костыль для кортексов - это битбанд доступ к этим битам в поле. Но эти извращения должны быть сильно оправданы. uint_fast8_t - наше всё :) Спасибо всем.Чем отличается uint_fast8_t от просто u8 ? Насколько я понимаю, и то и то - байт? Хотя нет - фаст это инт, т.е. 32 бита. Тогда непонятно - зачем фаст8, фаст16, фаст32, если все это инт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба Спасибо всем.Чем отличается uint_fast8_t от просто u8 ? Насколько я понимаю, и то и то - байт? Первое - не байт, а самое быстрое использование байта, конкретно, в STM32 должно превратиться в int. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба Еще пара вопросов про плавающую точку: 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 или мимо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ms1 0 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба Откуда тут double берется, и будет ли это считаться через FPU или мимо? У Вас константы типа double, соответственно переменные также приводятся к double и вычисления будут двойной точности и "FPU мимо". Добавьте к константам суффикс F Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 июля, 2014 Опубликовано 13 июля, 2014 · Жалоба Первое - не байт, а самое быстрое использование байта, конкретно, в STM32 должно превратиться в int. Тогда сильно сомневаюсь, что заполнение массива uint_fast8_t в цикле будет быстрее, чем массива u8. Скорее - наоборот. Так как по размеру/кол-ву команд - одинаково, но кэш обратной записи предпочтёт u8. Да и на чтение - аналогично. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться