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

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

спасибо!

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


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

Ведь на самом деле, я могу использовать тип long int во всех случаях?
Можете, если хотите получить большую медленную программу. В Стандарте языка с 99 года описан замечательный заголовочный файл stdint.h. Используйте объявленные в нем типы с умом и все у вас получится гораздо лучше.

 

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


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

Можете, если хотите получить большую медленную программу. В Стандарте языка с 99 года описан замечательный заголовочный файл stdint.h. Используйте объявленные в нем типы с умом и все у вас получится гораздо лучше.

вопрос у меня был немного не в этом

С бытродействием как-бы все понятно, конечно на 32-м будет быстрее..

Или Вы хотели сказать, что на 16-битном процессоре longint использовать неразумно?

Изменено пользователем shide_3

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


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

я могу использовать тип long int во всех случаях?

даже когда нужно использовать uint8_t, например?

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


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

даже когда нужно использовать uint8_t, например?

Честно, я не знаю что это за тип. Догадываюсь, что-то похожее на uchar

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


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

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

спасибо!

 

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

Это значит операции с ними не надо обертывать в критические секции.

 

Поэтому программу использующую RTOS с 32-х битника на 8-и битник перевести будет принципиально трудно.

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


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

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

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

 

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

Изменено пользователем shide_3

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


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

Честно, я не знаю что это за тип. Догадываюсь, что-то похожее на uchar

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

 

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

это значит, что обработка 32-разрядного регистра происходит атомарно, за 1 команду. В 8-битниках это разворачивается в целый набор команд с 4-мя регистрами, а если вдруг прерывание и эти регистры там изменятся, а "пацаны-то не знают"?

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


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

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

 

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

 

Т.е. если A=65535 результат от A+=1; или A<<=1; будет разный при u16 и u32.

 

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


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

Топикстартеру - в чем вопрос, не понимаю. Понятно, регистры МК имеют определенную разрядность, ее и нужно использовать в своих программах. Еще есть вопросы?

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


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

есть ли принципиальная разница в написании программ на языке Си к МК 8-битному и скажем, к 16 или 32 битному?

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

 

что обработка 32-разрядного регистра происходит атомарно, за 1 команду.

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

Например, 32-битный Cortex-M0 не умеет работать с невыровненными данными и 32 битная переменная собирается

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

 

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

Но опять же - не принципиально.

 

Т.е. если A=65535 результат от A+=1; или A<<=1; будет разный при u16 и u32.

Типы данных могут быть реализованы на любой разрядности.

Программист должен выбирать корректный тип для хранения данных.

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


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

"тип индейцев".

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

 

 

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


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

Например, 32-битный Cortex-M0 не умеет работать с невыровненными данными и 32 битная переменная собирается

из 4 последовательных чтений 8-битных порций.

а что значит невыровненными данными? В чем тогда его 32-битность состоит?

 

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


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

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

Естественно, в разрядности регистров и АЛУ.

Про выровненность - это при работе памятью.

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


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

а что значит невыровненными данными?

 

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

 

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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