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

Несколько вопросов у новичка

Раньше работал с 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 я ставил внешние пулапы.

 

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


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

Отвечаю на первые два вопроса: универсального решения никогда нет. Например, по пункту 1 если необходимо проверить сразу несколько взаимосвязанных условий в одной функции/методк, то, по -моему, битовые поля использвать разумнее. А если речь идет о совершенно независимых условиях, да еще в разных фунциях/методах, то, естественно, объединять такие флаги в одну структуру не очень логично.

По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! Кстати, то же правило относится к знаковым и беззнаковым переменным: необходимо отдавать себе отчет может ли переменная быть отрицательной или нет.

А главный совет простой: думать надо всегда.

Изменено пользователем IgorKossak
бездумное цитирование

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


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

По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?!

если я определяю переменную как uint8_t то 24 бита остаются неиспользуемые. хотя я читал что есть возможность уплотнения данных но это наверное досигается не бесплатно.

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


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

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, проблем не было. Но это зависит от разводки и уровня помех, естественно: если протянуть такую цепь длинной дорожкой рядом с питанием индуктивной нагрузки, то могут быть неожиданности (собственно, как и с внешними подтяжками такой же силы).

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


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

Посмотрите схемотехнику плат DISCOVERY. Вам как новичку будет интересно. Еще есть документ Getting started with STM32F10xxx hardware development. Тоже полезно.

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


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

проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?!

А какой смысл её делать не uint32_t??? В некоторых случаях uint32_t ускоряет код и уменьшает размер...

думать надо всегда.

Вот и думайте...

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


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

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

 

структуры можно уплотнять, но сильно зависит от типа ядра АРМа, есть некоторые проблемы с выравниванием данных, некоторые требуют четких границ 32 бита и в памяти и во флэшке, какие то разрешают в памяти не выравнивать, а во флэшке надо и так далее... то есть в этом пункте надо еще на ядро смотреть.

 

я сейчас перехожу на писание кода в терминах

uint8_t (с явным указанием битности) и так далее, потому что уже пару раз нарывался при переносе кода на непонятки с тем сколько бит int, тут как бы вопросов нет.

 

А еще я один раз видел как использование 16 битных переменных замедляло работу по сравнению с 32 битными, потому что процессор (или компилятор) добавлял еще процедуру маскирования этих 16 бит из 32 битных слов, правда это не на АРМе было, но тут теоретически тоже возможно (упакованная структура с 16 битными полями, на ядре требующем 32 битное выравнивание, доступ к каждому полю будет через слов - маска - сдвиг), но я не настаиваю...

 

внутренние резисторы АВР мне показались более кондовыми и крепкими нежели у АРМа с дискавери 4. Но объективного анализа нет,

 

 

 

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


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

1) По какому критерию вы считаете лучше/хуже?

 

2)Если нужен конкретный размер (осознанное переполнение, структуры кадров протокола) - используем uintXX_t. Если же размер не критичен, лишь бы влезло, то для ускорения и уменьшения программы используем uint_fastXX_t.

 

3)Что вы понимаете под "надежностью" резисторов подтяжки? Производитель гарантирует, что их сопротивление будет находиться в определенном диапазоне. Если ваша схема будет работать во всем этом диапазоне - можете смело использовать внутренние.

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


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

1) По какому критерию вы считаете лучше/хуже?

 

2)Если нужен конкретный размер (осознанное переполнение, структуры кадров протокола) - используем uintXX_t. Если же размер не критичен, лишь бы влезло, то для ускорения и уменьшения программы используем uint_fastXX_t.

 

3)Что вы понимаете под "надежностью" резисторов подтяжки? Производитель гарантирует, что их сопротивление будет находиться в определенном диапазоне. Если ваша схема будет работать во всем этом диапазоне - можете смело использовать внутренние.

 

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

насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.

 

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


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

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

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

Типы int и unsigned int придуманы как раз как "естественные" типы для данной архитектуры, то есть с ними должен получаться быстрый и компактный код. К сожалению, для 8-битников это не верно, поэтому придуманы int_fast8_t и подобные.

 

насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.

Как уже сказал Сергей Борщ, сопротивление этого резистора прописано в даташите. То есть ваш вопрос сводится, условно, к следующему: "30 кОм подойдёт для подтяжки?". Ну извините, кроме вас никто на этот вопрос не ответит, потому что ответ зависит от особенностей схемы и условий эксплуатации.

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


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

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

насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.

Если нужна скорость, то никаких битовых полей.

Если ядро Cortex-M3, то используйте bit-band (и скорость и размер не страдают).

Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью

будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает.

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


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

Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает.

Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было.

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


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

меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.
Видимо предполагалось, что 20-50К внутренней подтяжки это несколько больше, чем рекомендованные для I2C внешние 4.7К. И для кнопки на 20 см проводах ток подтяжки в 3.3в/50К = 66мкА маловат.

 

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


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

Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было.

А в моей было несколько раз.

Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате.

Или подключение отладчика сначала к ПК, а затем к процу.

Вот с AVRками такое тоже было не раз, но без необратимых последствий))

Пугать не хочу, ибо пользуюсь STM32 серийно - полет нормальный. Но при переходе с AVR можно заметить некоторую "нежность".

Если речь идет о пулапе и проводах к кнопке, делаю вывод, что будет сэкономлен один внешний резистор, а уж дополнительная защита

тем более не будет установлена, то о "мистике" мы еще поговорим(

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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