Что-то толксах тупняка много, разбавлю-ка его своим.
Допустим, мы хотим что-то передать по 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) Большинство платформо-зависимых фич становится недоступным. Поддерживается только то что понимают все контроллеры. В общем, подходит только для нетребовательных пользователей ардуины.
В общем, всем хорошей пятницы.