Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
вопрос по СИ (+)
Отправлено
net_net
07 апреля 2007 г. 00:15
обязательно ли переменная размером 4 байта должна быть расположена по границе 4 байтов?
вопрос в том смысле если указатель нечетный - то как это должно рассматриваться?
Составить ответ
|
Вернуться на конференцию
Ответы
Си ни при чём. Не прав компилятор. Он должен был или принять адрес буквально (если позволяет архитектура) или дать предупреждение или ошибку.
—
Юрий_СВ
(07.04.2007 02:04:11
91.124.222.207
,
пустое
)
нефига. Это инфа для линкера. А линкер думать не обязан
—
DASM
(07.04.2007 02:11:23
212.58.192.14
,
пустое
)
Не буду спорить: может и компоновщик (линкер) - но явно не прав. Он должен или оставить как есть или выдать предупреждение (или ошибку), но НЕ резать адреса "втихаря". А на счёт компилятор/компоновщик - в отличии от переменных и функций - это адресная константа - т.е. адрес известен ещё на этапе компиляции. Потому я и предположил, что недоволен бедет компилятор.
—
Юрий_СВ
(07.04.2007 02:47:56
91.124.222.207
,
пустое
)
собственно LINK тут совсем не причем. все дело в том что в ARM есть инструкции которые работают с4 байтами - но для них адрес (не зависимо от того какой он) всегда округляется до 4 байтов - собственно все происходит на этапе выполнения - но как вы справедливо подметили компилятор както должен был среагировать на это - потому как когда даешь PACKED он делает байто ориентированные команды - а когда нету packed то он ставит 4 байтную команду. и по моему мнению компилятор должен был среагировать на
—
net_net
(07.04.2007 10:20:11
91.76.48.163
,
пустое
)
явный нечетный адрес - и сделать либо байтно либо предупредить об этом
—
net_net
(07.04.2007 10:33:51
91.76.48.163
,
пустое
)
Язык Си не имеет аппаратной привязки и размер типов переменных в общем случае неизвестен. Выравнивание переменных в памяти ускоряет время обращения, но реализуется как чать оптимизации компилятора/линкера. Разработчику такие процессы опять же как правило неподконтрольны за искллючением #pragma pack(1)
—
groovy
(07.04.2007 01:34:19
89.109.44.208
,
пустое
)
А вот, помнится, в БК0010 при чтении слова памяти младший бит адреса аппаратно игнорировался. Тут ни компилятор, ни линкер ничего поделать не могли.
—
CD_Eater
(07.04.2007 03:24:4
89.179.240.72
,
пустое
)
это вопрос по архитектуре проца. Необязательно в любом случае, но желательно. Откуда ноги растут то?
—
DASM
(07.04.2007 00:34:56
212.58.192.14
,
пустое
)
от ARM KEIL -ь если читаешь unsigned long по нечетному адресу то он его округляет и естественно читает неправильно - если добавит __packed то работает нормально - вот и думаю это стандарт так определяет или как?
—
net_net
(07.04.2007 00:42:20
91.76.219.13
,
пустое
)
А вы вообще уверены что стандарт определяет __packed ? Мне кажется это расширение языка не предусмотрено ANSI
—
groovy
(07.04.2007 01:36:32
89.109.44.208
,
пустое
)
оставим стандарты докторам, он есть в Кейле - а что еще надо ?
—
DASM
(07.04.2007 01:43:22
212.58.192.14
,
пустое
)
Цитирую вопрос "вот и думаю это стандарт так определяет или как? "
—
groovy
(07.04.2007 01:49:13
89.109.44.208
,
пустое
)
в таком случае зачем я уже ответил - в стандарте С++ это не определено. Стандарта С у меня, но, полагаю, ситуация аналогична
—
DASM
(07.04.2007 01:51:4
212.58.192.14
,
пустое
)
вот пример
—
net_net
(07.04.2007 00:43:41
91.76.219.13
, 193 байт)
не, это прерогатива реализации. В данном случае packed - грамотно. Хотя мне и странны такие адреса sfr
—
DASM
(07.04.2007 00:46:23
212.58.192.14
,
пустое
)
да просто адреса в плис на скорую руку сделал нечетным для слова 4 байтном - и вот трахался пока не сообразил в чем дело
—
net_net
(07.04.2007 00:54:17
91.76.219.13
,
пустое
)
в старом добром pdp-11 сразу бы trap 10 выдало и все было бы ясно - а здесь все в тихаря делает вид что работает - но неправильно ;-(
—
net_net
(07.04.2007 01:03:21
91.76.219.13
,
пустое
)
Не 10 а 4.
—
SM
(07.04.2007 11:43:37
80.92.255.53
,
пустое
)
:) Такие вещи не забываются. Я вот уже на котором устройстве первым делом поднимаю аналог пультового терминала.
—
vmp
(07.04.2007 13:09:38
83.167.112.204
, 90 байт)
уже стал забывать ;-( 10 это таймаут по шине - а 4 неверная адресация - да вот вроде так - или опять память подводит? ;-(
—
net_net
(07.04.2007 15:04:41
91.76.48.163
,
пустое
)
10 это неверный код инструкции. А 4 - таймаут по шине, который и означает неверную адресацию.
—
SM
(07.04.2007 15:15:58
80.92.255.53
,
пустое
)
да уж - все позабывал ;-( только в принципе помню еще чтото - ну еще правда помню 177560 ;-) или опять напутал? ;-)
—
net_net
(07.04.2007 16:04:16
91.76.48.163
,
пустое
)
Был такой полезный адресок. А еще команда прикольная - 014747
—
SM
(07.04.2007 16:06:15
80.92.255.53
,
пустое
)
mov -(pc),-(pc) типа всю память прописать ? ;-)
—
net_net
(07.04.2007 16:42:25
91.76.48.163
,
пустое
)
по совместительству тест памяти ;-)
—
net_net
(07.04.2007 16:46:21
91.76.48.163
,
пустое
)
Эта команда называлась "матрас" по форме изображения, получаемого если её запустить в видеопамяти
—
CD_Eater
(07.04.2007 20:29:26
89.179.240.72
,
пустое
)
С возможностями жтагов это вряд-ли имеет какой-то смысл.
—
SM
(07.04.2007 13:55:50
80.92.255.53
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 69:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru