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

 
 
 
Reply to this topicStart new topic
> Простой вопрос по языку C
Igor3
сообщение May 31 2007, 09:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 12-05-06
Пользователь №: 17 021



Занимаюсь модификацией имеющегося исходника на PICС(HI-TECH) под другую периферийную микросхему, управляемую PIC-ом по последовательному трёхпроводному порту. Эта другая периферийная микросхема имеет другую, более сложную организацию адресного пространства контрольных регистров.
В оригинале все 10 bit целой, unsigned переменной загружаются PIC-ом разом в один регистр периферийной микросхемы. А мне нужно эту переменную разбить на три части и загрузить в разные банки, кусками по 2 bit, 4 bit, 4 bit. Как загрузить мне понятно, а как выдернуть из переменной отдельные биты не знаю.
Т.к. программированием никогда не занимался и только вчера скачал книгу Карнигана 07.gif , прошу подсказки в виде пары-тройки строк примера. Надеюсь понятно объяснил свою проблему. 05.gif
Помогите, пожалуйста. Заранее спасибо! beer.gif
Go to the top of the page
 
+Quote Post
spf
сообщение May 31 2007, 09:46
Сообщение #2


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Igor3 @ May 31 2007, 15:17) *
В оригинале все 10 bit целой, unsigned переменной загружаются PIC-ом разом в один регистр периферийной микросхемы. А мне нужно эту переменную разбить на три части и загрузить в разные банки, кусками по 2 bit, 4 bit, 4 bit. Как загрузить мне понятно, а как выдернуть из переменной отдельные биты не знаю.

Если нужные биты идут попорядку, то достаточно воспользоваться сдвигом и маскированием
Код
int test; // исходный, порядок расположения секций в нем  2-4-4
int test4_1; // первая секция из 4 бит
int test4_2; // вторая секция из 4 бит
int test2_1; // секция из 2 бит

test4_1 = test & 0x0f; // маскировать лишнее
test4_2 = (test >>4) & 0x0f; // сдвинуть на  4 бита и маскировать лишнее
test2_1 = (test >>8) & 0x03; // сдвинуть на  8 бит и маскировать лишнее


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 1 2007, 06:42
Сообщение #3


Гуру
******

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



Цитата(spf @ May 31 2007, 12:46) *
Код
int test4-1;
Только замените "-"на "_".


--------------------
На любой вопрос даю любой ответ
"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
spf
сообщение Jun 1 2007, 09:08
Сообщение #4


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Сергей Борщ @ Jun 1 2007, 12:42) *
Только замените "-"на "_".

Успел поправить.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Igor3
сообщение Jun 1 2007, 16:10
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 12-05-06
Пользователь №: 17 021



Огромное спасибо! beer.gif
Я думал в правильном направлении, но меня поставила в тупик опечатка в файле книги по С в примере на использование маскирования, да и в "орфографии" языка С я не уверен, что я бы сам не заблудился smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 1 2007, 17:36
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(spf @ May 31 2007, 12:46) *
Если нужные биты идут попорядку, то достаточно воспользоваться сдвигом и маскированием

Слишком "в лоб". Элегантнее union.
Код
typedef union mbit {
    unsigned short full;
    struct {
    unsigned short first:4;        
    unsigned short second:4;
    unsigned short tree:2;
    unsigned short dummy:6;
            } parts;
}mbit_u;


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
spf
сообщение Jun 2 2007, 02:14
Сообщение #7


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(zltigo @ Jun 1 2007, 23:36) *
Слишком "в лоб". Элегантнее union.

Это понятно, НО я не знаю как с этим справится PICС.
Поэтому и предложил самый простой и наглядный вариант.

А в последнем варианте можно и без думмей wink.gif
Код
    struct {
        unsigned short first:4;        
        unsigned short second:4;
        unsigned short tree:2;
        unsigned short :6;               // неиспользуемые биты нет необходимости именовать
            } parts;


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 2 2007, 07:04
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(spf @ Jun 2 2007, 05:14) *
Это понятно, НО я не знаю как с этим справится PICС.

А почему он должен не справиться? Общие указания на то, что компилятору делать, как правило, предпочтильнее, нежели конкретные - типа бери и сдвигай. В этом случае у компилятора остается больше простора для более глобальной оптимизации. Едиинственно, что, пожалуй, для 8bit платформ более проедпочтительным будет указание паковки битовых полей в unsigned char а не short.
Цитата
Поэтому и предложил самый простой и наглядный вариант.

Насчет простоты использования и наглядности предложенного варианта у меня другое мнение smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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