Ви використовуєте застарілий браузер. Цей та інші сайти можуть відображатися в ньому некоректно. Необхідно оновити браузер або спробувати використовувати https://www.google.com/chrome/
Программирование ARM. Eclipse, Keil,IAR,CooCox - всё сюда.
Дело в том, что это ни какой не вызов.
По формату это - объявление hcdc с типом указателя на USBD_CDC_HandleTypeDef.
и больше это ни на что не похоже.
Этому указателю присваивают (прямым приведением типа*) значение, которое должно лежать в hUsbDevice_0->pClassData;
НО!
USBD_CDC_HandleTypeDef - структура! Не функция!
А hUsbDevice_0->pClassData - действительно имеет тип void*, вот только там нет значения. Там 0 лежит на момент обращения.
И ни какой он не вызов, так как аффтары потом делают так: if (hcdc->TxState != 0)
То есть, аффтары, как бы, подозревают, что там, по указателю, должна находиться структура, в которой есть поле TxState.
Но для этого, её адрес должен лежать в hUsbDevice_0->pClassData.
А ТАМ ЛЕЖИТ ЭТО!
И вообще, они косанули с этим присвоением...
Я думал, что это от оптимизации, но
volatile USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
Value - <ot in scope> struct <untagged>*
Вот и вся пэстня.
Вся эта возня - чтобы узнать, не занят ли USB.. Есть идеи как ещё это сделать?
//-------------------------------------------
Да!
Косяк внятен - не проверяется наличие инициализации USB перед передачей.
Дело в том, что когда я принимаю ресив - это вообще может случиться только при инициализированном USB. Иначе у меня зависнет терминал - и всё.
А вот структурка существует только тогда, когда USB инициализирован.
Поскольку, висящий в девайсах порт, ещё не говорит о том, что девайс о нем чего-то знает, и что там вообще с девайсом хаб не имеет понятия (а я писал уже - он понимает отключение/подключение только по резистору в 1,5к к шине), то перепрошитый и не иниченный контроллер - не виден хабу.
Контроллер же не получает инициализацию, так как хабу и так всё ясно.
Получается коллизия. Выходит, что для корректной работы девайс просто обязан сам уметь отключаться и подключаться к USB.
Иначе это, как минимум, затруднит отладку (вот как мне), а как максимум - приведёт к незапланированному драчению юзером порта.
А если порт припаять вообще (как собираюсьэто сделать я ), или спрятать внутрь прибора - тут уже без диспетчера устройств не обойтись.
Вывод - в понедельник добавлю управление подвеской.
Через TeamViewer паять неудобно.
Алгоритм без вкусностей - такой.
Прошиваем МК.
Порт не меняет значения - если он был в винде, то он там и остается.
Это - ложь. Нет там ни какого порта.
Удаляем устройство, не забыв скипануть и не удалить драйвера.
Нет устройства. МК прошит.
Запускаем дебагер с брейком, или просто в стопрежиме, чтобы он стоял перед инициализацией.
Говорим винде - обновить устройства - и она начинает искать.
В это время отпускаем дебагер в run - вуаля! Всё работает!
Это я так делаю потому, что тимвьюер, а не личное присутствие. Не удобно мне строчить на форум и плату отлаживать - она под руками путается, по этому остается в другом месте ночевать
P.S> Косяк с хардфаултом - предательский, конечно... могли бы и проверять не только сам USB, что писать туда можно, но и что структура создана.
//------------------------
Ааааалилуйя.
Помните, я писал про жлобский J-Link, который понял, что он пиратский и провалялся у меня с год в бездействии?
Так вот - он ожил!
Фтыкнулся в кейл, попробовал зашить камень, был оплёван и унижен за старую дырявую прошивку, обновился и работает!
Во. Терь у меня есть чем работать пока едет второй ST-link и ремонтируется первый.
параллельная история. libopencm3
читаю значение пина ихними средствами блеать, оно в нулях!!! я никогда не мог подумать, что в этом месте может быть косяк. а сижу с этой хуйней уже часов с 9 кругом враги терь разбираться в чем дело, но не напишешь p GPIOB->IDR пушо там всё через жопу
ЗЫ
оказалось банально не включил клок. но суууука догадаться об этом сложно, пушо наглядности ноль
параллельная история. libopencm3
читаю значение пина ихними средствами блеать, оно в нулях!!! я никогда не мог подумать, что в этом месте может быть косяк. а сижу с этой хуйней уже часов с 9 кругом враги терь разбираться в чем дело, но не напишешь p GPIOB->IDR пушо там всё через жопу
Напиши паралельно и ихними и через регистр. Доступ к регистрам быть обязан, их можно найти в lowlewel драйверах, или что там в опенцм есть снизу.
P>S> Видимо, хорошо, что я не повёлся на нахваливание опенцм и продолжил ковырять HAL Тут таких проблем нет. Есть другие, но раскапывать. видимо, проще
Я в этом проекте буду пилить HAL, так как уже всунул туда жало и он работает. Есть плюсы и минусы.
Но потом я на свой ограничительный перечень, видимо, сползу на непортабельные личные либы, основанные на периферии.
Всей линейкой от f1 по f7 я всё равно пользоваться не буду (мне жизни не хватит под каждый камень по проге писнуть, ибо их дохерища), но вижу возможность офигенно сэкономить память. Кил 10, не менее. Ибо голый HAL проект жрёт сразу в среднем 12-15 кБ. Шоправда, при продолжении уже юзерской писанины - код не растет стремительно и на большинство случаев HAL будет устраивать.
P.S. С прерываниями они, конечно, поступили жестоко. По умолчанию обработчики разные, но HAL обернул их в свои функции и разбирает внутри прерывания по SR кто плюнул. ИМХО - это первое от чего я избавлюсь посвободке.
а шо тама непортабельного , ащета?
я перешел на другую парадигму.
пишу всю конкретику в main() потому что он у нас один - получается как раз для этих дел.
остальное висит где-то далекооооо и ниче не знает про остальные муки.
и еще newlib- это что-то, под названием нуегонах.
вся нужная часть stdlib обеспечивается __builtin_xxxx
и там все в порядке с реализацией. пока.
Вот нахуя забивать на инициализацию массива?
Он есть... массив...
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
Педерасты вообще понимают, что там валяется в этой pClassData до момента вызова этой функции и, что проверить потом была эта функция или нет вызвана, можно только 2-мя способами:
1. Проклясть их и допедалить им в код структуры флаг коннекшена
2. Извращаться.
?
Ну обращайся ты к содержимому, оно хоть по умолчанию обнуляется при старте, нет... они инициализируют УКАЗАТЕЛЬ в СРЕДИНЕ кода!!!
Дебилыблядь(С)какая-то грустная русская лошадь.
Того, кто так сделал - надо сослать в Воронеж и разбомбить кхуям.
P.S. Так что, HAL реабилитирован по этому эпизоду.
Пиздец кроется в
usbd_cdc_if.c
А он не относится к HAL. Это из состава usb____FS.lib
А ты тож ебался с этой инициализацией, или проскочил как-то?
Как ты вообще определяешь подключен у тебя порт к хабу, или нет? В stm32_usb-fs-device_driver есть такой косяк? Потому как STM тащит чужие либы для usb со времен этой самой usb-fs, которая была со времен начала кокоса, где она есть даже в репозитарии.
Чисто для юмора - А он - не NULL Смекаешь?
Это static! Его бессмысленно на NULL проверять - он не будет им никогда
Если так делать - надо содержимое проверять, а не null, поскольку там блядь мусор! А на него ссылаются.
И я вообще не понимаю нахуя объявлять 2 простых одномерных массива и обращаться к ним:
*через поле структуры, типа - указатель на void.
* в котором лежит указатель на struct.
*и чтобы это понять - его явно приводят к типу путём (имяСтруктуры *).
*само это поле принадлежит static структуре,
которое копируется в ОБЫчную структуру (ТОЧНО ТАКУЮ! И нахуя она при наличии базового static такого же объекта - знает только тот даун, который писал) без volatile (то есть, что там валяется в содержимом до вызова - ни кто не знает вообще)
*причем, значение в это поле (pClassData) заносится только при подключении к девайсу ХАБА (не питания! Хаба! То есть - и программно тоже удалить/обновить)
*А при попытке передачи проверяется не факт инициализации значением, а само значение по указателю!
* что неминуемо вызывает или порчу данных в ОЗУ, или (как у меня) - hardfault потому как там число лежит охуенное и далеко за пределы памяти показывает.
через поле структуры, типа - указатель на void.
* в котором лежит указатель на struct.
*и чтобы это понять - его явно приводят к типу путём (имяСтруктуры *).
*само это поле принадлежит static структуре,
которое копируется в ОБЫчную структуру (ТОЧНО ТАКУЮ! И нахуя она при наличии базового static такого же объекта - знает только тот даун, который писал) без volatile (то есть, что там валяется в содержимом до вызова - ни кто не знает вообще)
*причем, значение в это поле (pClassData) заносится только при подключении к девайсу ХАБА (не питания! Хаба! То есть - и программно тоже удалить/обновить)
*А при попытке передачи проверяется не факт инициализации значением, а само значение по указателю!
* что неминуемо вызывает или порчу данных в ОЗУ, или (как у меня) - hardfault потому как там число лежит охуенное и далеко за пределы памяти показывает.
да то понятно. писатели сферических коней все делают хендлами пушо думают что у камня может появиться больше одного усб и либа останется на задворках. а так оппаньки, строчку добавил - и всьо в ажуре
По звуку , винда звенит по-разному.Так же по звуку можно услышать и хардфолт.
В stm32_usb-fs-device_driver есть такой косяк? Потому как STM тащит чужие либы для usb со времен этой самой usb-fs, которая была со времен начала кокоса, где она есть даже в репозитарии.
да то понятно. писатели сферических коней все делают хендлами пушо думают что у камня может появиться больше одного усб и либа останется на задворках. а так оппаньки, строчку добавил - и всьо в ажуре
Так хоть бы они проверяли свои хэндлы, суки! Как можно без проверки брать значение из поля структуры, если оно не заносится туда по дефолту и не имеет контрольного значения, говорящего, что оно - лажа?
Это ж, сцуко, сюрреализм какой-то.
//----------------------- включил всю периферию кроме CAN по одной штуке -----------
Program Size: Code=14994 RO-data=286 RW-data=380 ZI-data=11364
Теперь известно сколько памяти занимает куб со старта в общем случае для STM32F103
Включены:
GPIO
RCC
CRC
SPI2
USART1
USART3
SPI1
ADC1
USB_FS(CDC)
SYSTICK
TIMER1
P.S. Ну, и DMA 5 каналов настроены, на USARTы и мем-мем
mem-to-mem - часто нужно.
Я в USB его юзаю. ТАм нет DMA периф-ту -мем для USB. И в либах нет очереди - просто затираемый буфер.
В данном случае - самое то. По прерыванию я влетаю в обработчик, из него виден приемный буфер USB. Задача - забрать приемный и освободить приемник как можно быстрее и проще.
Ну что может быть проще, чем ткнуть буфер в нос DMA и сказать - делай.
Не memcpy() же вызывать.
P.S. А тебе куда он пригодился? (я раньше ещё на CAN его юзал - манал я разгребать регистры, он мне в массив тащил фрейм, там я его разбирал. Но, на AT91SAM7 там это периф-ту-мем делал.
ммм... зачем через syscfg? Там должно быть 1,5кОм. На сколько я понял - сам кирпич так не умеет. Или я чего-то не понял. Повесил тупо на пин - девайс теперь не надо смыкать с разъёма, можно детектить, что отвалилось USB и переподключаться