Немного холивара, но пользы ради

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Как лучше поступить?

продолжать использовать Standard Peripheral Library
3
12%
добавить поддержку камней в opencm3
5
19%
сделать удобную библиотеку
4
15%
не страдать фигнёй и идти спать
14
54%
 
Всего голосов: 26

Аватара пользователя
Kirra
Встал на лапы
Сообщения: 91
Зарегистрирован: Пн фев 17, 2014 21:39:52
Откуда: Saratov

Немного холивара, но пользы ради

Сообщение Kirra »

Здравствуйте!

Хотел поднять одну тему, правда немного холиварную, но на мой взгляд актуальную (опять же, в некотором приближении).

Сначала краткая предыстория :))
Я программирствую контроллеры на ядре Cortex от Миландра. Если точнее, то 1986ВЕ91Т, 1986ВЕ94Т и сейчас немного мучаю 1986ВЕ1Т.
Сами камни неплохие, но с софтом есть некоторые проблемы, если точнее, проблемы со стандартной библиотекой периферии. В ней довольно много ошибок, и нет официальной её поддержки от производителя камней. Написала эту библиотеку компания "Фитон", которая тоже забила на её поддержку и в итоге сейчас десятки её вариантов, отличающихся лишь количество исправленных ошибок. Вообщем, каждый пилит её для себя. И если вдруг придётся кому-нибудь столкнутся с использованием этих контроллеров, то также придётся искать ещё наименее глючный вариант библиотеки для выбранного камня. Или настраивать периферию напрямую через регистры, что тоже, на мой взгляд не есть хорошо.
И вот, что я хочу сделать. Хочу написать библиотеку периферии для этих контроллеров со своими светодиодами и программистками . Чтобы просто стянул библиотеку с гитхаба (или тупо поставил из ppa), указал какой проц, и всё, всё настраивается, всё работает. И в процессе её написания сделать на каждый блок периферии статейку, как его заюзать, какие ошибки в камнях и исходник приимера ещё приложить. По моему, должно быть круто, когда знаешь, где точно взять рабочую библиотечку, и посмотреть, как настроить тот или иной блок. Сейчас думаю, или добавить поддержку этих камней в opencm3 или написать свою.
В пользу opencm3, то она довольно монструозная, с кучей поддерживаемых камушков, но на мой взгляд, не такая удобная как хотелось бы.
В пользу самописной, то если хорошо продумать её дизайн, то может получится действительно удобная библиотека.

И наконец-то к сути вопроса:) Какой стиль настройки периферии на ваш взгляд наиболее удобный? Точнее, как бы вы хотели инициализировать периферию?
Для начала, приведу пару примеров (настраивается пин 0 порта А, как порт чтобы конечно мигать светодиодом :)) )
Это Standard Peripheral Library

Код: Выделить всё

#include <MDR32F9Qx_rst_clk.h>
#include <MDR32F9Qx_port.h>

/** настраивается порт */
PORT_InitTypeDef gpio;
PORT_StructInit(&gpio);

RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA, ENABLE);

PORT_DeInit(MDR_PORTA);
gpio.PORT_FUNC = PORT_FUNC_PORT;
gpio.PORT_MODE = PORT_MODE_DIGITAL;
gpio.PORT_SPEED = PORT_SPEED_MAXFAST;
gpio.PORT_OE = PORT_OE_OUT;
gpio.PORT_Pin = PORT_Pin_0;
PORT_Init(MDR_PORTA, &gpio);

/** и мигается светодиод */
while (1) {
  PORT_SetBits(MDR_PORTA, PORT_Pin_0);
  PORT_ResetBits(MDR_PORTA, PORT_Pin_0);
}


а вот так это в opencm3

Код: Выделить всё

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
/** настраивается порт */
rcc_periph_clock_enable(RCC_GPIOA);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
            GPIO_CNF_OUTPUT_PUSHPULL, GPIO0);

/** и мигается светодиод */
while (1) {
  gpio_toggle(GPIOA, GPIO0);
}


вот, у меня, после бессоной ночи, пока что появляются в голове есть ещё такие вот варианты
как нибудь типа так

Код: Выделить всё

rcc_peripheral_clock_enable(RCC_GPIOA);
gpio_set_mode(GPIOA, GPIO_MODE_DIGITAL_OUTPUT_MAXFAST, PIN0);
gpio_set_output_parametrs(GPIOA,
                          GPIO_OUTPUT_PUSHPULL,
                          GPIO_OUTPUT_MAXPOWER,
                          GPIO_OUTPUT_FILTER_ENABLE,
                          PIN0);
gpio_set_function(GPIOA, GPIO_FUNCTION_PORT, PIN0);

while (1) {
  gpio_inverse_bit(GPIOA, GPIO0);
}

или так

Код: Выделить всё

rcc.gpioa.clock_enable();

gpioa.function.pin0.port();
gpioa.direction.pin0.output();
gpioa.mode.pin0.digital();
gpioa.speed.pin0.maxfast();
gpioa.power.pin0.maxpower();
gpioa.init();

while(1) {
  gpioa.pin0.inverse_bit();
}


Вообщем, вариантов много, но т.к. я работаю лишь с кортексами, то и мозг у меня мыслит как-то однобоко:(

И ещё такой момент: также планирую помимо камней добавить библиотеки для работы с разными штуками, типа DDS, приёмопередатчики МКИО, дисплеи всякие и прочие ништяки, благо часть этого добра уже написано.

Вцелом, вопрос открытый, как лучше сделать? Буду рад услышать любые советы/мнения/критику и т.д.

P.S. Я в любом случае, буду пилить либо opencm3, либо свою либо, т.к. это для меня важно, как чуваку, специализирующийся на ARM-контроллерах.
Я волшебник
kapitan0v
Открыл глаза
Сообщения: 56
Зарегистрирован: Сб июн 14, 2014 09:05:06

Re: Немного холивара, но пользы ради

Сообщение kapitan0v »

Проголосовал за opencm3, но не вижу варианта "писать в регистры напрямую". Возможно четвертый пункт как раз и подразумевает это. :))
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 952
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: Немного холивара, но пользы ради

Сообщение GARMIN »

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

Код: Выделить всё

// разрешение тактирования портов A, B, C, D
   RCC->AHB1ENR = RCC_AHB1Periph_GPIOA         * 1      // GPIOA clock
            | RCC_AHB1Periph_GPIOB         * 1      // GPIOB clock
            | RCC_AHB1Periph_GPIOC         * 1      // GPIOC clock
            | RCC_AHB1Periph_GPIOD         * 1      // GPIOD clock
            | RCC_AHB1Periph_GPIOE         * 0      // GPIOE clock
            | RCC_AHB1Periph_GPIOF         * 0      // GPIOF clock
            | RCC_AHB1Periph_GPIOG         * 0      // GPIOG clock
            | RCC_AHB1Periph_GPIOG         * 0      // GPIOG clock
            | RCC_AHB1Periph_GPIOI         * 0      // GPIOI clock
            | RCC_AHB1Periph_GPIOJ         * 0      // GPIOJ clock (STM32F42xxx/43xxx devices)
            | RCC_AHB1Periph_GPIOK         * 0      // GPIOK clock (STM32F42xxx/43xxx devices) 
            | RCC_AHB1Periph_CRC            * 0      // CRC clock
            | RCC_AHB1Periph_BKPSRAM         * 0      // BKPSRAM interface clock
            | RCC_AHB1Periph_CCMDATARAMEN   * 0      // CCM data RAM interface clock
            | RCC_AHB1Periph_DMA1         * 1      // DMA1 clock
            | RCC_AHB1Periph_DMA2         * 1      // DMA2 clock
            | RCC_AHB1Periph_DMA2D         * 0      // DMA2D clock (STM32F429xx/439xx devices) 
            | RCC_AHB1Periph_ETH_MAC      * 0      // Ethernet MAC clock
            | RCC_AHB1Periph_ETH_MAC_Tx      * 0      // Ethernet Transmission clock
            | RCC_AHB1Periph_ETH_MAC_Rx      * 0      // Ethernet Reception clock
            | RCC_AHB1Periph_ETH_MAC_PTP   * 0      // Ethernet PTP clock
            | RCC_AHB1Periph_OTG_HS         * 1      // USB OTG HS clock
            | RCC_AHB1Periph_OTG_HS_ULPI   * 0;   // USB OTG HS ULPI clock
                  
   RCC_AHB1PeriphClockCmd ((RCC_AHB1Periph_GPIOA
                     | RCC_AHB1Periph_GPIOB
                     | RCC_AHB1Periph_GPIOC
                     | RCC_AHB1Periph_GPIOD), ENABLE);

А проголосовал я за библиотеку, потому что есть много периферии, где не обойдёшься только записью в регистры. Нужно соблюдать последовательность и выполнение условий.
andrey_spb
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс фев 08, 2015 22:00:13

Re: Немного холивара, но пользы ради

Сообщение andrey_spb »

А я как Ленин решил пойти другим путем. Камней, с которыми предполагаю работать немного, три типа, поэтому удумал писать кодогенераторы на питоне с графическим интерфейсом на ткинтере. Благо что у питона мощнейшие инструменты для обработки текста. И кодирование камней облегчит и знания по питону не будут забываться.
svs39
Встал на лапы
Сообщения: 95
Зарегистрирован: Вс авг 22, 2010 09:23:08

Re: Немного холивара, но пользы ради

Сообщение svs39 »

Kirra писал(а):И наконец-то к сути вопроса:) Какой стиль настройки периферии на ваш взгляд наиболее удобный? Точнее, как бы вы хотели инициализировать периферию?

1 херово когда много знаешь и голова работает- трудно выбрать вариант- сочувствую
2 мне больше нравится
gpioa.function.pin0.port();
gpioa.direction.pin0.output();
gpioa.mode.pin0.digital();
gpioa.speed.pin0.maxfast();
gpioa.power.pin0.maxpower();
gpioa.init();
- позже быстрей разобраться
Ответить

Вернуться в «ARM»