Перейти к содержанию
    

ARM7 CMSIS?

Есть такая штука CMSIS - библиотека стандартизировнная, организует средний уровень, как я понимаю. А вроде как находил инфу, что она поддерживает семейство LPC23xx, но больше какой-либо вменяемой инфы я на сайте NXP не могу найти. Может есть альтернативы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может есть альтернативы?

Конечно есть. Забыть про этот CMSIS и программировать регистры МК напрямую, периодически заглядывая в руководство. Кстати, ничего страшного в этом нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Официально CMSIS существует только для серии Cortex-M, но есть реализация для 23xx от команды mbed.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно есть. Забыть про этот CMSIS и программировать регистры МК напрямую, периодически заглядывая в руководство. Кстати, ничего страшного в этом нет.

Ага отличное решение, так и делаю и такой подход прекрасно запутвает код, мне нужна корректная абстракция. Надоело переписывать код то под один УАРТ, то по под другой, та же история с таймерами, и прочей перефирией. Я разделил как мог на модули, и путаница просто в каждом модуле, но это меня не устраивает.

 

2 scifi Ваша ссылка ведет в никуда =(. Но будем искать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 scifi Ваша ссылка ведет в никуда =(. Но будем искать

Ссылка от igorsk рабочая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надоело переписывать код то под один УАРТ, то по под другой, та же история с таймерами, и прочей перефирией. Я разделил как мог на модули, и путаница просто в каждом модуле, но это меня не устраивает.

А что, этот самый CMSIS содержит драйверы UART, таймеров и проч., к тому же совместимые по API между разными МК? Моё не очень компетентное мнение: это утопия.

При наличии некоторого опыта можно придумать свой минимальный достаточный API и все свои драйверы заточить под него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения перепутал ники, а ссылка не завилась - инет корявый.

 

Почему утопия как раз я и хочу получить API на семейство(оно ведь довольно популярное), может этот минимильные API уже кто-то сделал. Не хочется изобретать велосипед, потому как я боюсь в этом закопатся.

 

Но гипотетически я все же склонен написать такую штукую. Проблема в том, что я не знаю в какую сторону смотреть: реализовывать это на классах(я больше прикладник), или на структурах и фнукциях. Может кто предложить вменяемую архитектуру исходя из своего опыта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему утопия как раз я и хочу получить API на семейство(оно ведь довольно популярное), может этот минимильные API уже кто-то сделал. Не хочется изобретать велосипед, потому как я боюсь в этом закопатся.

API должно быть заточено под применения. Нужно выбирать баланс между объёмом функционала и простотой реализации.

К примеру, для UART возможны функции: init(всякое-разное или пусто), setrate(rate), getrate(), putchar(byte), getchar(), gettxbuf() - свободное место в буфере, getrxbuf() - число принятых, но не считанных байтов. Все эти функции, кроме init(), могут не менять интерфейс при переходе на другой МК. Конфигурировать (размеры буферов, к примеру) можно макросами. Кроме того, во многих применениях setrate() и getrate() не нужны.

С таймером тоже надо смотреть на применения. Простой небыстрый периодический таймер может иметь всего две функции: init(), poll() - возвращает !0, если был очередной тик.

Ну а классы - это избыточность, на мой взгляд. Хотя признаюсь, у меня на C++ аллергия :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я собственно для каждого класса переферии думаю использовать структуру с набором полей соотвествующих адресам регистров, а ее отображать на задефайненный базовый адрес переферии. соотвественно гипотетический интерефейс функций Read и Send uart

 

bool Read(UartAddrBase addr,byte* data,uint size);
bool Send(UartAddrBase addr,byte*data,uint size);

 

ну вот гляжу доку на этот mbed оч занималтельно наглядно и красиво +)))) но на классах

Я классы остерегаюсь применять - боюсь производительность потерять, но очень хочется. Хотя описанный мной подход не сильно отличаетсяот ООП подхода.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я собственно для каждого класса переферии думаю использовать структуру с набором полей соотвествующих адресам регистров, а ее отображать на задефайненный базовый адрес переферии.

Я так понимаю, это вариант реализации драйвера UART с поддержкой нескольих каналов. Можно и так, вполне симпатично. Только ещё нужно обыграть буферы (у каждого канала свой и, возможно, разных размеров). Так что может оказаться, что без номера канала не обойтись.

 

bool Read(UartAddrBase addr,byte* data,uint size);
bool Send(UartAddrBase addr,byte*data,uint size);

Вполне симпатичное API.

 

Я классы остерегаюсь применять - боюсь производительность потерять, но очень хочется. Хотя описанный мной подход не сильно отличаетсяот ООП подхода.

В моём понимании тут ООП и не пахнет. ООП - это виртуальные функции, всякие хитрые наследования и т.д. В этом применении это всё, естественно, не нужно. Можно разве что из соображений единообразия с остальной программой классы прикрутить.

А по поводу производительность волноваться раньше времени очень вредно. Так как проблема скорее всего надуманная, а вот головная боль и потерянное время будут настоящими. Сначала запустите программу. Если будет тормозить, то оптимизируйте. Иначе это пустая трата времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну собственно в mbed все в таком виде и построенно, правда не удается собрать с ним проект под кейл 4 ругается на скатер файл

 

D:\mbed\LPC2368\LPC2368.sct(4): error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.

 

LR_IROM1 0x00000000 0x80000  {   ; load region size_region
  ER_IROM1 0x00000000 0x80000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000120 0x7EE0  { ; RW data, inc space for realmonitor
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x7FD00000 0x2000  { ; RW data, USB RAM
   .ANY (AHBSRAM0)
  }
  RW_IRAM3 0x7FE00000 0x4000  { ; RW data, ETH RAM
   .ANY (AHBSRAM1)
  }
  RW_IRAM4 0xE0038000 0x0800  { ; RW data, CAN RAM
   .ANY (CANRAM)
  }
  RW_IRAM5 0xE0084000 0x0800  { ; RW data, RTC RAM
   .ANY (RTCRAM)
  }
}

 

даже не знаю куда копать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

даже не знаю куда копать

Возможно, две секции отмечены как First. Секция может быть отмечена как First в ассемблеровских исходниках и в командной строке линкера. Вот там и нужно искать дублирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

http://mbed.org/forum/mbed/topic/518/?page=1#comment-9113

 

Там в теме есть проект под кейл, но под 1768 пытался его перенастроить под 2368 опять ругается на 6235E: More than one section matches selector - cannot all be FIRST/LAST.

 

Если выкинуть скаттер то ругается что не описанна секция. Ктонибудь может объяснить что вобще эти строчки значат?

 

ER_IROM1 0x00000000 0x80000  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }

 

ЗЫ в проекте нет стартап файла *.s

Изменено пользователем SmileGobo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...