Понимание этого встроенного кода c

Я пытаюсь понять этот встроенный код c. Я думаю, это означает, что биты порта подключаются к какому-то регистру в шине. Поправьте меня если я ошибаюсь. И любые изменения, которые мы вносим в порты, будут отражаться в регистрах шины. Вот фрагмент кода. Спасибо.

/*--------------------------------------------------------------------------
Local Variables
--------------------------------------------------------------------------*/
// Port bits assigned to Amba Peripheral Bus (APB)
// P0^7..P0^0               // output=reg_addr, input=data_in (APB prdata)
sbit APB_SEL = P1^7;        // select a bus transaction
sbit APB_EN  = P1^6;        // enable/activate a component 0 = disable, 1 = enable

person Vikyboss    schedule 07.07.2011    source источник
comment
Код, который вы разместили, сильно макросифицирован/типизирован, и его практически невозможно определить по небольшому фрагменту, который вы разместили. Я предлагаю вам поискать определения sbit и P1, чтобы дать вам некоторые подсказки.   -  person DaveR    schedule 08.07.2011
comment
@Dave - очевидно, это хуже, чем вы (или я) думали (см. ответ Преторианца ниже). По-видимому, sbit и ^ являются специфичными для компилятора расширениями (нет, ^ не является оператором XOR...) Тьфу.   -  person Dan    schedule 08.07.2011


Ответы (2)


Код определяет битовые позиции для чтения из регистров. sbit определяет бит в регистре специальной функции (SFR).

sbit APB_SEL = P1^7;

Здесь P1 — ранее определенный ФТБ. Строка определяет APB_SEL как бит 7 (нумерация, начинающаяся с нуля) P1.

Эта ссылка содержит дополнительные сведения о синтаксисе.

person Praetorian    schedule 07.07.2011
comment
+1 за URL. Мне не совсем понятно, как это делает операция xor, но это менее важно, чем то, что это то, что кажется задокументированным поведением. - person Jonathan Leffler; 08.07.2011
comment
@Jonathan Leffler: я не думаю, что это операция XOR, это похоже на какой-то ложный синтаксис, изобретенный только для этой цели. - person Praetorian; 08.07.2011
comment
C, который понимает только компилятор 8051 (или его вариантов) :-) Встроенные компиляторы постоянно создают такие ключевые слова и синтаксис. Например, компилятор TI, который я использую на работе, включает такие ключевые слова, как cregister и interrupt. - person Praetorian; 08.07.2011
comment
Большое спасибо преторианцу. Ваш ответ был действительно полезен! :) - person Vikyboss; 08.07.2011
comment
@Praetorian: Вы, вероятно, правы в том, что это особый синтаксис для этого конкретного компилятора. Кажется, это другой мир. Мне приходится работать на разных платформах; ясно, что код, использующий эту нотацию, более или менее не может работать на разных платформах. (Это не будет работать, как описано, на компиляторах, с которыми я работаю, на машинах, на которых я работаю). Что-то подобное можно аккуратно поместить в гетто машинно-специфичных частей какой-нибудь программы, но мы редко подходим так близко к аппаратному обеспечению. Другие люди, вероятно, делают это часто; мир огромен, но даже в этом случае это было откровением. - person Jonathan Leffler; 08.07.2011
comment
Я часто чувствую, что большинство людей, которые пишут встроенные компиляторы, нуждаются в твердой коррекции с помощью большого тупого предмета. Я имею в виду, зачем следовать ISO- и отраслевому стандарту C, если вы можете предложить свой собственный синтаксис языка! Тот, кто сможет привести самый иррациональный аргумент в пользу такого синтаксиса, получит огромную награду! - person Lundin; 08.07.2011
comment
Есть хорошие и плохие способы расширения языка. Это одно из худших из тех, что я когда-либо видел, поскольку левое выражение неотличимо от выражения XOR. Что это за компилятор? Ссылка на шину AMBA предполагает цель ARM, но я никогда раньше этого не видел. - person Clifford; 08.07.2011
comment
@Praetorian: автобус AMBA на 8051 - кажется маловероятным. Скорее всего, это устаревший компилятор CARM от Keil, выпущенный до того, как ARM купила его и перешла на RealView. Мне кажется, что @Vikyboss может захотеть рассмотреть возможность обновления набора инструментов. - person Clifford; 09.07.2011

Тип sbit определяет бит в регистре специальной функции (SFR). Используется одним из следующих способов:

sbit name = sfr-name ^ bit-position;
sbit name = sfr-address ^ bit-position;
sbit name = sbit-address;

Где

name — это имя бита SFR.

sfr-name – это имя ранее определенного SFR.

bit-position – это позиция бита в SFR.

sfr-address – это адрес SFR.

sbit-address — это адрес бита SFR.

В типичных приложениях 8051 часто необходимо получить доступ к отдельным битам в SFR. Тип sbit обеспечивает доступ к SFR с побитовой адресацией и другим объектам с побитовой адресацией. Например:

sbit EA = 0xAF;

Это объявление определяет EA как бит SFR по адресу 0xAF. На 8051 это бит разрешения всех в регистре разрешения прерываний.

person Moorthi Muthu    schedule 10.08.2015