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

 
 
> C++ templates и mcu peripherals
_Артём_
сообщение Mar 23 2012, 00:03
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Доброе утро.
Такой простой вопрос: сейчас многие современные контроллеры оснащаются несколькими однотипными блоками периферии. Что толкает к повторному использованию кода и templates в частности.
Как правило структура блока однотипна (имеет одинаково расположенные в памяти регистры) и каждый блок занимает в памяти некоторую непрерывную область начинающиюся с базового адреса.
Ну так вот вопрос: как правильней передать шаблону этот самый базовый адрес?
Код
template <int BASE_ADDRESS> class TIOBlock {
.....
}

И потом приводить этот адрес к тому что надо?
Или использовать enum или ещё что?
Как делать правильней?

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Mar 23 2012, 09:54
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Я для SAM9XE (IAR 6.x) делал так:

Код
template <int PORT, int T_BUFF_SIZE, int R_BUFF_SIZE>
class THwUART
{
  public:
  static  OS::SEM::Handle RxSem @ ".fast_ram";
  static  OS::SEM::Handle TxSem @ ".fast_ram";
  static  uint32_t LastErr      @ ".fast_ram";
  
  typedef THwRXPDC<PORT,uint8_t,R_BUFF_SIZE> RxPDC;    
  typedef THwTXPDC<PORT,uint8_t,T_BUFF_SIZE> TxPDC;
  
  inline static volatile AT91S_USART *UART_BASE()
  {
    switch ( PORT )
    {
      case AT91C_ID_US0: return AT91C_BASE_US0;
      case AT91C_ID_US1: return AT91C_BASE_US1;
      case AT91C_ID_US2: return AT91C_BASE_US2;
      case AT91C_ID_US3: return AT91C_BASE_US3;
      case AT91C_ID_US4: return AT91C_BASE_US4;
      default: return NULL;
    }
  }

static void irq_handler()
  {
    uint32_t YieldRequired = OS::SEM::YIELD_NOTREQUIRED;
    uint32_t imr = UART_BASE()->US_IMR;
    uint32_t status = UART_BASE()->US_CSR & imr;
    if( status &  AT91C_US_TIMEOUT)
    {
      UART_BASE()->US_CR = AT91C_US_STTTO;
      OS::SEM::SignalFromISR(RxSem, &YieldRequired);
    };
...
Go to the top of the page
 
+Quote Post



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

 


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


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