Сергей1734:
Korben_Dallas:
Что скрывается за макросами `GPIO` и т.п.? "Чистый Си"? Нет, конечно. За ним скрывается платфторменно-зависимый хак - приведение целочисленного значения (адреса регистра) к указательному типу. А это уже семантически выходит за пределы "чистого Си".
Это стандартная директива компилятора СИ - #define, а не какой не "хак".
Что за чушь вы несете? О `#define` тут никто не говорит. Речь идет именно о макроподстановке, которая скрывается за этим `#define`. Которая на "чистом Си" написана быть никак не может.
Сергей1734:
Применяется, чтобы не держать в уме большие числа, а использовать их мнемоники. Это есть в любом компиляторе любого языка программирования, и называется предпроцессор. Не имеет значения, что именно программируется: микроконтроолер или календарь на обычном ПК. С точки зрения языка, что мнемоника, что число - абсолютно равноценно. Оно для людей, а не для машин.
Во первых, препроцессор. Во-вторых, вы, я вижу, просто не врубаетесь, о чем идет речь.
Сергей1734:
Korben_Dallas:
А далее идут библиотечные вызовы типа `lcd_init`, т.е. то, о чем и говорилось выше. Т.е. для общения с устройством вы используете HAL, который внутри, разумеется, рано или поздно выйдет за пределы "чистого Си".
Здесь Вы строите лишь предположения без оснований.
Нет, здесь я констатирую жесткие факты, с очевидными на то основаниями.
Сергей1734:
Реальность же такова: библиотечные вызовы - это просто подпрограммы на том же чистом СИ, которые просто оформлены отдельно (для облегчения читабельности исходника).
Нет, конечно. Все эти подпрограммы написаны с использованием абсолютно тех же самых "хаков", которые скрывались за вашими первыми `#define`.
Сергей1734:
P.S. Korben_Dallas, Вы тролль?
Нет. Я один из авторов языка Си. На вашем зачаточном уровне знания языка language-lawyer моего уровня действительно может показаться вам "троллем". Это нормально. Но по мере того как вы будете продвигаться в своем развитии (если будете) вам постепенно все будет становиться яснее.
Сергей1734:
- код выделить все
static volatile unsigned char GPIO @ 0x05;
...
static volatile bit GPIO0 @ (unsigned)&GPIO*8+0;
static volatile bit GPIO1 @ (unsigned)&GPIO*8+1;
static volatile bit GPIO2 @ (unsigned)&GPIO*8+2;
static volatile bit GPIO3 @ (unsigned)&GPIO*8+3;
Вот это все - уже разухабистый выход за пределы языка С. Ничего подобного в С нет.
Добавлено спустя 1 минута 19 секунд
gooblin:
Korben_Dallas, там объявление переменной по абсолютному адресу, используя директивы языка, не входящие в стандарт.
//==============================================================================
// GPIO Bits
extern __at(0x0005) __sfr GPIO;
О чем и речь.