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

Кто любит 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
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 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»