|
|
  |
ARM7 CMSIS?, LPC23xx |
|
|
|
Apr 25 2011, 11:18
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Есть такая штука CMSIS - библиотека стандартизировнная, организует средний уровень, как я понимаю. А вроде как находил инфу, что она поддерживает семейство LPC23xx, но больше какой-либо вменяемой инфы я на сайте NXP не могу найти. Может есть альтернативы?
|
|
|
|
|
Apr 25 2011, 15:14
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 22-03-10
Пользователь №: 56 131

|
Официально CMSIS существует только для серии Cortex-M, но есть реализация для 23xx от команды mbed.
|
|
|
|
|
Apr 26 2011, 06:57
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Цитата(scifi @ Apr 25 2011, 16:02)  Конечно есть. Забыть про этот CMSIS и программировать регистры МК напрямую, периодически заглядывая в руководство. Кстати, ничего страшного в этом нет. Ага отличное решение, так и делаю и такой подход прекрасно запутвает код, мне нужна корректная абстракция. Надоело переписывать код то под один УАРТ, то по под другой, та же история с таймерами, и прочей перефирией. Я разделил как мог на модули, и путаница просто в каждом модуле, но это меня не устраивает. 2 scifi Ваша ссылка ведет в никуда =(. Но будем искать
|
|
|
|
|
Apr 26 2011, 07:32
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(SmileGobo @ Apr 26 2011, 10:57)  Надоело переписывать код то под один УАРТ, то по под другой, та же история с таймерами, и прочей перефирией. Я разделил как мог на модули, и путаница просто в каждом модуле, но это меня не устраивает. А что, этот самый CMSIS содержит драйверы UART, таймеров и проч., к тому же совместимые по API между разными МК? Моё не очень компетентное мнение: это утопия. При наличии некоторого опыта можно придумать свой минимальный достаточный API и все свои драйверы заточить под него.
|
|
|
|
|
Apr 26 2011, 07:50
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Прошу прощения перепутал ники, а ссылка не завилась - инет корявый.
Почему утопия как раз я и хочу получить API на семейство(оно ведь довольно популярное), может этот минимильные API уже кто-то сделал. Не хочется изобретать велосипед, потому как я боюсь в этом закопатся.
Но гипотетически я все же склонен написать такую штукую. Проблема в том, что я не знаю в какую сторону смотреть: реализовывать это на классах(я больше прикладник), или на структурах и фнукциях. Может кто предложить вменяемую архитектуру исходя из своего опыта?
|
|
|
|
|
Apr 26 2011, 08:08
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(SmileGobo @ Apr 26 2011, 11:50)  Почему утопия как раз я и хочу получить API на семейство(оно ведь довольно популярное), может этот минимильные API уже кто-то сделал. Не хочется изобретать велосипед, потому как я боюсь в этом закопатся. API должно быть заточено под применения. Нужно выбирать баланс между объёмом функционала и простотой реализации. К примеру, для UART возможны функции: init(всякое-разное или пусто), setrate(rate), getrate(), putchar(byte), getchar(), gettxbuf() - свободное место в буфере, getrxbuf() - число принятых, но не считанных байтов. Все эти функции, кроме init(), могут не менять интерфейс при переходе на другой МК. Конфигурировать (размеры буферов, к примеру) можно макросами. Кроме того, во многих применениях setrate() и getrate() не нужны. С таймером тоже надо смотреть на применения. Простой небыстрый периодический таймер может иметь всего две функции: init(), poll() - возвращает !0, если был очередной тик. Ну а классы - это избыточность, на мой взгляд. Хотя признаюсь, у меня на C++ аллергия :-)
|
|
|
|
|
Apr 26 2011, 09:12
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
Я собственно для каждого класса переферии думаю использовать структуру с набором полей соотвествующих адресам регистров, а ее отображать на задефайненный базовый адрес переферии. соотвественно гипотетический интерефейс функций Read и Send uart Код bool Read(UartAddrBase addr,byte* data,uint size); bool Send(UartAddrBase addr,byte*data,uint size); ну вот гляжу доку на этот mbed оч занималтельно наглядно и красиво +)))) но на классах Я классы остерегаюсь применять - боюсь производительность потерять, но очень хочется. Хотя описанный мной подход не сильно отличаетсяот ООП подхода.
|
|
|
|
|
Apr 26 2011, 09:22
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(SmileGobo @ Apr 26 2011, 13:12)  Я собственно для каждого класса переферии думаю использовать структуру с набором полей соотвествующих адресам регистров, а ее отображать на задефайненный базовый адрес переферии. Я так понимаю, это вариант реализации драйвера UART с поддержкой нескольих каналов. Можно и так, вполне симпатично. Только ещё нужно обыграть буферы (у каждого канала свой и, возможно, разных размеров). Так что может оказаться, что без номера канала не обойтись. Цитата(SmileGobo @ Apr 26 2011, 13:12)  Код bool Read(UartAddrBase addr,byte* data,uint size); bool Send(UartAddrBase addr,byte*data,uint size); Вполне симпатичное API. Цитата(SmileGobo @ Apr 26 2011, 13:12)  Я классы остерегаюсь применять - боюсь производительность потерять, но очень хочется. Хотя описанный мной подход не сильно отличаетсяот ООП подхода. В моём понимании тут ООП и не пахнет. ООП - это виртуальные функции, всякие хитрые наследования и т.д. В этом применении это всё, естественно, не нужно. Можно разве что из соображений единообразия с остальной программой классы прикрутить. А по поводу производительность волноваться раньше времени очень вредно. Так как проблема скорее всего надуманная, а вот головная боль и потерянное время будут настоящими. Сначала запустите программу. Если будет тормозить, то оптимизируйте. Иначе это пустая трата времени.
|
|
|
|
|
Apr 26 2011, 13:15
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
ну собственно в 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) } } даже не знаю куда копать
|
|
|
|
|
Apr 27 2011, 06:04
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-12-10
Пользователь №: 61 451

|
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 - Apr 27 2011, 06:05
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|