Easyelectronics.ru

Электроника для всех
Текущее время: 29 сен 2020, 03:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 199 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.
Автор Сообщение
 Заголовок сообщения: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 22:17 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
решил в отдельный топик оформить свои приключения.

на строчке
_USB_STRING_(wsCDCData, L"CDC Data") получаю ошибку:
wide character array initialized from incompatible wide string.
нашел дефайн:
Код:
#define _USB_STRING_(name, ws)                  \
    \
const struct name \
{                          \
        uint8_t  bLength;                       \
        uint8_t  bDescriptorType;               \
        uint16_t bString[(sizeof(ws) - 2) / 2]; \
    \
} \
name __attribute__((used, section("usb_string"))) = {sizeof(name), 0x03, ws};


, расшифровал его в вид
Код:
const struct wsCDCData
{                         
        uint8_t  bLength;                       
        uint8_t  bDescriptorType;               
        uint16_t bString[(sizeof(L"CDC Data") - 2) / 2];
} ;
wsCDCData __attribute__((used, section("usb_string"))) = {sizeof(wsCDCData), 0x03, L"CDC Data"};

вставил, и вместо ошибки получаю кучку ворнингов - почему?

и про сами ворнинги:
useless type qualifier in empty declaration (что бы это ни означало - я не понял)
и
data definition has no type or storage class
type defaults to 'int' in declaration of 'wsCDCData' [-Wimplicit-int]
excess elements in scalar initializer
(near initialization for 'wsCDCData')

полез искать, что значит used в строчке
name __attribute__((used, section("usb_string"))) = {sizeof(name), 0x03, ws};

https://gcc.gnu.org/onlinedocs/gcc-4.7. ... butes.html

нифига не понял. объясните человеческими словами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 22:24 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
А зачем там section("usb_string")? Зачем вообще эту хрень в отдельную секцию пихать?
Вот так нормально работает:
Код:
#define USB_STRING(name, str)                  \
static const struct name \
{                          \
        uint8_t  bLength;                       \
        uint8_t  bDescriptorType;               \
        uint16_t bString[(sizeof(str) - 2) / 2]; \
    \
} \
name = {sizeof(name), 0x03, str}

USB_STRING(USB_StringSerialDescriptor, u"000001");
USB_STRING(USB_StringManufacturingDescriptor, u"Eddy @ SAO RAS");
USB_STRING(USB_StringProdDescriptor, u"USB-Serial Controller");


А, у тебя там вместо u"str" зачем-то написано L"str", а при чем здесь wchar_t?
(если что, у wchar_t размер == 32 бита!)

А еще у тебя вот: "} ; ", там не должно быть точки с запятой!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 22:44 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
точно.
точка с запятой лишняя видимо была. убрал ее - ошибка стала точно такой же.
поставил u вместо L - ошибки убрались. ура. спасибо!

правда, я не очень понял фокуса. и зачем автор исходника так написал.

правильно ли я понимаю, что L и u заставляют компилятор по-разному понимать строку?
что такое wchar_t (L) и что делает u?

теперь осталось ворнинги побороть в строчке

volatile USBLIB_EPBuf EPBufTable[EPCOUNT] __attribute__((at(USB_PBUFFER)));
volatile uint32_t USBEP[EPCOUNT] __attribute__((at(USB_BASE)));

ругань была такой: 'at' attribute directive ignored [-Wattributes] -


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 23:13 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
u говорит, что там юникод uint16_t, а wchar_t - это "переменный" юникод (вроде utf8).
Писал, видимо, вендузятник под вЫжуал сТудио. А там и не такой маразм можно встретить.

Ты что ли переделываешь старый пример USB HID? Вот он у меня уже переделанный. Я вот так сделал...

Да, EP_Init лучше вот так сделать - более универсально, если понадобится на основе этого кода делать какой-то другой класс USB...
Ну и помнить, что у STM32F0x2 при работе с CAN в буфере только 768 байт из 1024 можно использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 23:17 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
я на blue pill, и пока не до can.
залил что было с ворнингами - ожидаемо не завелось.
сейчас буду в твой код втыкать. спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 23:19 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
и нет, это usb-serial вот отсюда

https://github.com/saewave/STM32F103-USB-CDC-CMSIS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 23:25 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
сдается мне, в данном случае мне проще вот с этой записью разобраться по-хорошему
volatile USBLIB_EPBuf EPBufTable[EPCOUNT] __attribute__((at(USB_PBUFFER)));
я так понял, этим at они хотят указать, что EPBufTable находится по тому адресу?
ведь можно наверное, заменить этот изврат дополнительной строчкой?

хотя вот тут примерно то же предлагают сделать, через директивы...
https://www.avrfreaks.net/forum/how-do- ... riable-gcc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 23:31 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Дык, я этот изврат и заменял - просто как и все регистры укажи. Посмотри по ссылочке, что я давал. Указываешь адрес буфера, потом определяешь массив структур на этом адресе. И все.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 31 янв 2020, 23:58 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
где-то рядом, но пока не могу сообразить.
я пару раз пытался вникнуть в usb - но там чересчур много.
в данном случае просто использую его как некий черный ящик.
что за EPBufTable и USBEP и почему они одинаковой размерности (EPCOUNT) и чему именно они соответствуют в твоем коде?

что делает __IO например в этом коде?
typedef struct{
__IO USB_EPDATA_TypeDef EP[8];
} USB_BtableDef;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 00:03 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
__IO - это тупо volatile. EPBufTable - это таблица настроек конечных точек (у меня USB_BTABLE), лежит в том самом буфере (который USB делит с CAN, правда, в F103 деление неполноценное: либо USB, либо CAN). А вместо USBEP у меня USB->EPnR - это регистры каждой конечной точки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 00:54 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
то есть в моем случае вот так можно сделать?
#define EPBufTable ((USBLIB_EPBuf *)(USB_BASE))
+ думаю, что делать про USBEP


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 01:16 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
Нет, не USB_BASE, а EP_BUF_BASE или как ты там это назвал.
В таком виде будет как раз определение USB.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 01:21 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
хм. сделал так
#define EPBufTable ((USBLIB_EPBuf *)(USB_PBUFFER))
#define USBEP ((uint32_t *)(USB_BASE))
но нет, видимо не так...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 01:37 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
USBEP можно сразу приравнять к USB_BASE, потому что они сразу первые и идут с этого адреса..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 01:49 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
чото не выходит.
решил попробовать зайти с другой стороны. тут вот подобная же ошибка. предлагают без at использовать section, но для этого надо в линкер-скрипте прописать этот самый section.
порылся в сеггере, в структуре проекта - ничего похожего не нахожу. и уж тем более хз как это прописывать.
https://answers.launchpad.net/gcc-arm-e ... ion/254567


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 05:56 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3569
Откуда: Китай, Пекин
Eddy_Em у тебя повсюду только один polling код, а бывает ли облагороженный, не HAL, USB_CDC код, но такой чтобы на прерываниях, колбэках? а I2C ?

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 09:53 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
I2C у меня только в одной медленной железке, даже дел с ним иметь не хочу. А вот с CDC есть планы переделать на неблокирующую отправку данных с циклическим буфером.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 11:36 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3569
Откуда: Китай, Пекин
я это подозревал...

так это что жЭж получается.... HAL не такой уж и "кал", если может это всё прямо сейчас и прям искаропки?
про ethernet ваще не спрашиваю..

_________________
unirail.org


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 11:49 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1557
goreprogrammist писал(а):
предлагают без at использовать section, но для этого надо в линкер-скрипте прописать этот самый section.
Не надо пытаться разместить буфер по адресу. Работай по указателю. Это будет и проще, и совместимее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 13:05 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
так это весь код перелопачивать придется?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 15:27 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
а еще у автора проекта следующие строки в сопроводилове:

It's strongly recomended to use 1,5K GPIO driven pull-up rezistor to have full controll of USB line initiate sequence.
Call USBLIB_Init(); to enable USB and make initial configuration of USB registers. Please note - USBLIB_Init(); will trigget USB RESET sequence.
Enable 1.5K pull-up resistor to allow host detect device connection.

речь о том, чтобы в коде включать? или о внешнем?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 17:44 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1557
goreprogrammist писал(а):
так это весь код перелопачивать придется?
Зачем? Что изменится в коде, если разместить в памяти массив или просто указатель?
Код:
struct EP_BUF_DSCR
{
  PMA_WIDTH ADDR_TX;
  PMA_WIDTH COUNT_TX;
  PMA_WIDTH ADDR_RX;
  PMA_WIDTH COUNT_RX;
};

volatile EP_BUF_DSCR * const ep_buf_dscr = (EP_BUF_DSCR *)USB_PMAADDR;

ep_buf_dscr[0].ADDR_TX = EP0_ADDR_TX;
ep_buf_dscr[0].COUNT_TX = 0;
ep_buf_dscr[0].ADDR_RX = EP0_ADDR_RX;
ep_buf_dscr[0].COUNT_RX = EP0_SIZE_RX;
И никаких танцев с линкером и бубном.

goreprogrammist писал(а):
речь о том, чтобы в коде включать? или о внешнем?
У 103-го нет внутреннего резистора. Только внешний. Внешний можно подключить на VCC постоянно и дёргать каждый раз разъём для переинициализации, а можно подключить на лапу контроллера и программно отключатся/подключаться к шине.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 18:50 
Старожил

Зарегистрирован: 19 мар 2011, 05:05
Сообщения: 2955
хз. так ругается - как будто не видит описания структуры.

unknown type name 'EP_BUF_DSCR'

странно.

но тут еще одну штуку выяснил.

попробовал в коде сделать так:
volatile uint32_t * const ep_buf_dscr = (uint32_t *)0x40006000;

и вот такое получаю:
arm-none-eabi-nm usblib.o | grep ep_buf_dscr
00000000 R ep_buf_dscr

хотя предполагал увидеть другое число.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 19:07 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4729
Откуда: КЧР, поселок Нижний Архыз
cheblin писал(а):
так это что жЭж получается.... HAL не такой уж и "кал", если может это всё прямо сейчас и прям искаропки?
про ethernet ваще не спрашиваю..

Если тебе хочется "хуяк-хуяк - и в продакшн", можешь спокойно калом пользоваться. А если нужно поддерживать в дальнейшем, то нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопросы про Си
СообщениеДобавлено: 01 фев 2020, 19:48 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 3569
Откуда: Китай, Пекин
Цитата:
А если нужно поддерживать в дальнейшем, то нет.

поддерживать в дальнейшем что? что вместо HAL ? дырка от бублика?
нет же никакого другого не HAL кода USB на прерываниях.

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

USB и без того весьма затратная хрень, чтобы дрючить проц постоянным polling - ом.

короче - ясно, понятно с HAL - хэйтерами.
насрать на шахматную доску - это могут, а предложить в замен нечего.

_________________
unirail.org


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 199 ]  На страницу 1, 2, 3, 4, 5 ... 8  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB