Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Несколько вопросов у новичка
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Jenya7
Раньше работал с 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 я ставил внешние пулапы.
pitt
Отвечаю на первые два вопроса: универсального решения никогда нет. Например, по пункту 1 если необходимо проверить сразу несколько взаимосвязанных условий в одной функции/методк, то, по -моему, битовые поля использвать разумнее. А если речь идет о совершенно независимых условиях, да еще в разных фунциях/методах, то, естественно, объединять такие флаги в одну структуру не очень логично.
По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?! Кстати, то же правило относится к знаковым и беззнаковым переменным: необходимо отдавать себе отчет может ли переменная быть отрицательной или нет.
А главный совет простой: думать надо всегда.
Jenya7
Цитата(pitt @ Nov 10 2013, 17:00) *
По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?!

если я определяю переменную как uint8_t то 24 бита остаются неиспользуемые. хотя я читал что есть возможность уплотнения данных но это наверное досигается не бесплатно.
scifi
Цитата(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, проблем не было. Но это зависит от разводки и уровня помех, естественно: если протянуть такую цепь длинной дорожкой рядом с питанием индуктивной нагрузки, то могут быть неожиданности (собственно, как и с внешними подтяжками такой же силы).
smk
Посмотрите схемотехнику плат DISCOVERY. Вам как новичку будет интересно. Еще есть документ Getting started with STM32F10xxx hardware development. Тоже полезно.
Jenya7
большое спасибо за ответы.
HHIMERA
Цитата(pitt @ Nov 10 2013, 15:00) *
проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?!

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

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

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

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

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

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


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

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

3)Что вы понимаете под "надежностью" резисторов подтяжки? Производитель гарантирует, что их сопротивление будет находиться в определенном диапазоне. Если ваша схема будет работать во всем этом диапазоне - можете смело использовать внутренние.
Jenya7
Цитата(Сергей Борщ @ Nov 11 2013, 04:27) *
1) По какому критерию вы считаете лучше/хуже?

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

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


я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше.
насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.
scifi
Цитата(Jenya7 @ Nov 11 2013, 10:25) *
я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше.

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

Цитата(Jenya7 @ Nov 11 2013, 10:25) *
насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.

Как уже сказал Сергей Борщ, сопротивление этого резистора прописано в даташите. То есть ваш вопрос сводится, условно, к следующему: "30 кОм подойдёт для подтяжки?". Ну извините, кроме вас никто на этот вопрос не ответит, потому что ответ зависит от особенностей схемы и условий эксплуатации.
adnega
Цитата(Jenya7 @ Nov 11 2013, 10:25) *
я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше.
насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.

Если нужна скорость, то никаких битовых полей.
Если ядро Cortex-M3, то используйте bit-band (и скорость и размер не страдают).
Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью
будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает.
scifi
Цитата(adnega @ Nov 11 2013, 10:48) *
Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает.

Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было.
Сергей Борщ
QUOTE (Jenya7 @ Nov 11 2013, 09:25) *
меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.
Видимо предполагалось, что 20-50К внутренней подтяжки это несколько больше, чем рекомендованные для I2C внешние 4.7К. И для кнопки на 20 см проводах ток подтяжки в 3.3в/50К = 66мкА маловат.
adnega
Цитата(scifi @ Nov 11 2013, 10:57) *
Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было.

А в моей было несколько раз.
Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате.
Или подключение отладчика сначала к ПК, а затем к процу.
Вот с AVRками такое тоже было не раз, но без необратимых последствий))
Пугать не хочу, ибо пользуюсь STM32 серийно - полет нормальный. Но при переходе с AVR можно заметить некоторую "нежность".
Если речь идет о пулапе и проводах к кнопке, делаю вывод, что будет сэкономлен один внешний резистор, а уж дополнительная защита
тем более не будет установлена, то о "мистике" мы еще поговорим(
HHIMERA
Цитата(adnega @ Nov 11 2013, 11:45) *
А в моей было несколько раз.
Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате.
Или подключение отладчика сначала к ПК, а затем к процу.
Вот с AVRками такое тоже было не раз, но без необратимых последствий))

Угу!!! Вот хотелось бы поверить в написанное, но правда жизни кричит "Не может быть!"(С)...
АВРки ещё слабее на лапы, быстрее всего вам просто повезло...
A.Lex
Цитата(adnega @ Nov 11 2013, 09:45) *
А в моей было несколько раз.
Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате.
Или подключение отладчика сначала к ПК, а затем к процу.
Вот с AVRками такое тоже было не раз, но без необратимых последствий))
Пугать не хочу, ибо пользуюсь STM32 серийно - полет нормальный. Но при переходе с AVR можно заметить некоторую "нежность".
Если речь идет о пулапе и проводах к кнопке, делаю вывод, что будет сэкономлен один внешний резистор, а уж дополнительная защита
тем более не будет установлена, то о "мистике" мы еще поговорим(


Согласен с предыдущим оратором sm.gif


Давно принял за правило защищать цепи, идущие от "ног" контроллера за пределы платы. Резистор 30-100 Ом и BAV99 спасают контроллер от непредвиденных перегрузок по току.




Jenya7
в серьезных приборах (скажем серво драйверы) принято оптически развязывать входы/выходы.
и все таки, переменная меньше 32-бит как ляжет? как компайлер "разрулит" ее?
что и вправду будет маскировать при работе с ней?
Сергей Борщ
QUOTE (Jenya7 @ Nov 11 2013, 13:37) *
и все таки, переменная меньше 32-бит как ляжет?
Выровненная на свой размер.
QUOTE (Jenya7 @ Nov 11 2013, 13:37) *
как компайлер "разрулит" ее?
Уточните вопрос.
QUOTE (Jenya7 @ Nov 11 2013, 13:37) *
что и вправду будет маскировать при работе с ней?
Неужели сложно проверить? Вы же понимаете, что это может зависить и от компилятора, и от его настроек, и от контекста.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.