|
Несколько вопросов у новичка |
|
|
|
Nov 10 2013, 10:52
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Раньше работал с 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 я ставил внешние пулапы.
|
|
|
|
|
Nov 10 2013, 12:00
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Отвечаю на первые два вопроса: универсального решения никогда нет. Например, по пункту 1 если необходимо проверить сразу несколько взаимосвязанных условий в одной функции/методк, то, по -моему, битовые поля использвать разумнее. А если речь идет о совершенно независимых условиях, да еще в разных фунциях/методах, то, естественно, объединять такие флаги в одну структуру не очень логично. По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! Кстати, то же правило относится к знаковым и беззнаковым переменным: необходимо отдавать себе отчет может ли переменная быть отрицательной или нет. А главный совет простой: думать надо всегда.
Сообщение отредактировал IgorKossak - Nov 10 2013, 14:42
Причина редактирования: бездумное цитирование
--------------------
|
|
|
|
|
Nov 10 2013, 13:36
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Nov 10 2013, 14:52)  1.Если нужно создать несколько флагов как лучше сделать так Если нет нужды экономить память (95% случаев), то нет смысла заморачиваться с битовыми полями. Цитата(Jenya7 @ Nov 10 2013, 14:52)  2.стоит ли создавать переменные uint8_t, uint16_t, или все создавать uint32_t и не играться. Вообще если подходит int или unsigned int, то лучше такой тип и применять хотя бы потому, что int - всего 3 буквы. Типы с фиксированным размером имеют смысл там, где типичное их применение уменьшает число необходимых преобразований типа, ну и экономия памяти (массив из 100000 элементов uint8_t в 4 раза меньше, чем тот же массив из int). Ну и если хочется написать переносимый код (для разных sizeof(int)), то нужно более внимательно выбирать типы. Кстати, драйверы периферии непереносимы (привязаны к конкретному МК), так что там можно спокойно предполагать, что sizeof(int) == 4. Цитата(Jenya7 @ Nov 10 2013, 14:52)  3.и еще, чтоб не создавать еще одну тему, спрошу тут насколько надежны внутренние пулапы у STM32F10X? на AVR у меня все кнопки и концевики сидели на внутренних пулапах, только на I2C я ставил внешние пулапы. Я делал кнопки с внутренними подтяжками STM32, проблем не было. Но это зависит от разводки и уровня помех, естественно: если протянуть такую цепь длинной дорожкой рядом с питанием индуктивной нагрузки, то могут быть неожиданности (собственно, как и с внешними подтяжками такой же силы).
|
|
|
|
|
Nov 10 2013, 21:27
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(pitt @ Nov 10 2013, 15:00)  проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! А какой смысл её делать не uint32_t??? В некоторых случаях uint32_t ускоряет код и уменьшает размер... Цитата думать надо всегда. Вот и думайте...
|
|
|
|
|
Nov 10 2013, 21:31
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
я бы с битовыми полями не игрался, памяти сейчас в процах реально много, а как компилятор битовые поля делает одному ему известно.
структуры можно уплотнять, но сильно зависит от типа ядра АРМа, есть некоторые проблемы с выравниванием данных, некоторые требуют четких границ 32 бита и в памяти и во флэшке, какие то разрешают в памяти не выравнивать, а во флэшке надо и так далее... то есть в этом пункте надо еще на ядро смотреть.
я сейчас перехожу на писание кода в терминах uint8_t (с явным указанием битности) и так далее, потому что уже пару раз нарывался при переносе кода на непонятки с тем сколько бит int, тут как бы вопросов нет. А еще я один раз видел как использование 16 битных переменных замедляло работу по сравнению с 32 битными, потому что процессор (или компилятор) добавлял еще процедуру маскирования этих 16 бит из 32 битных слов, правда это не на АРМе было, но тут теоретически тоже возможно (упакованная структура с 16 битными полями, на ядре требующем 32 битное выравнивание, доступ к каждому полю будет через слов - маска - сдвиг), но я не настаиваю...
внутренние резисторы АВР мне показались более кондовыми и крепкими нежели у АРМа с дискавери 4. Но объективного анализа нет,
|
|
|
|
|
Nov 11 2013, 06:43
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Nov 11 2013, 10:25)  я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше. Как быстрее - легко увидеть самому, скомпилировав различные варианты кода и заглянув в дизассемблер. Типы int и unsigned int придуманы как раз как "естественные" типы для данной архитектуры, то есть с ними должен получаться быстрый и компактный код. К сожалению, для 8-битников это не верно, поэтому придуманы int_fast8_t и подобные. Цитата(Jenya7 @ Nov 11 2013, 10:25)  насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался. Как уже сказал Сергей Борщ, сопротивление этого резистора прописано в даташите. То есть ваш вопрос сводится, условно, к следующему: "30 кОм подойдёт для подтяжки?". Ну извините, кроме вас никто на этот вопрос не ответит, потому что ответ зависит от особенностей схемы и условий эксплуатации.
|
|
|
|
|
Nov 11 2013, 06:48
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Nov 11 2013, 10:25)  я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше. насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался. Если нужна скорость, то никаких битовых полей. Если ядро Cortex-M3, то используйте bit-band (и скорость и размер не страдают). Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает.
|
|
|
|
|
Nov 11 2013, 07:45
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(scifi @ Nov 11 2013, 10:57)  Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было. А в моей было несколько раз. Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате. Или подключение отладчика сначала к ПК, а затем к процу. Вот с AVRками такое тоже было не раз, но без необратимых последствий)) Пугать не хочу, ибо пользуюсь STM32 серийно - полет нормальный. Но при переходе с AVR можно заметить некоторую "нежность". Если речь идет о пулапе и проводах к кнопке, делаю вывод, что будет сэкономлен один внешний резистор, а уж дополнительная защита тем более не будет установлена, то о "мистике" мы еще поговорим(
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|