реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> IAR EWARM 5.40; STR710, Help
Elf
сообщение Dec 15 2009, 15:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 23-08-06
Пользователь №: 19 771



Всем здравствовать,

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

{
u8 a, b, c, d;

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

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

Получаю значения для b 0xFD, для d 0x0D.
Не догоняю - то ли я лажаю, то ли...?
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Dec 15 2009, 16:34
Сообщение #2


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(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
Go to the top of the page
 
+Quote Post
Elf
сообщение Dec 15 2009, 17:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 23-08-06
Пользователь №: 19 771



typedef unsigned char u8;

Переменные объявлены как unsigned char, не пойму почему дополнение берется как от int.
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 15 2009, 19:39
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

дело в том, что ~a над переменной u8 получает тип int
надо написать ((u8)~a)
Go to the top of the page
 
+Quote Post
Elf
сообщение Dec 15 2009, 20:25
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 23-08-06
Пользователь №: 19 771



Спасибо,
Начал понимать в чем дело.
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 15 2009, 21:38
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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 бит.
Go to the top of the page
 
+Quote Post
Elf
сообщение Dec 16 2009, 15:07
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 23-08-06
Пользователь №: 19 771



Цитата(KRS @ Dec 16 2009, 00:38) *
Кстати работать с локальными переменными u8 - в ARM не оптимально


Совершенно с Вами согласен.
Это тот случай, когда данные считываются из внешнего байтного устройства через EMI (External Memory Interface) и после нескольких логических манипуляций компануются в 32-разрядные.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016