Цитата(zltigo @ Jan 16 2009, 14:07)

Все верно, у меня практически такие-же вещи по полной программе, НО все это не делалось единовременно вдруг с 8 на 32. При переходе ровным счетом ни одной проблемы в работе, именно с выравниванием не вызвало. Все отсеялось в процессе портирования при работе с исходниками.
Да, понятно, что на любом проекте крупнее среднего будет практически то же самое. Но у нас некоторая разница в подходах - Вы пишете что "
все отсеялось" (ну так уж и все?), а я пишу - "
1% остался". И вчера мне мои прикладники показали часть от этого "1%".
Цитата(zltigo @ Jan 16 2009, 14:07)

Посторяю - 200K чего? Кода или сишных строк??? Вот прям сейчас сижу в начале обычного проекта: ARM 94 файла 40767 текстовых строк из них всего 21943 стороки с кодом. Бинарник 134504 байта. Процентов
Дело было давно (в районе 2000-го) - из любопытства написал простой скриптик подсчета текстовых строк на Perl и прогнал на каталоге с исходниками для одной платформы (AVR, кажись). Тогда вышло около 150К - всех текстовых строк - с хидерами, C- кодом, комментариями, но без документации, makefiles и всяких вспомогательных скриптов (то отдельно все лежит). Сейчас не считал, по минимуму полагаю 200K.
Эти все 200К написаны прикладниками - без платформозависимого и системного кода, который пишу я. ИМХО, по стилю там тяжеловато - с комментами напряг, и макросов засилье изрядное, так что текст - "плотненький", сколько строк именно с кодом - не скажу, но тоже не менее 50%.
Цитата(zltigo @ Jan 16 2009, 14:07)

несколько лет. Естественно есть и уже перевалившие за 300K бинарника. Говорите, что у Вас "200К строк С-шного кода" причем, как ранее говорили, для чего-либо врезультате влезающего в AVR128 и затем портированых?
Это где я говорил что
все 200К строк исходников
одновременно влезают в 128К? Я сказал, что в сумме есть 200К строк из которых получается сотня различных вариантов путем условной компиляции.
Цитата(zltigo @ Jan 16 2009, 14:07)

Процентов 15% пришло с 8bit. Еще 20% вообще сразу живут на всех платформах
В-о-о-о-т. А у нас 75-90% пришло с 8-битника и эти же 75-90% живут на всех 8/32-битных платформах. Из оставшихся 10-25% для 32-битников - 80% (ОС, стеки) тоже живут на всех 32-битных платформах. Итого - у меня "не живущая" и заново пишущаяся для платформы часть составляет 2-5% - против Ваших 65%. Отсюда и Ваш совет - "при портировании надо пересмотреть код". Когда пишешь заново - не вопрос - само собой так получается, а вот когда оно уже написано, отлажено и работает - хто ж в здравом уме туда полезет?
Цитата(zltigo @ Jan 16 2009, 14:07)

Так вот не верю.
Чему именно? Что бывают проекты где 75-90% процентов платформо-независимо и может жить на 8/16/32?
Цитата(defunct @ Jan 16 2009, 15:49)

Не, такое - не пойдет. Тормозить будет, т.к. будет LDRB вместо LDR.
Мы ж скорости хотим.

- если скорость не нужна можно везде все упаковать и будет ARM как восьмибитник работать.
У меня эту проблему в общем случае решить не удалось. Для TCP/IP у меня такая реализация:
Код
LW_INLINE_FORCED
DWORD
lw_ipload(
PLW_IP_ADDR ptr)
{
#if LW_ALIGNED_HDR
//
// Вариант перестановки для выравненного доступа
//
DWORD v, t1, t2;
v = *(PDWORD)ptr;
t1 = v ^ ((v << 16) | v >> 16); // t1 = 2143 ^ 4321
t2 = (v >> 8) | (v << 24); // t2 = 1432
t1 = t1 & 0xFF00FFFF; // t1 = 2043 ^ 4021
return t2 ^ (t1 >> 8); // 1432 ^ (0204 ^ 0402)
#else
//
// Вариант перестановки для невыравненного доступа
//
return (DWORD)((PBYTE)ptr)[3]
| ((DWORD)((PBYTE)ptr)[2] << 8)
| ((DWORD)((PBYTE)ptr)[1] << 16)
| ((DWORD)((PBYTE)ptr)[0] << 24);
#endif
}
Для PowerPC в bigendian это выглядит так:
Код
LW_INLINE_FORCED
DWORD
lw_ipload(
PLW_IP_ADDR ptr)
{
return *(PDWORD)ptr;
}
Если в проекте есть хоть один сетевой интерфейс для которого поле IP может быть невыравнено, то в кофигурации указан LW_ALIGNED_HDR нулевой. Но обычно есть только один ethernet, я стараюсь чтобы было выравнивание (гы, на SAM7X - получилось выровнять пакеты при приеме, на LPC - нет

) и работает выравненный вариант.
Пример работы с полем:
Код
{
DWORD ip;
ip = lw_ipload(&iphdr->ipsrc);
//
// Делаем с IP чего надо
//
{
Но тут как раз проблема ловли исключений не так остро стоит - этот код свой и писался изначально под разные платформы с разной endianess и alignment. Проблема острее стоит в портированном "старье".