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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Непонятное значение, PPC405 (XPS 9.2)
tolik1
сообщение Jul 24 2009, 08:33
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 2-03-05
Из: МОСКВА
Пользователь №: 3 016



Есть функция:
//====================================================
void LoadLastByte(Xuint8 Data)
{
Xuint32 d=0xFFFFFD00 + Data;
xil_printf("LoadLastByte - %x; Data - %x\r\n",d,Data);
GENERAL_SIMPLE_IO_32_mWriteSlaveReg3(XPAR_CTRLTEMAC_BASEADDR,0,d);
}
//====================================================

Есть вызов этой функции:
//====================================================
Xuint8 i;

LoadLastByte(i);
Переменная не инициализирована...
Результат следующий:

LoadLastByte - FFFF2444; Data - FFFF2744

Вопрос: Если переменная Xuint8 Data - один байт, то почеу значение - FFFF2744?
заранее спасибо.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 08:41
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Переменная не инициализирована...


Проинициализируйте и не занимайтесь буйней, простите за грубость, иначе Вас могут поджидать еще и не такие перлы. Если же Вас интересует точное поведение компилятора в этом случае, то курите асмовский листинг.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2009, 09:40
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Сдаётся мне, надо написать
xil_printf("LoadLastByte - %x; Data - %x\r\n",d,(int)Data);


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 09:44
Сообщение #4


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Сдаётся мне, надо написать


Это компилятор сам приведет. А вот что творится из-за отсутствия инициализации переменной - это никому не известно.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2009, 10:02
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Rst7 @ Jul 24 2009, 15:44) *
Это компилятор сам приведет. А вот что творится из-за отсутствия инициализации переменной - это никому не известно.


Для printf - нет. Ну и всяко в байт, пусть даже трижды неинициализированный, FFFF2744 не влезетsmile.gif

---
Поправка. Надо писать (Xuint32)Data. Потому что %x.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 10:05
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Для printf - нет.


Во-первых, будет приведен к int'у. Курите передачу параметров в функции с (...) в параметрах.

Цитата
Ну и всяко в байт, пусть даже трижды неинициализированный, FFFF2744 не влезет


Вы на тему посмотрели? Там тип проца указан. Регистры там 32хбитные. А вот в какой момент избавляться от мусора (т.е. вставлять расширение знака или просто and) - это уже компилятор сам решать должен. И в данном контексте смысла компилятору вставлять какое-либо приведение нету.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2009, 10:15
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Rst7 @ Jul 24 2009, 16:05) *
И в данном контексте смысла компилятору вставлять какое-либо приведение нету.


Вы хотите сказать, что при вызове LoadLastByte(Xuint8 Data) компилятор имеет право передавать в старших байтах аргумента всякий мусор?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 10:32
Сообщение #8


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Вы хотите сказать, что при вызове LoadLastByte(Xuint8 Data) компилятор имеет право передавать в старших байтах аргумента всякий мусор?


Неа. Он передает там нолики (т.к. это unsigned). Но, т.к. переменная неинициализированна, то он имеет полное право забить болт на этот and. Например, считая, что в регистр уже загруженно правильное значение, не превышающее 256 (если бы перед этим была загрузка непосредственного значения или LBZ из озу).


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
alx2
сообщение Jul 24 2009, 10:41
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(tolik1 @ Jul 24 2009, 13:33) *
Xuint32 d=0xFFFFFD00 + Data;
xil_printf("LoadLastByte - %x; Data - %x\r\n",d,Data);

Вопрос: Если переменная Xuint8 Data - один байт, то почеу значение - FFFF2744?
Как определен тип Xuint32? Очень похоже на несоответствие типа, требуемого строкой формата, реальному типу переменной d.

Сообщение отредактировал alx2 - Jul 24 2009, 10:46


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2009, 11:16
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Rst7 @ Jul 24 2009, 16:32) *
Неа. Он передает там нолики (т.к. это unsigned). Но, т.к. переменная неинициализированна, то он имеет полное право забить болт на этот and. Например, считая, что в регистр уже загруженно правильное значение, не превышающее 256 (если бы перед этим была загрузка непосредственного значения или LBZ из озу).


При компиляции функции неизвестно, инициализированное будет передано значение или нет. Поэтому, по крайней мере при

Xuint32 d=0xFFFFFD00 + Data;

компилятор должен провести расширение Data до Xuint32. Я так думаю.

А то, что вы пишете, очень напоминает работу IAR с bool из вот этой ветки. За единственным исключением - там программист применил хитрый финт ушами, чтобы добиться подобного.

Поэтому я всё же версию с неправильной интерпретацией параметра printf. Ждём топикстартераsmile.gif

ЗЫ. И интересно на всякий случай посмотреть на объявление Xuint8. Вдруг это пресловутый uint_least8_t? smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 11:40
Сообщение #11


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Я так думаю.


К сожалению, гнуся, да еще и под PPC под рукой нет. Могу показать, как компилит аналогичный код IAR под ARM.

Код
void foo1(const char *, ...);

#pragma optimize=no_inline
void foo2(char c)
{
  unsigned int d=123;
  d=d-c;
  foo1("blabla",d,c);
}


Код
        SECTION `.text`:CODE:NOROOT(2)
        ARM
//  135 void foo2(char c)
//  136 {
//  137   unsigned int d=123;
//  138   d=d-c;
//  139   foo1("blabla",d,c);
foo2:
        MOV      R2,R0
        RSB      R1,R0,#+123
        LDR      R0,??foo2_0    ;; `?<Constant "blabla">`
        B        foo1        ;; tailcall
        DATA
??foo2_0:
        DC32     `?<Constant "blabla">`
//  140 }


Обратите внимание, несмотря на размер переменной 8 бит (char c), компилятор не собирается прочищать какие-либо битики. Просто так договоренно, что этим занимается вызывающая функция.

Правда вот получить из IAR'а такое-же поведения, как и ожидаемое мной у гнуся, не получается - тот хоть и матом орет на неинициализированную переменную, но ноликом ее прочищает. Правда, на малых уровнях оптимизации он этого не делает, но зато втыкает and с мусорным регистром.

В общем, тут все зависит от поведения компилятора при вызове функции с неинициализированным аргументом. Рубль за сто, что там гнусь с регистром, в котором происходит передача параметра, ничего не делает, что летит только мусор...

Более точно нам может ответить топикстартер, показав асмовский листинг своего творения.

Цитата
ЗЫ. И интересно на всякий случай посмотреть на объявление Xuint8. Вдруг это пресловутый uint_least8_t?


Кстати, тоже вариант smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 24 2009, 12:28
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Rst7 @ Jul 24 2009, 17:40) *
К сожалению, гнуся, да еще и под PPC под рукой нет.

У меня есть под арм (cortex-m3):

Код
uint32_t test2(unsigned char ch)
{
    uint32_t d = 0x00DEAD00 + ch;
    return d;
}

8000594:    b2c3          uxtb    r3, r0
8000596:    4801          ldr    r0, [pc, #4]    (800059c <test2+0x8>)
8000598:    1818          adds    r0, r3, r0
800059a:    4770          bx    lr
800059c:    00dead00     .word    0x00dead00


Гнусь таки чистит лишние битики.

Цитата
Правда вот получить из IAR'а такое-же поведения, как и ожидаемое мной у гнуся, не получается - тот хоть и матом орет на неинициализированную переменную, но ноликом ее прочищает. Правда, на малых уровнях оптимизации он этого не делает, но зато втыкает and с мусорным регистром.

Ну это тоже вариант. Компилятор гарантирует, что в переменной char старшие биты нулевые. Это уже чёткая аналогия с тем bool. Но чтобы и не гарантировал и не чистил - это как-то коряво, имхо.
Цитата
Более точно нам может ответить топикстартер, показав асмовский листинг своего творения.


Да, будем ждатьsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 12:43
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
У меня есть под арм (cortex-m3):
...
Гнусь таки чистит лишние битики.


Познавательно. Но еще не факт, чего он там на PPC накомпилит. Походу идея с uint_least8_t/uint_fast8_t не лишена смысла. Топикстартер, ауууу!


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 24 2009, 12:54
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AHTOXA @ Jul 24 2009, 15:16) *
При компиляции функции неизвестно, инициализированное будет передано значение или нет. Поэтому, по крайней мере при

Xuint32 d=0xFFFFFD00 + Data;

компилятор должен провести расширение Data до Xuint32. Я так думаю.

А я думаю иначе :-) В стандарте написано: "If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate." Понять это можно по-разному. Но если это понимать так, что у однобайтовых аргументов функции при входе в функцию обязательно надо отсекать лишние биты, то это приведёт к менее компактному и более медленному коду. Кому это надо? Тому разгильдяю, который не хочет инициализировать переменные? Я думаю, не следует идти у него на поводу.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 24 2009, 12:59
Сообщение #15


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Кому это надо? Тому разгильдяю, который не хочет инициализировать переменные? Я думаю, не следует идти у него на поводу.


Я именно так и написал. Потом, правда, зачеркнул, решил, что сильно грубо wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:00
Рейтинг@Mail.ru


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