SmileGobo 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Есть такая штука CMSIS - библиотека стандартизировнная, организует средний уровень, как я понимаю. А вроде как находил инфу, что она поддерживает семейство LPC23xx, но больше какой-либо вменяемой инфы я на сайте NXP не могу найти. Может есть альтернативы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Может есть альтернативы? Конечно есть. Забыть про этот CMSIS и программировать регистры МК напрямую, периодически заглядывая в руководство. Кстати, ничего страшного в этом нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorsk 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Официально CMSIS существует только для серии Cortex-M, но есть реализация для 23xx от команды mbed. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Конечно есть. Забыть про этот CMSIS и программировать регистры МК напрямую, периодически заглядывая в руководство. Кстати, ничего страшного в этом нет. Ага отличное решение, так и делаю и такой подход прекрасно запутвает код, мне нужна корректная абстракция. Надоело переписывать код то под один УАРТ, то по под другой, та же история с таймерами, и прочей перефирией. Я разделил как мог на модули, и путаница просто в каждом модуле, но это меня не устраивает. 2 scifi Ваша ссылка ведет в никуда =(. Но будем искать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба 2 scifi Ваша ссылка ведет в никуда =(. Но будем искать Ссылка от igorsk рабочая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Надоело переписывать код то под один УАРТ, то по под другой, та же история с таймерами, и прочей перефирией. Я разделил как мог на модули, и путаница просто в каждом модуле, но это меня не устраивает. А что, этот самый CMSIS содержит драйверы UART, таймеров и проч., к тому же совместимые по API между разными МК? Моё не очень компетентное мнение: это утопия. При наличии некоторого опыта можно придумать свой минимальный достаточный API и все свои драйверы заточить под него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Прошу прощения перепутал ники, а ссылка не завилась - инет корявый. Почему утопия как раз я и хочу получить API на семейство(оно ведь довольно популярное), может этот минимильные API уже кто-то сделал. Не хочется изобретать велосипед, потому как я боюсь в этом закопатся. Но гипотетически я все же склонен написать такую штукую. Проблема в том, что я не знаю в какую сторону смотреть: реализовывать это на классах(я больше прикладник), или на структурах и фнукциях. Может кто предложить вменяемую архитектуру исходя из своего опыта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Почему утопия как раз я и хочу получить API на семейство(оно ведь довольно популярное), может этот минимильные API уже кто-то сделал. Не хочется изобретать велосипед, потому как я боюсь в этом закопатся. API должно быть заточено под применения. Нужно выбирать баланс между объёмом функционала и простотой реализации. К примеру, для UART возможны функции: init(всякое-разное или пусто), setrate(rate), getrate(), putchar(byte), getchar(), gettxbuf() - свободное место в буфере, getrxbuf() - число принятых, но не считанных байтов. Все эти функции, кроме init(), могут не менять интерфейс при переходе на другой МК. Конфигурировать (размеры буферов, к примеру) можно макросами. Кроме того, во многих применениях setrate() и getrate() не нужны. С таймером тоже надо смотреть на применения. Простой небыстрый периодический таймер может иметь всего две функции: init(), poll() - возвращает !0, если был очередной тик. Ну а классы - это избыточность, на мой взгляд. Хотя признаюсь, у меня на C++ аллергия :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Я собственно для каждого класса переферии думаю использовать структуру с набором полей соотвествующих адресам регистров, а ее отображать на задефайненный базовый адрес переферии. соотвественно гипотетический интерефейс функций Read и Send uart bool Read(UartAddrBase addr,byte* data,uint size); bool Send(UartAddrBase addr,byte*data,uint size); ну вот гляжу доку на этот mbed оч занималтельно наглядно и красиво +)))) но на классах Я классы остерегаюсь применять - боюсь производительность потерять, но очень хочется. Хотя описанный мной подход не сильно отличаетсяот ООП подхода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба Я собственно для каждого класса переферии думаю использовать структуру с набором полей соотвествующих адресам регистров, а ее отображать на задефайненный базовый адрес переферии. Я так понимаю, это вариант реализации драйвера UART с поддержкой нескольих каналов. Можно и так, вполне симпатично. Только ещё нужно обыграть буферы (у каждого канала свой и, возможно, разных размеров). Так что может оказаться, что без номера канала не обойтись. bool Read(UartAddrBase addr,byte* data,uint size); bool Send(UartAddrBase addr,byte*data,uint size); Вполне симпатичное API. Я классы остерегаюсь применять - боюсь производительность потерять, но очень хочется. Хотя описанный мной подход не сильно отличаетсяот ООП подхода. В моём понимании тут ООП и не пахнет. ООП - это виртуальные функции, всякие хитрые наследования и т.д. В этом применении это всё, естественно, не нужно. Можно разве что из соображений единообразия с остальной программой классы прикрутить. А по поводу производительность волноваться раньше времени очень вредно. Так как проблема скорее всего надуманная, а вот головная боль и потерянное время будут настоящими. Сначала запустите программу. Если будет тормозить, то оптимизируйте. Иначе это пустая трата времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба ну собственно в 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) } } даже не знаю куда копать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 апреля, 2011 Опубликовано 26 апреля, 2011 · Жалоба даже не знаю куда копать Возможно, две секции отмечены как First. Секция может быть отмечена как First в ассемблеровских исходниках и в командной строке линкера. Вот там и нужно искать дублирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SmileGobo 0 27 апреля, 2011 Опубликовано 27 апреля, 2011 (изменено) · Жалоба 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 Изменено 27 апреля, 2011 пользователем SmileGobo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 2 мая, 2011 Опубликовано 2 мая, 2011 · Жалоба CMSIS это жесть такая. Выкинуть его и дело с концом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться