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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 32-bit или 16-bit?
shide_3
сообщение Jul 28 2016, 13:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Здравствуйте.Подскажите пожал-ста, есть ли принципиальная разница в написании программ на языке Си к МК 8-битному и скажем, к 16 или 32 битному? (То, что регистры общего назначения у них разной длины, это понятно.) Ведь на самом деле, я могу использовать тип long int во всех случаях?
спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 28 2016, 13:34
Сообщение #2


Гуру
******

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



QUOTE (shide_3 @ Jul 28 2016, 16:21) *
Ведь на самом деле, я могу использовать тип long int во всех случаях?
Можете, если хотите получить большую медленную программу. В Стандарте языка с 99 года описан замечательный заголовочный файл stdint.h. Используйте объявленные в нем типы с умом и все у вас получится гораздо лучше.


--------------------
На любой вопрос даю любой ответ
"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
shide_3
сообщение Jul 28 2016, 13:47
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Цитата(Сергей Борщ @ Jul 28 2016, 17:34) *
Можете, если хотите получить большую медленную программу. В Стандарте языка с 99 года описан замечательный заголовочный файл stdint.h. Используйте объявленные в нем типы с умом и все у вас получится гораздо лучше.

вопрос у меня был немного не в этом
С бытродействием как-бы все понятно, конечно на 32-м будет быстрее..
Или Вы хотели сказать, что на 16-битном процессоре longint использовать неразумно?

Сообщение отредактировал shide_3 - Jul 28 2016, 14:01
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 28 2016, 13:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(shide_3 @ Jul 28 2016, 16:21) *
я могу использовать тип long int во всех случаях?

даже когда нужно использовать uint8_t, например?
Go to the top of the page
 
+Quote Post
shide_3
сообщение Jul 28 2016, 14:02
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Цитата(toweroff @ Jul 28 2016, 17:52) *
даже когда нужно использовать uint8_t, например?

Честно, я не знаю что это за тип. Догадываюсь, что-то похожее на uchar
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 28 2016, 14:16
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(shide_3 @ Jul 28 2016, 16:21) *
Здравствуйте.Подскажите пожал-ста, есть ли принципиальная разница в написании программ на языке Си к МК 8-битному и скажем, к 16 или 32 битному? (То, что регистры общего назначения у них разной длины, это понятно.) Ведь на самом деле, я могу использовать тип long int во всех случаях?
спасибо!


А ARM гарантируется атомарный доступ к 32-х битным регистрам.
Это значит операции с ними не надо обертывать в критические секции.

Поэтому программу использующую RTOS с 32-х битника на 8-и битник перевести будет принципиально трудно.
Go to the top of the page
 
+Quote Post
shide_3
сообщение Jul 28 2016, 15:33
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Цитата(AlexandrY @ Jul 28 2016, 18:16) *
А ARM гарантируется атомарный доступ к 32-х битным регистрам.

Обязательно АРМ ? Или любой 32-битный (к примеру PIC)?

А что значит обертывать в критические секции?

Сообщение отредактировал shide_3 - Jul 28 2016, 16:02
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 28 2016, 16:40
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(shide_3 @ Jul 28 2016, 17:02) *
Честно, я не знаю что это за тип. Догадываюсь, что-то похожее на uchar

если char 8-битный - да

Цитата(shide_3 @ Jul 28 2016, 18:33) *
А что значит обертывать в критические секции?

это значит, что обработка 32-разрядного регистра происходит атомарно, за 1 команду. В 8-битниках это разворачивается в целый набор команд с 4-мя регистрами, а если вдруг прерывание и эти регистры там изменятся, а "пацаны-то не знают"?
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Jul 28 2016, 16:55
Сообщение #9


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

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(shide_3 @ Jul 28 2016, 16:21) *
Здравствуйте.Подскажите пожал-ста, есть ли принципиальная разница в написании программ на языке Си к МК 8-битному и скажем, к 16 или 32 битному? (То, что регистры общего назначения у них разной длины, это понятно.) Ведь на самом деле, я могу использовать тип long int во всех случаях?


Если вы не используете ограничение разрядов как фичу - то да.

Т.е. если A=65535 результат от A+=1; или A<<=1; будет разный при u16 и u32.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 28 2016, 19:16
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Топикстартеру - в чем вопрос, не понимаю. Понятно, регистры МК имеют определенную разрядность, ее и нужно использовать в своих программах. Еще есть вопросы?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 28 2016, 19:59
Сообщение #11


Гуру
******

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



Цитата(shide_3 @ Jul 28 2016, 16:21) *
есть ли принципиальная разница в написании программ на языке Си к МК 8-битному и скажем, к 16 или 32 битному?

Нет. Разрядность будет носить только оптимизационные особенности.

Цитата(toweroff @ Jul 28 2016, 19:40) *
что обработка 32-разрядного регистра происходит атомарно, за 1 команду.

Ну, часто переменные сидят в ОЗУ. Для архитектур 16 и 32 бит имеет смысл понятие "выравнивание" и "тип индейцев".
Например, 32-битный Cortex-M0 не умеет работать с невыровненными данными и 32 битная переменная собирается
из 4 последовательных чтений 8-битных порций. Правда, при чем тут атомарность не совсем понятно.

"Индейцы" могут сильно помочь или помешать при реализации внешних протоколов.
Но опять же - не принципиально.

Цитата(_4afc_ @ Jul 28 2016, 19:55) *
Т.е. если A=65535 результат от A+=1; или A<<=1; будет разный при u16 и u32.

Типы данных могут быть реализованы на любой разрядности.
Программист должен выбирать корректный тип для хранения данных.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 29 2016, 06:14
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (adnega @ Jul 28 2016, 22:59) *
"тип индейцев".

Индейц это indian, а не endian. Endian на самом деле много более прикольно, чем indian sm.gif



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
shide_3
сообщение Jul 29 2016, 17:35
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923



Цитата(adnega @ Jul 28 2016, 22:59) *
Например, 32-битный Cortex-M0 не умеет работать с невыровненными данными и 32 битная переменная собирается
из 4 последовательных чтений 8-битных порций.

а что значит невыровненными данными? В чем тогда его 32-битность состоит?
Go to the top of the page
 
+Quote Post
Alex11
сообщение Jul 29 2016, 20:23
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Цитата
В чем тогда его 32-битность состоит?

Естественно, в разрядности регистров и АЛУ.
Про выровненность - это при работе памятью.
Go to the top of the page
 
+Quote Post
SII
сообщение Jul 30 2016, 07:49
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(shide_3 @ Jul 29 2016, 20:35) *
а что значит невыровненными данными?


Это когда адрес данных в памяти кратен их размеру. Например, если данные имеют размер 1 байт, адрес может быть произвольным (поскольку память адресуется всегда побайтно), если данные имеют размер 2 байта, адрес должен быть кратен 2 (т.е. иметь 0 в младшем разряде), если данные имеют размер 4 байта, адрес должен быть кратен 4 (иметь два младших нуля).

Ядра Cortex-M3 и более старшие умеют работать с невыровненными данными. Например, если будет выдана команда чтения слова (т.е. 4 байт сразу) по адресу 0x00000004 (выровненный доступ), это слово будет прочитано за одно обращение к памяти -- сразу все байты с адресами 4-7. Однако если читается слово по адресу 0x00000002 (невыровненный доступ), физически будут выполнены две операции чтения по два байта -- по адресам 0x00000002-3 и 0x00000004-5, однако процессор сам разобьёт доступ на два, а затем объединит считанные байты в полное слово, поэтому программист ничего не заметит (за исключением падения производительности, поскольку потребуется два обращения к памяти вместо одного, что как минимум на один такт медленнее). Однако ядро Cortex-M0 не способно выполнять невыровненные доступы, поэтому при попытке считать слово по адресу 0x00000002 возникнет исключение.
Go to the top of the page
 
+Quote Post

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

 


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


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