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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как слепить 2 байта в int16
Eddy71
сообщение Jul 31 2009, 13:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Возник глупейший вопрос из названия темы. Почти на ровном месте. Компилятор CCS PCW. Обработчик прерывания на асме, ловит по радио пакеты. В составе пакетов передается несколько двубайтовых чисел. После успешного приема у меня есть парочки вида
Код
int8 CntTXL,CntTXH;

Как мне без 8 сдвижек влево или без умножения CntTXH на 256 с прибавлением CntTXL получить
Код
int16 CntTX;
?


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2009, 14:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Eddy71 @ Jul 31 2009, 17:52) *
Как мне без 8 сдвижек влево или без умножения

Чем "сдвижки" не устраивают? В реальности ведь компилятор 8 раз циклически сдвигать не станет, как, впрочем, и умножать в лоб на 256.
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Jul 31 2009, 14:15
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Цитата(aaarrr @ Jul 31 2009, 17:08) *
Чем "сдвижки" не устраивают? В реальности ведь компилятор 8 раз циклически сдвигать не станет, как, впрочем, и умножать в лоб на 256.

Будет..
Пытаюсь вспомнить, когда-то как-то через union делал.. Тогда вообще без математики он понимает, что это 2-х байтовая переменная, отводит под двухбайтовое число те же байты в памяти, но чего-то в хэлпе найти не могу..


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2009, 14:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Eddy71 @ Jul 31 2009, 18:15) *
Будет..

Уверены? Тогда меняйте компилятор, ибо если здесь наблюдается такой маразм, то дальше ловить нечего.

Цитата(Eddy71 @ Jul 31 2009, 18:15) *
Пытаюсь вспомнить, когда-то как-то через union делал.. Тогда вообще без математики он понимает, что это 2-х байтовая переменная, отводит под двухбайтовое число те же байты в памяти, но чего-то в хэлпе найти не могу..

Дык это не в хелпе, а в книжке по 'C' искать надо.
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Jul 31 2009, 14:42
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Цитата(aaarrr @ Jul 31 2009, 17:19) *
Уверены? Тогда меняйте компилятор, ибо если здесь наблюдается такой маразм, то дальше ловить нечего.
Дык это не в хелпе, а в книжке по 'C' искать надо.

Нашел. Всё очень просто оказалось:
Код
CntTX = make16(CntTXh,CntTXh);

rolleyes.gif


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2009, 14:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Eddy71 @ Jul 31 2009, 18:42) *
Нашел. Всё очень просто оказалось:

Ужас, чесслово sad.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 31 2009, 15:07
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Eddy71 @ Jul 31 2009, 17:15) *
Будет..
Пытаюсь вспомнить, когда-то как-то через union делал..

Код
union
{
    U16 word;
    struct
    {
        U8 low;
        U8 high;
    } byte;
} Ы;
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 31 2009, 17:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Eddy71 @ Jul 31 2009, 17:15) *
Будет..

Код
   2196                        xt = GetChar();                            // Загрузить SizeX мл.байт
   \   000003D8   ....               RCALL   GetChar
   \   000003DA   2E60               MOV     R6, R16
   2197                        if(Flag.ErrLoadKom) continue;                // Если    обнаружена ошибка загрузки команды,    то перейти к загрузке следующей
   \   000003DC   ....               LDI     R30, LOW(AdrProgEnd)
   \   000003DE   ....               LDI     R31, (AdrProgEnd) >> 8
   \   000003E0   8D01               LDD     R16, Z+25
   \   000003E2   FD00               SBRC    R16, 0
   \   000003E4   CF2C               RJMP    ??main_8
   2198                        *TekAdrActive++ =    xt;
   \   000003E6   01FD               MOVW    R31:R30, R27:R26
   \   000003E8   A900               LDD     R16, Z+48
   \   000003EA   A9F1               LDD     R31, Z+49
   \   000003EC   2FE0               MOV     R30, R16
   \   000003EE   8260               ST      Z, R6
   \   000003F0   01FD               MOVW    R31:R30, R27:R26
   \   000003F2   A900               LDD     R16, Z+48
   \   000003F4   A911               LDD     R17, Z+49
   \   000003F6   5F0F               SUBI    R16, 255
   \   000003F8   4F1F               SBCI    R17, 255
   \   000003FA   AB00               STD     Z+48, R16
   \   000003FC   AB11               STD     Z+49, R17
   2199                        xt |=    (GetChar())<<8;                        // Загрузить SizeX ст.байт
   \   000003FE   ....               RCALL   GetChar
   \   00000400   2E70               MOV     R7, R16

Привёл большой кусок, ничего не выкидывая, чтобы вам яснее видно была работа компилятора. И уровень, с каким он делает оптимизацию.

Обратите внимание на строку "xt = GetChar();". Учитывая что "xt" 16 бит, то компилятор должен был занести в R6 результат работы п/п, а в R7 - 0 (Из листинга видно, что r6:r7 это xt). Но он этого не делает, в связи с тем, что ниже по тексту видит строку "xt |= (GetChar())<<8;". И он компилирует это в "MOV R7, R16".

То есть компилятор не только не делает сдвигов, но даже упрощает саму операцию. Я, когда писал, ожидал от него увидеть следующее:

xt = GetChar();
xt |= (GetChar())<<8;

...
mov r6,r16
ldi r16,0
mov r7,r16
...
or r7,r16

А получил в результате
...
mov r6,r16
...
mov r7,r16
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 31 2009, 17:04
Сообщение #9


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

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



Цитата(defunct @ Jul 31 2009, 21:07) *
Код
union
{
...
} Ы;


С "Ы" наверное не прокатитsmile.gif


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


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(AHTOXA @ Jul 31 2009, 20:04) *
С "Ы" наверное не прокатитsmile.gif

smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 1 2009, 09:03
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(aaarrr @ Jul 31 2009, 17:45) *
Ужас, чесслово sad.gif
Не то слово...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Aug 1 2009, 16:15
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Цитата(Сергей Борщ @ Aug 1 2009, 12:03) *

Почему я до сих пор воюю с CCS? Очень просто - если глянуть ветку, где Hi-tech PICC обсуждается становится страшно. Знакомые с продуктом Микроэлектроники воевали - тоже мало хорошего. С этим компилятором периодически "косяки" вылазят из-за неадекватного мануала. Сам компилятор не косячит, работает стабильно, быстро, код компактный..


--------------------
«Чтобы что-то изобрести, вам потребуется хорошее воображение и куча мусора» /Томас Эдисон/
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 2 2009, 23:57
Сообщение #13


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Eddy71 @ Aug 1 2009, 19:15) *
если глянуть ветку, где Hi-tech PICC обсуждается становится страшно.

Hi-Tech PICC считается самым лучшим компилятором под PIC.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 3 2009, 05:52
Сообщение #14


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Eddy71 @ Aug 1 2009, 19:15) *
Почему я до сих пор воюю с CCS? Очень просто - если глянуть ветку, где Hi-tech PICC обсуждается становится страшно. 

bb-offtopic.gif  пару лет назад рассказывал одному челу - жаловался, в общем, не успевала винда под дельфями кой-чего делать. Товарисч слушал-слушал мои тирады, потом говорит: "винда, винда... линукс!!!" Так и не пожаловался, короче smile.gif
По теме. SDCC Охwенный минус - нету поддержки dspic, и простеньких пиков. Зато остальное(pic18) - полет нормальный.
Go to the top of the page
 
+Quote Post
Eddy71
сообщение Aug 3 2009, 09:41
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 224
Регистрация: 23-11-08
Из: Украина, Луганск
Пользователь №: 41 879



Цитата(_Pasha @ Aug 3 2009, 08:52) *
По теме. SDCC Охwенный минус - нету поддержки dspic, и простеньких пиков. Зато остальное(pic18) - полет нормальный.

Политические войны на тему "что лучше" раньше в Фидо карались до отключения на год.. С компилятором оно как с женщиной: одному нравится, чтоб была как балерина невесомая, другому что можно было "..а я в тебя как в море..", кому-то французская изысканность, а кому то и немецкий "..дасис фантастиш!"
smile3009.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 Текстовая версия Сейчас: 4th July 2025 - 12:31
Рейтинг@Mail.ru


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