Как стать автором
Обновить

Комментарии 15

поэтому работу с битовыми полями рассмотрим в части 2, если тема интересная.

Давайте рассмотрим, тема интересная.
конечно volatile обязателен.
Просто он у меня в макросе забит и я про него забыл.
Стоп. Const или volatile?
Вставлю свои пять копеек.
Я не объявляю переменную, просто define, также добавляю volatile, чтобы компилятор не оптимизировал нашу переменную.

typedef struct Uart_s {
  UInt irqEn;
  UInt irq;
  UInt addr;
  UInt data;
  UInt num;
} Uart;

#define UART ((volatile Uart *)UART_ADDR)


Пример использования

UART->irqEn = UART_IRQ_EN_TX;
irq = UART->irq;
НЛО прилетело и опубликовало эту надпись здесь
Вот так всегда у меня — сначала разъясняю то, что более-менее очевидно, а потом, увидев много букв, начинаю пропускать необходимые вещи. В последнем абзаце я на них намекнул, наверное надо было поподробнее.
оператор @ (и директива #pragma location)

ТАК ВОТ ЧТО ЭТО ЗА ХРЕНЬ!
Хм?
Да я в свое время мозг себе вот этим повредил:
// Register: PORTA
volatile unsigned char PORTA @ 0x005;
// bit and bitfield definitions
volatile bit RA0 @ ((unsigned)&PORTA*8)+0;
А разве в студии нет *.h файлов для процессоров с #define всей периферии?
… процессора?
-Есть
-А про что тогда статья?
-Про дефайны *внешней* периферии!
Строго говоря про то как их лучше делать.
Хотя «лучше» в данном случае понятие весьма относительное и субъективное
Вчера перед сном пришло в голову, например для установки последовательно идущих регистров:

int setRegister(int *base, char *fmt, ...)
{
    va_list st;
    va_start(st,fmt);
    
    while (*fmt)
    {
        if (*fmt == '%')
        {
           fmt++; 
           switch(*fmt)
           {
               case 'i':
               {
                   *base = va_arg(st,int);
                   base++;
                   fmt++;
                   continue;
                   
               } break;
                   
               default:
                   fprintf(stderr,"unknown option '%c' \n",*fmt);
                   exit(EXIT_FAILURE);
                   break;
           }
                       
        }
        
        fmt++;
    }

    va_end(st); 
}
и пример использования

setRegister(TIM1,«PERIOD: %i PREDDIV: %i TOV2: %i»,1001,1002,1003);
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории