|
|
  |
libopencm3, Неплохая либа для кортексов... |
|
|
|
Oct 6 2015, 08:18
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Цитата(scifi @ Oct 6 2015, 13:17)  +1. Запустить UART - это вообще тривиально. Ну тривиально, тривиально. Также, как и SPI. Может я неправильно устроен, но, когда я таскаю из проекта в проект вывод printf в UART/USB, мне хочется запихать это уже в законченный .c + .h и подключать, как модуль. А ведь периферии много. И UARTов может быть много, а это, как правильно подметили, 1% от серьезной программы. Код неплохо было бы иметь читаемый, а не CR |= 0x01b1;
Сообщение отредактировал drozel - Oct 6 2015, 08:21
|
|
|
|
|
Oct 6 2015, 10:58
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Дак так и получается, если делать не один проект, то все-равно дорабатываешь либы под себя и убираешь ошибки. Но ИМХО, писать с нуля, например усб стеки - ну это для отпетых "гурманов" не путайте теплое с мягким.... Одно дело написать один свой, нужный именно тебе функционал и проверить его. Другое дело вычистить ошибки в огромном универсальном проекте выполняющим все возможные функционалы. При этом он (куб) реально очень перепутанный и на много что завязан, так что фиг его просто сократишь до нужного.
|
|
|
|
|
Oct 7 2015, 03:28
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Цитата(_Pasha @ Oct 6 2015, 18:01)  dma - как бы тоже, чтобы канал и стрим выбирало само исходя из указанного адреса периферии. в принципе - небольшая табличка во флеше решает проблемы с необходимостью лазать по даташиту. Ну так это и есть библиотека более высокого уровня. Что-то вроде того и реализовано в Cube, но, говорят много ошибок и недоработок.
|
|
|
|
|
Oct 7 2015, 04:45
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(drozel @ Oct 7 2015, 06:28)  Ну так это и есть библиотека более высокого уровня. Что-то вроде того и реализовано в Cube, но, говорят много ошибок и недоработок. Из куба один раз попробовал запустить что-то с usb, быстро перехотелось. Высокого уровня... вот например - годами одна и та же функция настройки Код int uart_setup( // >0 - configured yet 0-service busy <0 - error char n,// which one baud_t baud, // may be long or int32 char bits, // ['5'..'9'] char parity, // ['E','O','N'] char stops); // ['1','2'] не включает в себя экзотику типа multiprocessor mode или 1.5 стопа но я что-то не припомню когда ими пользовался...
|
|
|
|
|
Oct 8 2015, 09:24
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Люди, помогите с либой. Пытаюсь завести USB CDC с libopencm3 и вот этим примером. Я допускаю, что туплю, библиотека написана с каким то жонглированием указателями, которое мне пока непривычно + пришлось немного портировать на IAR, т.к. либа содержит много директив от GCC. На данный момент USB поднимается, но устройство не опознается, PID и VID комп видит нулевые. Конкретный вопрос: Код usbd_device *usbd_init(const usbd_driver *driver, const struct usb_device_descriptor *dev, const struct usb_config_descriptor *conf, const char **strings, int num_strings, uint8_t *control_buffer, uint16_t control_buffer_size) { usbd_device *usbd_dev;
usbd_dev = driver->init();
usbd_dev->driver = driver; usbd_dev->desc = dev; usbd_dev->config = conf; usbd_dev->strings = strings; usbd_dev->num_strings = num_strings; usbd_dev->ctrl_buf = control_buffer; usbd_dev->ctrl_buf_len = control_buffer_size;
usbd_dev->user_callback_ctr[0][USB_TRANSACTION_SETUP] = _usbd_control_setup; usbd_dev->user_callback_ctr[0][USB_TRANSACTION_OUT] = _usbd_control_out; usbd_dev->user_callback_ctr[0][USB_TRANSACTION_IN] = _usbd_control_in;
int i; for (i = 0; i < MAX_USER_SET_CONFIG_CALLBACK; i++) { usbd_dev->user_callback_set_config[i] = NULL; }
return usbd_dev; } Что при этом возвращает функция? Указатель на локальную переменную (стек)? Ведь переменная локальная, выделена не динамически. Я просто в ступоре. --- UPD все, наладил, проблема была у меня. Тем не менее, прошу ликбеза по си..
Сообщение отредактировал drozel - Oct 8 2015, 10:10
|
|
|
|
|
Oct 8 2015, 10:34
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(drozel @ Oct 8 2015, 12:24)  Что при этом возвращает функция? Указатель на локальную переменную (стек)? Функция возвращает указатель на структуру типа usbd_device. То есть фактически, на адрес в памяти, где находится переменная. Цитата Ведь переменная локальная, выделена не динамически. Я просто в ступоре. Локальная - не есть выделенная динамически. Локальная выделяется на стеке и уничтожается при выходе из процедуры (точнее становится непредсказуемой). Выделена динамически, значит размещена на куче. Она уничтожается только явно процедурой free. В данном случае локально объявляется указатель. Далее запускается driver->init(), что похоже динамически выделяет память и инициализирует структуру. П/п возвращает этот указатель. В чём вопрос?
|
|
|
|
|
Oct 8 2015, 16:41
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Цитата(SasaVitebsk @ Oct 8 2015, 16:34)  В чём вопрос? Да, запарился с этой либой, затупил.
|
|
|
|
|
Oct 9 2015, 09:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(drozel @ Oct 9 2015, 04:57)  Да, уже нашел, спасибо. Просто непривычно: вместо того, чтоб сделать ее глобальной делают ее глобальным статиком и передают указатель через череду фукнций. Более правильно, согласен. Ну это такой сиплюсплюс из костылей: "класс" логики работает с "классом" физического драйвера через указатель на последний. Если понимать принципы C++, всё понятно и очевидно. Но работать всё равно неудобно - IDE не "прыгает" при чтении кода к соотв. функции, да и ошибиться при заполнении структуры с указателями куда легче...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Oct 12 2015, 11:40
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(drozel @ Oct 12 2015, 14:10)  Почти мигрировал с stdlib и cube на сабж. Остался вопрос, нужна помощь. Где файл, прописывающий в память таблицу векторов прерываний? В stdlib был стартап файл на асме, здесь уже перерыл все, в упор не вижу. это содержимое папки dispatch и далее по дефайну. собирайте сразу в статик либу. гемора потом вообще 0.0% правда, я перед этим выдрал из usb отдельно SCSI и компильнул либы без него. потому что msc полно сюрпризов.
|
|
|
|
|
Oct 12 2015, 11:55
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Цитата(_Pasha @ Oct 12 2015, 17:40)  это содержимое папки dispatch и далее по дефайну. Там 2 файла: vector_chipset.c и vector_nvic.c Первый инклудит аналогичный файл из папки f4 (в моем случае), который просто включает сопроцессор: Код static void pre_main(void) { /* Enable access to Floating-Point coprocessor. */ SCB_CPACR |= SCB_CPACR_FULL * (SCB_CPACR_CP10 | SCB_CPACR_CP11); } Второй соответственно ищет vector_nvic.c в папке семейства, но его там нет. Зато есть зацепка в папке scripts, скрипт irq2nvic_h, вроде на питоне (судя по строке #!/usr/bin/env python), содержащий, помимо всего прочего,такие строки Код """Generate an nvic.h header from a small JSON file describing the interrupt numbers.
Code generation is chosen here because the resulting C code needs to be very repetetive (definition of the IRQ numbers, function prototypes, weak fallback definition and vector table definition), all being very repetitive. No portable method to achive the same thing with C preprocessor is known to the author. (Neither is any non-portable method, for that matter.)""" Я на питоне не силен, скачал интерпретатор под винду, пытаюсь его как-то запустить. Пока неудачно, но это вопрос скорее в тему по питону.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|