Выровненные и невыровненные доступы памяти?

Вы можете использовать что-то вроде этого:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW, 
    Uri.parse("http://maps.google.com/maps?saddr=20.344,34.34&daddr=20.5666,45.345"));
startActivity(intent);

Чтобы начать навигацию с текущего местоположения, удалите параметр и значение saddr.

Вы можете использовать фактический адрес улицы вместо широты и долготы. Однако это даст пользователю возможность выбора между открытием его через браузер или Google Maps.

Это приведет к запуску Google Maps в режиме навигации напрямую:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
    Uri.parse("google.navigation:q=an+address+city"));

ОБНОВЛЕНИЕ

В мае 2017 года Google запустил новый API для универсальной, кроссплатформенной URL-адреса Карт Google:

https://developers.google.com/maps/documentation/urls/guide

Также вы можете использовать Intents с новым API.

18
задан curiousguy 23 October 2017 в 13:21
поделиться

5 ответов

Выровненный доступ к памяти означает, что указатель (как целое число) является кратным значению, зависящему от типа, которое называется выравниванием. Выравнивание - это натуральный адрес, кратный, где тип должен быть или должен быть сохранен (например, по соображениям производительности) на ЦП. Например, ЦП может потребовать, чтобы все двухбайтовые загрузки или сохранения выполнялись через адреса, кратные двум. Для небольших примитивных типов (менее 4 байтов) выравнивание почти всегда соответствует размеру типа. Для структур выравнивание обычно является максимальным выравниванием любого члена.

Компилятор C всегда помещает объявленные вами переменные по адресам, удовлетворяющим «правильному» выравниванию. Поэтому, если ptr указывает, например, на переменную uint16_t, она будет выровнена, и вы можете использовать _amem2. Вам нужно использовать _mem2, только если вы обращаетесь, например, к упакованному массиву байтов, полученному через ввод-вывод, или байтам в середине строки.

17
ответ дан 30 November 2019 в 06:29
поделиться

Многие компьютерные архитектуры хранят память в «словах» из нескольких байтов каждый. Например, 32-битная архитектура Intel хранит слова длиной 32 бита, каждое из которых составляет 4 байта. Однако память обращается на однобайтовом уровне; поэтому адрес может быть «выровненным», то есть он начинается с границы слова, или «невыровненным», что означает, что это не так.

На некоторых архитектурах определенные операции с памятью могут быть медленнее или даже полностью не разрешены для невыровненных адресов.

Итак, если вы знаете, что ваши адреса выровнены по правильным адресам, вы можете использовать _amem2 () для увеличения скорости. В противном случае следует использовать _mem2 ().

17
ответ дан 30 November 2019 в 06:29
поделиться

Выровненные адреса - это адреса, кратные рассматриваемому размеру доступа.

  • Доступ к 4 байтовым словам по адресам, кратным 4, будет выровнен
  • Доступ к 4 байтам из адреса (скажем) 3 будет невыровненным доступом

Весьма вероятно, что _mem2 , которая будет работать также для невыровненных доступов, будет менее оптимальной для получения правильных выравниваний, работающих в ее коде. Это означает, что функция _mem2 , вероятно, будет дороже, чем ее версия _amem2 .

Итак, когда вам нужна производительность (особенно когда вы знаете, что задержка доступа велика), было бы разумно определить, когда вы можете использовать согласованный доступ. _amem2 существует именно для этой цели - чтобы дать вам производительность, когда вы знаете, что доступ выровнен.

Когда дело доходит до 2-байтового доступа, идентификация выровненных операций очень проста.
Если все адреса доступа для операции «четные» (то есть их младший бит равен нулю), у вас есть 2-байтовое выравнивание. Это можно легко проверить с помощью,

if (address & 1) // is true
    /* we have an odd address; not aligned */
else
    /* we have an even address; its aligned to 2-bytes */
4
ответ дан 30 November 2019 в 06:29
поделиться

Многие процессоры имеют ограничения выравнивания при доступе к памяти. Невыровненный доступ либо генерирует прерывание исключения (например, ARM), либо работает медленнее (например, x86).

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

_amem2 , вероятно, просто читает 16-битный ushort из указанного ptr.

Я не знаю конкретно TMS320C64x, но предполагаю, что для этого требуется 16-битное выравнивание для доступа к 16-битной памяти . Таким образом, вы можете использовать _mem2 всегда, но со снижением производительности, и _amem2 , когда вы можете гарантировать, что ptr является четным адресом.

3
ответ дан 30 November 2019 в 06:29
поделиться

_mem2 является более общим. Это будет работать, если ptr выровнен или нет. _amem2 более строгий: он требует, чтобы ptr был выровнен (хотя, по-видимому, немного более эффективен). Поэтому используйте _mem2, если вы не можете гарантировать, что ptr всегда выровнен.

3
ответ дан 30 November 2019 в 06:29
поделиться