|
32-bit или 16-bit? |
|
|
|
Jul 28 2016, 13:47
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(Сергей Борщ @ Jul 28 2016, 17:34)  Можете, если хотите получить большую медленную программу. В Стандарте языка с 99 года описан замечательный заголовочный файл stdint.h. Используйте объявленные в нем типы с умом и все у вас получится гораздо лучше. вопрос у меня был немного не в этом С бытродействием как-бы все понятно, конечно на 32-м будет быстрее.. Или Вы хотели сказать, что на 16-битном процессоре longint использовать неразумно?
Сообщение отредактировал shide_3 - Jul 28 2016, 14:01
|
|
|
|
|
Jul 28 2016, 14:02
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(toweroff @ Jul 28 2016, 17:52)  даже когда нужно использовать uint8_t, например? Честно, я не знаю что это за тип. Догадываюсь, что-то похожее на uchar
|
|
|
|
|
Jul 28 2016, 15:33
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(AlexandrY @ Jul 28 2016, 18:16)  А ARM гарантируется атомарный доступ к 32-х битным регистрам. Обязательно АРМ ? Или любой 32-битный (к примеру PIC)? А что значит обертывать в критические секции?
Сообщение отредактировал shide_3 - Jul 28 2016, 16:02
|
|
|
|
|
Jul 28 2016, 16:40
|

Гуру
     
Группа: Свой
Сообщений: 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-мя регистрами, а если вдруг прерывание и эти регистры там изменятся, а "пацаны-то не знают"?
|
|
|
|
|
Jul 28 2016, 19:59
|
Гуру
     
Группа: Свой
Сообщений: 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. Типы данных могут быть реализованы на любой разрядности. Программист должен выбирать корректный тип для хранения данных.
|
|
|
|
|
Jul 29 2016, 17:35
|
Местный
  
Группа: Участник
Сообщений: 314
Регистрация: 27-04-10
Пользователь №: 56 923

|
Цитата(adnega @ Jul 28 2016, 22:59)  Например, 32-битный Cortex-M0 не умеет работать с невыровненными данными и 32 битная переменная собирается из 4 последовательных чтений 8-битных порций. а что значит невыровненными данными? В чем тогда его 32-битность состоит?
|
|
|
|
|
Jul 30 2016, 07:49
|
Знающий
   
Группа: Свой
Сообщений: 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 возникнет исключение.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|