Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR EWARM 5.40; STR710
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Elf
Всем здравствовать,

При отладке (IAR EWBARM 5.40; STR710; оптимизация отключена) нарвался на непонятный момент. Привожу упрощенный пример:

{
u8 a, b, c, d;

a = 0x22;
b = ~a >>4;

c = ~a;
d = c >>4;
}

Получаю значения для b 0xFD, для d 0x0D.
Не догоняю - то ли я лажаю, то ли...?
HARMHARM
Цитата(Elf @ Dec 15 2009, 17:56) *
{
u8 a, b, c, d;

a = 0x22;
b = ~a >>4;

c = ~a;
d = c >>4;
}

Что за определение u8?
В примере с переменной b: ~a дает результат unsigned int 0xFFFFFFDD. А потом сдвиг и обкусывание до 8 бит.
В примере c переменными c и d приведение осуществляется каждый раз. Вот и всё.
ИМХО честно будет так: b = ( ~a & 0xFF ) >> 4;
Это по крайней мере однозначно.
Родной быстрый тип для ARM - int, который содержит 32 бита. Предположу, что портируете с восьмибитника? smile.gif
Elf
typedef unsigned char u8;

Переменные объявлены как unsigned char, не пойму почему дополнение берется как от int.
KRS
Цитата(Elf @ Dec 15 2009, 20:15) *
Переменные объявлены как unsigned char, не пойму почему дополнение берется как от int.

дело в том, что ~a над переменной u8 получает тип int
надо написать ((u8)~a)
Elf
Спасибо,
Начал понимать в чем дело.
KRS
Цитата(HARMHARM @ Dec 15 2009, 19:34) *
Родной быстрый тип для ARM - int, который содержит 32 бита. Предположу, что портируете с восьмибитника? smile.gif

На восьмибитнике такой же результат должен быть - или С компилер не стандартный wink.gif
Потому что в начале применяется integer promotion, и из u8 получается int ( причем signed).

Кстати работать с локальными переменными u8 - в ARM не оптимально, компилер будет постоянно добавлять опреации очистки старших бит. Для переменных которые могут быть в регистрах - параметры функций и локальные переменные лучше использовать 32 битные типы - например uint_fast8_t, но при этом помнить что они могут быть больше 8 бит.
Elf
Цитата(KRS @ Dec 16 2009, 00:38) *
Кстати работать с локальными переменными u8 - в ARM не оптимально


Совершенно с Вами согласен.
Это тот случай, когда данные считываются из внешнего байтного устройства через EMI (External Memory Interface) и после нескольких логических манипуляций компануются в 32-разрядные.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.