реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Несколько вопросов у новичка
Jenya7
сообщение Nov 10 2013, 10:52
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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 я ставил внешние пулапы.
Go to the top of the page
 
+Quote Post
pitt
сообщение Nov 10 2013, 12:00
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



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

Сообщение отредактировал IgorKossak - Nov 10 2013, 14:42
Причина редактирования: бездумное цитирование


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 10 2013, 12:39
Сообщение #3


Профессионал
*****

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



Цитата(pitt @ Nov 10 2013, 17:00) *
По второму пункту есть определенные проблемы с выравниванием, если переменные объединены в структуру, а иначе проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?!

если я определяю переменную как uint8_t то 24 бита остаются неиспользуемые. хотя я читал что есть возможность уплотнения данных но это наверное досигается не бесплатно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 10 2013, 13:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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, проблем не было. Но это зависит от разводки и уровня помех, естественно: если протянуть такую цепь длинной дорожкой рядом с питанием индуктивной нагрузки, то могут быть неожиданности (собственно, как и с внешними подтяжками такой же силы).
Go to the top of the page
 
+Quote Post
smk
сообщение Nov 10 2013, 13:48
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 10 2013, 14:25
Сообщение #6


Профессионал
*****

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



большое спасибо за ответы.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Nov 10 2013, 21:27
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(pitt @ Nov 10 2013, 15:00) *
проще использовать здравый смысл: если переменная по условию не превыщает, например байт, то какой смысл делать её uint_32?!

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

Вот и думайте...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 10 2013, 21:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

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

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

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


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 10 2013, 23:27
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 11 2013, 06:25
Сообщение #10


Профессионал
*****

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



Цитата(Сергей Борщ @ Nov 11 2013, 04:27) *
1) По какому критерию вы считаете лучше/хуже?

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

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


я наверно должен был добавить,что меня интересует скорость а не размер программы. более правильный вопрос как быстрее а не как лучше.
насчет резисторов подтяжки меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 11 2013, 06:43
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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 кОм подойдёт для подтяжки?". Ну извините, кроме вас никто на этот вопрос не ответит, потому что ответ зависит от особенностей схемы и условий эксплуатации.
Go to the top of the page
 
+Quote Post
adnega
сообщение Nov 11 2013, 06:48
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

Если нужна скорость, то никаких битовых полей.
Если ядро Cortex-M3, то используйте bit-band (и скорость и размер не страдают).
Резисторы подтяжки это ничто по сравнению с "выгоранием ноги". На STM32 если что не так на выводе микросхемы, то с 99% вероятностью
будет КЗ по питанию проца. Хотя, сам проц будет работать... жутко греется, но работает.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 11 2013, 06:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 11 2013, 07:10
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Nov 11 2013, 09:25) *
меня как то пугали что внутренние плохо "держат", уж не знаю какой физический смысл в это вкладывался.
Видимо предполагалось, что 20-50К внутренней подтяжки это несколько больше, чем рекомендованные для I2C внешние 4.7К. И для кнопки на 20 см проводах ток подтяжки в 3.3в/50К = 66мкА маловат.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
adnega
сообщение Nov 11 2013, 07:45
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(scifi @ Nov 11 2013, 10:57) *
Это вы про тиристорное защёлкивание рассказываете? Не пугайте человека, особенно вот этими высосанными из пальца "99%" и мистическими "что-то не так". В моей практике ни разу такого не было.

А в моей было несколько раз.
Причина - аварийное отрывание провода под напряжением и попадание его в случайное место на плате.
Или подключение отладчика сначала к ПК, а затем к процу.
Вот с AVRками такое тоже было не раз, но без необратимых последствий))
Пугать не хочу, ибо пользуюсь STM32 серийно - полет нормальный. Но при переходе с AVR можно заметить некоторую "нежность".
Если речь идет о пулапе и проводах к кнопке, делаю вывод, что будет сэкономлен один внешний резистор, а уж дополнительная защита
тем более не будет установлена, то о "мистике" мы еще поговорим(
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016