jenya7 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба Раньше работал с AVR и все было понятно. Теперь перешел на ARM, и возникло пару вопросов 1.Если нужно создать несколько флагов как лучше сделать так bool flag1; bool flag2; ------------ bool flagN; или так struct { unsigned flag1: 1; unsigned flag2: 1; -------------------------- unsigned flagN: 1; } flags; 2.стоит ли создавать переменные uint8_t, uint16_t, или все создавать uint32_t и не играться. 3.и еще, чтоб не создавать еще одну тему, спрошу тут насколько надежны внутренние пулапы у STM32F10X? на AVR у меня все кнопки и концевики сидели на внутренних пулапах, только на I2C я ставил внешние пулапы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
let's see 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 (изменено) · Жалоба Отвечаю на первые два вопроса: универсального решения никогда нет. Например, по пункту 1 если необходимо проверить сразу несколько взаимосвязанных условий в одной функции/методк, то, по -моему, битовые поля использвать разумнее. А если речь идет о совершенно независимых условиях, да еще в разных фунциях/методах, то, естественно, объединять такие флаги в одну структуру не очень логично. По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! Кстати, то же правило относится к знаковым и беззнаковым переменным: необходимо отдавать себе отчет может ли переменная быть отрицательной или нет. А главный совет простой: думать надо всегда. Изменено 10 ноября, 2013 пользователем IgorKossak бездумное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! если я определяю переменную как uint8_t то 24 бита остаются неиспользуемые. хотя я читал что есть возможность уплотнения данных но это наверное досигается не бесплатно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба 1.Если нужно создать несколько флагов как лучше сделать так Если нет нужды экономить память (95% случаев), то нет смысла заморачиваться с битовыми полями. 2.стоит ли создавать переменные uint8_t, uint16_t, или все создавать uint32_t и не играться. Вообще если подходит int или unsigned int, то лучше такой тип и применять хотя бы потому, что int - всего 3 буквы. Типы с фиксированным размером имеют смысл там, где типичное их применение уменьшает число необходимых преобразований типа, ну и экономия памяти (массив из 100000 элементов uint8_t в 4 раза меньше, чем тот же массив из int). Ну и если хочется написать переносимый код (для разных sizeof(int)), то нужно более внимательно выбирать типы. Кстати, драйверы периферии непереносимы (привязаны к конкретному МК), так что там можно спокойно предполагать, что sizeof(int) == 4. 3.и еще, чтоб не создавать еще одну тему, спрошу тут насколько надежны внутренние пулапы у STM32F10X? на AVR у меня все кнопки и концевики сидели на внутренних пулапах, только на I2C я ставил внешние пулапы. Я делал кнопки с внутренними подтяжками STM32, проблем не было. Но это зависит от разводки и уровня помех, естественно: если протянуть такую цепь длинной дорожкой рядом с питанием индуктивной нагрузки, то могут быть неожиданности (собственно, как и с внешними подтяжками такой же силы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба Посмотрите схемотехнику плат DISCOVERY. Вам как новичку будет интересно. Еще есть документ Getting started with STM32F10xxx hardware development. Тоже полезно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба большое спасибо за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! А какой смысл её делать не uint32_t??? В некоторых случаях uint32_t ускоряет код и уменьшает размер... думать надо всегда. Вот и думайте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба я бы с битовыми полями не игрался, памяти сейчас в процах реально много, а как компилятор битовые поля делает одному ему известно. структуры можно уплотнять, но сильно зависит от типа ядра АРМа, есть некоторые проблемы с выравниванием данных, некоторые требуют четких границ 32 бита и в памяти и во флэшке, какие то разрешают в памяти не выравнивать, а во флэшке надо и так далее... то есть в этом пункте надо еще на ядро смотреть. я сейчас перехожу на писание кода в терминах uint8_t (с явным указанием битности) и так далее, потому что уже пару раз нарывался при переносе кода на непонятки с тем сколько бит int, тут как бы вопросов нет. А еще я один раз видел как использование 16 битных переменных замедляло работу по сравнению с 32 битными, потому что процессор (или компилятор) добавлял еще процедуру маскирования этих 16 бит из 32 битных слов, правда это не на АРМе было, но тут теоретически тоже возможно (упакованная структура с 16 битными полями, на ядре требующем 32 битное выравнивание, доступ к каждому полю будет через слов - маска - сдвиг), но я не настаиваю... внутренние резисторы АВР мне показались более кондовыми и крепкими нежели у АРМа с дискавери 4. Но объективного анализа нет, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 10 ноября, 2013 Опубликовано 10 ноября, 2013 · Жалоба 1) По какому критерию вы считаете лучше/хуже? 2)Если нужен конкретный размер (осознанное переполнение, структуры кадров протокола) - используем uintXX_t. Если же размер не критичен, лишь бы влезло, то для ускорения и уменьшения программы используем uint_fastXX_t. 3)Что вы понимаете под "надежностью" резисторов подтяжки? Производитель гарантирует, что их сопротивление будет находиться в определенном диапазоне. Если ваша схема будет работать во всем этом диапазоне - можете смело использовать внутренние. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба 1) По какому критерию вы считаете лучше/хуже? 2)Если нужен конкретный размер (осознанное переполнение, структуры кадров протокола) - используем uintXX_t. Если же размер не критичен, лишь бы влезло, то для ускорения и уменьшения программы используем uint_fastXX_t. 3)Что вы понимаете под "надежностью" резисторов подтяжки? Производитель гарантирует, что их сопротивление будет находиться в определенном диапазоне. Если ваша схема будет работать во всем этом диапазоне - можете смело использовать внутренние. я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше. насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше. Как быстрее - легко увидеть самому, скомпилировав различные варианты кода и заглянув в дизассемблер. Типы int и unsigned int придуманы как раз как "естественные" типы для данной архитектуры, то есть с ними должен получаться быстрый и компактный код. К сожалению, для 8-битников это не верно, поэтому придуманы int_fast8_t и подобные. насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался. Как уже сказал Сергей Борщ, сопротивление этого резистора прописано в даташите. То есть ваш вопрос сводится, условно, к следующему: "30 кОм подойдёт для подтяжки?". Ну извините, кроме вас никто на этот вопрос не ответит, потому что ответ зависит от особенностей схемы и условий эксплуатации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше. насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался. Если нужна скорость, то никаких битовых полей. Если ядро Cortex-M3, то используйте bit-band (и скорость и размер не страдают). Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает. Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.Видимо предполагалось, что 20-50К внутренней подтяжки это несколько больше, чем рекомендованные для I2C внешние 4.7К. И для кнопки на 20 см проводах ток подтяжки в 3.3в/50К = 66мкА маловат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 11 ноября, 2013 Опубликовано 11 ноября, 2013 · Жалоба Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было. А в моей было несколько раз. Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате. Или подключение отладчика сначала к ПК, а затем к процу. Вот с AVRками такое тоже было не раз, но без необратимых последствий)) Пугать не хочу, ибо пользуюсь STM32 серийно - полет нормальный. Но при переходе с AVR можно заметить некоторую "нежность". Если речь идет о пулапе и проводах к кнопке, делаю вывод, что будет сэкономлен один внешний резистор, а уж дополнительная защита тем более не будет установлена, то о "мистике" мы еще поговорим( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться