|
Cortex M3, M4 - разрядность переменных. |
|
|
|
Jul 11 2014, 11:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Какую разрядность переменных, лучше выбирать в случае когда "а пофиг" ? Например флаг, который может быть 0 или1, максимум -1, или считающий до 10 счетчик, и тому подобное, когда можно и u8, и s8, и u32б и s32. Памяти-то в Кортексах обычно более чем достаточно, и экономить нужно не всегда, но влияет-ли это на быстродействие программы? Есть ли разница для локальных и глобальных переменных, и для volatile?
Спасибо.
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Jul 13 2014, 04:55
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Если Вы потрудитесь открыть например "Cortex-M3 Technical Reference Manual", то тоже сможете усмотреть. Например в разделе Bus Interface\Write buffer: CODE The processor exports memory attributes on the System bus by the addition of a sideband bus, MEMATTR. Table 14-3 shows the relationship between MEMATTR[0] and HPROT[3:2]. Table 14-3 Memory attributes MEMATTR[0] HPROT[3] HPROT[2] Description 0 0 0 Strongly ordered 0 0 1 Device 0 1 0 L1 cacheable, L2 not cacheable 1 0 0 Invalid 1 0 1 Invalid 1 1 0 Cache WT, allocate on read 0 1 1 Cache WB, allocate on read and write 1 1 1 Cache WB, allocate on read Да и вообще в куче мест, если воспользуетесь поиском по "cache". Например ещё в MPU. PS: К тому-же кеш может быть не в ядре M3, а периферии конкретного МК, например в его External Memory Interface. PPS: А интересно, уважаемый DASM, у вас не возникала мысль "зачем вообще нужны команды типа DMB/DSB если кеша нет"?
|
|
|
|
|
Jul 13 2014, 05:08
|
Гуру
     
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493

|
Уточню, есть ли он в однокристаллках all-in-one, типа STM32F405 . Внешние памяти ,как ни крути, вешают на более серьезное, А9 и выше Цитата(jcxz @ Jul 13 2014, 08:55)  PPS: А интересно, уважаемый DASM, у вас не возникала мысль "зачем вообще нужны команды типа DMB/DSB если кеша нет"? Не возникло, наличие команды еще не означает наличие соответствующего железа. These ARM and 32-bit Thumb instructions are available in ARMv7 ( http://infocenter.arm.com/help/index.jsp?t...c/CIHGHHIE.html ), а про Кортексы М3 пишут, что у них вообще нет кеш-контроллера Хотя с другой стороны про M3 написано "The processor implements the ARMv7E-M architecture profile." Короче непонятно мне.
|
|
|
|
|
Jul 13 2014, 06:35
|

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

|
Цитата(jcxz @ Jul 13 2014, 09:04)  Вообще-то топик не про какой-то конкретный проц, а про M3/M4 вообще. И советы соответственно - касабельно всех M3/M4. В M3 и M4 кэша нет. Цитата из книги Ю: PLD Pre-load data. This is a hint instruction typically use for cache memory to accelerate data accesses. However, since there is no cache inside the Cortex-M3 and Cortex-M4 processors, this instruction behaves as NOP. Цитата(jcxz @ Jul 13 2014, 07:29)  Тогда сильно сомневаюсь, что заполнение массива uint_fast8_t в цикле будет быстрее, чем массива u8. Скорее - наоборот. Так как по размеру/кол-ву команд - одинаково, но кэш обратной записи предпочтёт u8. Да и на чтение - аналогично. Если просто заполнение, то байтами, сгруппированными по 4, заполнить будет почти в 4 раза быстрее, чем словами. Но если еще что-то делать с байтами, то вряд ли. Впрочем, для массивов важнее экономить память, чем скорость, так что и выбора-то в данном случае не может быть.
|
|
|
|
|
Jul 13 2014, 07:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Все поняли вопрос? Цитата Какую разрядность переменных, лучше выбирать в случае когда "а пофиг" ? Т.е. ограничений ни по размеру, ни по быстродействию нет, ибо "пофиг". Ограничения по быстродействию или по размеру тут не обсуждается. Насколько я понял, ТС просит "default type", когда выбор не очевиден и не играет роли. Осмелюсь предположить, что в данном случае самым сильным критерием будет переносимость (в рамках M3/M4). Очевидно, переносимость между компиляторами, средами, библиотеками и т.п.
|
|
|
|
|
Jul 13 2014, 08:42
|

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

|
Цитата(DASM @ Jul 13 2014, 11:15)  Не очень понимаю смысл кеша, расположенного на внешней памяти. А как же разгонять медленный флешь? Ведь вся соль применения CM3-4 именно в исполнении кода из FLASH на скорости не уступающей RAM. А без разного рода кешей этого бы не было. DSB я использую в реальных проектах (в обработчиках некоторых прерываний) и без этой инструкции программа была бы не так лаконична и вообще бы не работала (проверено). Цитата(adnega @ Jul 13 2014, 11:43)  Все поняли вопрос? Ну да. Я могу и в третий раз повторить ответ. Тут ведь вопрос стоит слишком глобально. Если говорить о аргументах функции, возвращаемых ей значениях, отдельных счётчиках или флагах, то наиболее переносимым вариантом является uint_fast8_t. В остальных случаях надо смотреть по задаче. Цитата(ViKo @ Jul 12 2014, 14:33)  Не единственный. Еще есть команды эксклюзивного доступа. LDREX и т.д. И соответствующие им интринсики для компилятора __LDREX(). И утрамбовать поля в слова можно так, чтобы не поганить одно поле при доступе к другому. Об этом я забыл. Да и по жизни не приходилось использовать.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jul 13 2014, 13:09
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(adnega @ Jul 13 2014, 03:43)  Все поняли вопрос?
Насколько я понял, ТС просит "default type", когда выбор не очевиден и не играет роли. Вот именно. В целом правильно uintXX_t, но где значения не имеет, int, надо полагать достаточен.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jul 13 2014, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(A. Fig Lee @ Jul 13 2014, 17:09)  int, надо полагать достаточен. Я везде (а это получатся только M3/M4/M0) int и пишу. Для остальных случаев пользуюсь "своими" BYTE, WORD и DWORD - соответственно 8, 16, 32 бита (без знака). Но это не правило, т.к. я программист-одиночка и работаю на себя. Что там компилятор наоптимизирует для меня на порядок менее важно, т.к. в критических случаях заставляю "молотить" периферию, а не софт.
|
|
|
|
|
Jul 13 2014, 18:37
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(A. Fig Lee @ Jul 13 2014, 21:42)  То бишь "пишу непереносимые приложения" ..  Это с какой стороны посмотреть... В своих проектах копипасту практикую чуть более чем полностью. Все при этом переносится. С хорошим чужим кодом не работал. Свой код тоже никому отдавать не собираюсь. И... ранее я предупреждал, что Цитата это не правило Может, не от хорошей жизни я не использую стандартные C-библиотеки (в т.ч. и stdint). Сейчас, вроде, нет никаких оснований их не использовать,но как-то... страшно. Все работает, а я тут трогать начну...
|
|
|
|
|
Jul 13 2014, 21:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(adnega @ Jul 13 2014, 09:43)  Все поняли вопрос?
Т.е. ограничений ни по размеру, ни по быстродействию нет, ибо "пофиг". Ограничения по быстродействию или по размеру тут не обсуждается. Насколько я понял, ТС просит "default type", когда выбор не очевиден и не играет роли. Осмелюсь предположить, что в данном случае самым сильным критерием будет переносимость (в рамках M3/M4). Очевидно, переносимость между компиляторами, средами, библиотеками и т.п. Нет, не совсем так. Я наверное не очень ясно выразился. Под "пофиг" - имелось ввиду две вещи: 1) переменная типа флага, или считающего до 10 счетчика. Ее можно разместить и в байте и в ворде и в инте. 2)что памяти в этих процах как правило, более чем достаточно, и экономить ее используя именно байт - смысла нет, если это не дает каких-то других преимуществ. А вот быстродействие как раз очень даже интересовало. В общем, я понял что за исключением каких-то специальных случаев, юнитов, структур и больших массивов - надо не морочить себе голову и использовать u32,s32,vu32,vs32. А тем более для локальных переменных.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|