LINUX.ORG.RU
ФорумTalks

Жили-был два вида API...

 , ,


0

3

Что-то толксах тупняка много, разбавлю-ка его своим.

Допустим, мы хотим что-то передать по SPI. Вот два подхода которые я повстречал в программировании микроконтроллеров. Какой подход лучше?

Первый:

SPI device(p5, p6, p7, p8);
device.write(0xFF);

Второй:

static const SPIConfig spicfg = { NULL, GPIOB, 12, SPI_CR1_DFF };  // как бы задаёт slave select, но в либе, похоже, не используется
halInit();
chSysInit();
spiInit();

spiStart(&SPID2, &spicfg);
palSetPad(GPIOB, 12);  // вздёрнем SS, сам он не вздёрнется.
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL |
                           PAL_STM32_OSPEED_HIGHEST);  // SS
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) |
                           PAL_STM32_OSPEED_HIGHEST);  // SCK, а 5 это особая уличная магия из даташита.
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5));  // MISO
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) |
                           PAL_STM32_OSPEED_HIGHEST); // MOSI

spiSelect(&SPID2);  // тут это принято делать руками :(
spiSend(&SPID2, sizeof(test), test);
spiUnselect(&SPID2);

Какой вариант выбрать? На самом деле, оба говно. Во втором случае, не смотря на HAL и всё такое, весь код 1) платформозависим 2) заставляет лезть в убогие большие и неудобные даташиты 3) очень нетолерантен к ошибкам и опечаткам 4) весьма раздут 5) постоянно смотреть исходники этого ChibiOS. Не дай бог где-то вместо SPID2 вписать SPID1 или перпутать циферку, код молча незаработает. Да что там, МК зависает если spiSend сделать в цикле без паузы в 1мс (хз что не так, даже разбираться не хочу). Я уже молчу о том что за лесом бойлерплейтинга (это так называется?) не видно логики программы. А том что забыл сделать spiUnselect или перепутал их местами расскажет только логический анализатор после изнурительного дебаггинга. Список можно продолжать долго, но идею вы поняли. В общем, совершенно не developer-friendly.

Перввый вариант тоже говно. 1) hello world весит столько что я не уверен 512K хватит на отладочный билд. 2) многочисленные прослойки добавляют столько оверхеда что у меня есть сомнения в том что новые 200MHz контроллеры будут работать с периферией сильно быстрее старых avr на 8MHz. А, впрочем, вот тут померяли, так и есть: https://developer.mbed.org/forum/mbed/topic/689/?page=1 . 3) Большинство платформо-зависимых фич становится недоступным. Поддерживается только то что понимают все контроллеры. В общем, подходит только для нетребовательных пользователей ардуины.

В общем, всем хорошей пятницы.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 4)

gcc + msp430 наш путь :-)
Теперь еще вот 432-ые подтянулись, да еще и фрамчика насыпали... все будит в шыколаде

Jetty ★★★★★
()

Зачем тебе RTOS, если ты такие примеры приводишь? И чем тебе не угодила libopencm3?

Quasar ★★★★★
()
Ответ на: комментарий от Quasar

Зачем тебе RTOS

Осмелюсь показаться идиотом, но меня это не смущает. Мне нужен только HAL, остальные фишки использовать не обязательно. Да и модульное оно. Мне оно нравилось тем что там люди реально хорошо понимают предметную область и программирование. Но как только попытался использовать я в ней разочаровался. Да и док нет, есть только полуработающие примеры и исходники.

чем тебе не угодила libopencm3?

Я о ней не знал. Я вообще в этом деле мало чего понимаю. Спасибо за наводку, я посмотрю. А ты ей пользовался? Можешь поделиться впечатлениями? Сходу я вижу что там с доками тоже не фонтан и те же грабли что и chibios: нужно руками выставлять всякие GPIO_CNF_OUTPUT_ALTFN_PUSHPUL и прочее. Я реально не понимаю зачем так жить. HAL на то и HAL чтобы не заморачиваться таким. По-моему, это недалеко ушло от голого cmisis, не?

true_admin ★★★★★
() автор топика
Ответ на: комментарий от Jetty

gcc

Эээ, голыми руками прогать без либ? Это реально?

msp430

Извини, я не в курсе, чем он примечателен? У него, похоже, DAC нету, а я их люблю :(

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Я о ней не знал

Я тебе про нее уже несколько раз говорил и ссылки на свои opencm3'шные велосипеды кидал.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от true_admin

Извини, я не в курсе, чем он примечателен?

Это очень обширное семейство. Основной упор сделан на то, что можно включать только те узлы контроллера, которые тебе нужны прямо сейчас. Таким образом здорово снижается энергопотребление.

Tweaker ★★★★☆
()
Ответ на: комментарий от Tweaker

можно включать только те узлы контроллера

Они все так умеют :(. Я по этой теме отхватил кучу лулзов. Для того чтобы помигать светодиодом на avr у меня ушло пол часа на всё про всё с нуля включая чтение даташита (каюсь, у меня был бэкграунд в avr). На stm32 я несколько дней вдуплял в даташиты, потом среди кучи устаревших и негодных примеров нашёл что нужно врубить clock на gpio.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от Tweaker

Я знаю. но все еще можно питать от батареек :-) причем дооолго так...

Jetty ★★★★★
()
Ответ на: комментарий от true_admin

Эээ, голыми руками прогать без либ? Это реально?

Есть пакейдж называется мспваре, в нем все есть (в виде исходников) ну и мейкфайлы... короле все генерится в один мейк из исходников :-)

Извини, я не в курсе, чем он примечателен? У него, похоже, DAC нету, а я их люблю :(

Есть :-) Главные отличия - производительность(ниже), потребление (сильно ниже)...

Jetty ★★★★★
()
Последнее исправление: Jetty (всего исправлений: 1)
Ответ на: комментарий от true_admin

Эээ, голыми руками прогать без либ? Это реально?

А в чем проблема? Открываешь даташит и смотришь, как писать в spi

cvs-255 ★★★★★
()

А вообще, если много читать-писать, есть смысл DMA подтянуть.

Во втором варианте так и будет - в ChibiOS почти все драйверы используют dma.

palSetPad(GPIOB, 12);  // вздёрнем SS, сам он не вздёрнется.
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL |
                           PAL_STM32_OSPEED_HIGHEST);  // SS
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(5) |
                           PAL_STM32_OSPEED_HIGHEST);  // SCK, а 5 это особая уличная магия из даташита.
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(5));  // MISO
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(5) |
                           PAL_STM32_OSPEED_HIGHEST); // MOSI
Используй board.h у Chibios даже тулза есть, которая его генерирует.

весь код 1) платформозависим

Нет. Только

static const SPIConfig spicfg

2) заставляет лезть в убогие большие и неудобные даташиты

Поверь, даже в первом случае тебе придется лезть в даташиты. И да, ты похоже убогих даташитов ни видел. У stm32 одини из самых нормальных reference manual'ов (не считая части про USB - она как раз скопипащена из «убогих даташитов» разработчика IP-ядра для USB).

4) весьма раздут

spiStart(&SPID2, &spicfg);
spiSelect(&SPID2);
spiSend(&SPID2, sizeof(test), test);
spiUnselect(&SPID2);
Kosyak ★★★★
()

Естественно, первый API лучше. И не столько потому, что он проще/короче, а потому, что менее подвержен ошибкам использования.

А то, что битодрочерская программа на Си тратит меньше ресурсов, не доказывает вообще ничего.

tailgunner ★★★★★
()

Мужик. Кодогенерация. Яб уже запулил jinja2 которая генерит это гавно и радовался.

dmxrand
()
Ответ на: комментарий от Harald

Ты что, Ъ пишут сразу в машинных кодах.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от dmxrand

Ты предлагаешь RTOS ставить? Нафиг-нафиг!!!

+ даже если у тебя RTOS, DMA позволит надежно передать данные, в отличие от последовательной посылки.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Moncruist

многоядерные контроллеры

Такие, например, «истинную» многопоточность не умеют. У них общий конвейер, как у видюх.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от true_admin

msp430

Извини, я не в курсе, чем он примечателен? У него, похоже, DAC нету, а я их люблю :(

MSP430 находится примерно посередине между 8-ми разрядными архитектурами и 32-х разрядными Cortex по характеристикам. При этом он значительно проще в освоении, чем STM32. ЦАП действительно есть не во всех MSP430. Но таких МК с ЦАПом достаточно много.

DarthVadimius ★★★★
()
Ответ на: комментарий от true_admin

Ещё у MSP430 особо низкое энергопотребление. Он ориентирован в том числе на устройства с батарейным питанием.

DarthVadimius ★★★★
()
Ответ на: комментарий от DarthVadimius

Спасибо, буду думать не попробовать ли мне их. Но только 16бит как-то смущают. А новая серия это уже cortex внутри? У новой серии есть преимущества перед другими армами?

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Мне понравилась серия MSP430F5xx . Ограничений из-за 16-битности пока не ощущал.

MSP432 пока вживую не смотрел, но в описания видел, что там внутри должен быть Cortex и ещё они обещали сохранить совместимость по периферии с MSP430 (даже названия регистров и т.п.)

Ещё забыл написать про один недостаток MSP430: у них нет встроенного CAN.

DarthVadimius ★★★★
()

вместо SPID2 вписать SPID1

Потому что «няшная сишечка» не умеет в типизацию. Даже в ту недотипизацию, в которую умеет C++. Ну а про задание всего и вся через макросы я могу ругаться часа два без перерыва.

По факту — строить велосипед. С типизацией и платформозависимостью. Или уходить на ПЛМ (FPGA). Но и там хватает специфичных сюрпризов.

one_more_hokum ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.