Змінюй хід війни! Допомагай ЗСУ!

Программирование ARM. Eclipse, Keil,IAR,CooCox - всё сюда.

🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #321
лучше бы стек фреймы меняло за 2-3 цикла :D и регистров поменьше, шоб они все в озу огранизовывались, типа базовый рег - от него считается все остальное.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #322
лучше бы стек фреймы меняло за 2-3 цикла :D и регистров поменьше, шоб они все в озу огранизовывались, типа базовый рег - от него считается все остальное.

Нахрен вообще ОЗУ?
ОЗУ надо выполнить на регистрах.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #323
нахрен регистры. все на озу. контекст задачи задал двумя регистрами- начало конец области. а в ней уже регистровый файл и стек с указателем. указатель в озу, т.к. такой же регистр :rolleyes:
регистровый файл "резиновый", может иметь не 16 а 8 или 32 регистра
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #324
нахрен регистры. все на озу. контекст задачи задал двумя регистрами- начало конец области. а в ней уже регистровый файл и стек с указателем. указатель в озу, т.к. такой же регистр :rolleyes:
регистровый файл "резиновый", может иметь не 16 а 8 или 32 регистра

Нафиг вообще тогда регистровый файл?
Все операции должны быть равноценны и иметь доступ к любой ячейке памяти. Как mov, так и st/ld. А лучше - вообще мультиплексор, чтобы можно было один фзический блок адресов заменить за 3 такта другим блоком адресов равноценной длины, просто поменяв их адресами.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #325
А лучше - вообще мультиплексор, чтобы можно было один фзический блок адресов заменить за 3 такта другим блоком адресов равноценной длины, просто поменяв их адресами.
Микрочиповская архитектура банков регистров? Фу фу фу
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #326
Микрочиповская архитектура банков регистров? Фу фу фу

Нет. Без всяких банков.
Формируешь память с адраса 0х00001000 по адрес 0х00001111, а потом пишешь код в мультиплексор и блок памяти с записанными данными меняется местами с 0х00002000 по 0х00002111 :) Видеопямять так хорошо организовывать. Функции маслают в одну и ту же область, которая по синхре меняется с другой областью. А функции продолжают маслать.
Это даже не DMA :) Это как в видяхе, только круче. В видяхе 3 банка - один воспроизводится, второй стоит на стрёме полный, в третий - активно пишут. И там меняется смещение на вывод, а я предлагаю менять не смещение, а местами куски памяти. Физические.



Задачка, бля, на ночь от кейла:

USB не работает.
Дано:
* @File : usbd_cdc_if.c

Код:
/* USB handler declaration */
/* Handle for USB Full Speed IP */
  USBD_HandleTypeDef  *hUsbDevice_0;

/** @defgroup USBD_CDC_IF_Exported_Variables
  * @{
  */ 
  extern USBD_HandleTypeDef hUsbDeviceFS;

[I]uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)[/I]
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */ 
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
  [I]if (hcdc->TxState != 0){
    return USBD_BUSY;
  }[/I]
  USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
  result = USBD_CDC_TransmitPacket(hUsbDevice_0);
  /* USER CODE END 7 */ 
  return result;
}

Где:
typedef struct
{
uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE/4]; /* Force 32bits alignment */
uint8_t CmdOpCode;
uint8_t CmdLength;
uint8_t *RxBuffer;
uint8_t *TxBuffer;
uint32_t RxLength;
uint32_t TxLength;

__IO uint32_t TxState;
__IO uint32_t RxState;
}
USBD_CDC_HandleTypeDef;

Так вот.
В месте
if (hcdc->TxState != 0){
return USBD_BUSY;
}
функции uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
--- происходит хардфаулт.

Шозанах? У меня уже глазья слипаются.

P.S. Инициализация проходит успешно.
Порт виден и коннектится.
 
Останнє редагування:
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #327
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #328
там уже ld st не нужны :D:D:D

ну хз. косвенная адресация, push|pop или пред-пост инкременты добавляют тактов маманегорюй.

Так не используй. Я имел в виду, что не должно быть разделения на ОЗУ и регистры вообще. Любая ячейка памяти должна быть доступна любым из способов. Хочешь - как регистр, хочешь - как ОЗУ.
Ну, и мультиплексор блоков вместо ДМА...

А ещё МК должен быть 16-битным (8 явно мало, а 32 не обязательно), иметь 1МБ флэша и 1МБ ОЗУ.
И всё, можно оставить 2 модели микроконтроллеров, ту, что 1+1+около 100 выводов,
и тини, типа 512кБ, + 256кб и 48 ног.

Причем, периферия в обоих должна быть в полном составе, а пины периферии - мапиться изначально. То есть - ни каких железных привязок кроме кварца и питания.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #329
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #330
Я имел в виду, что не должно быть разделения на ОЗУ и регистры вообще.
Типа как в 51-м кристале? Там ST/LD нет, а разновидностей mov'ов ебетник.


на уровне чуть выше асма - уже никакого разделения нету. Такшта.
Почему нету? Спецификатор register позволяет запердолить переменную в РОН насильно. Ну по крайней мере так делает компилятор Кодвижна. На других архитектурах не знаю.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #331
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #332
Задачка, бля, на ночь от кейла:

USB не работает.
Дано:
* @file : usbd_cdc_if.c

Код:
/* USB handler declaration */
/* Handle for USB Full Speed IP */
  USBD_HandleTypeDef  *hUsbDevice_0;

/** @defgroup USBD_CDC_IF_Exported_Variables
  * @{
  */ 
  extern USBD_HandleTypeDef hUsbDeviceFS;

[I]uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)[/I]
{
  uint8_t result = USBD_OK;
  /* USER CODE BEGIN 7 */ 
  USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
  [I]if (hcdc->TxState != 0){
    return USBD_BUSY;
  }[/I]
  USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
  result = USBD_CDC_TransmitPacket(hUsbDevice_0);
  /* USER CODE END 7 */ 
  return result;
}

Где:


Так вот.
В месте
if (hcdc->TxState != 0){
return USBD_BUSY;
}
функции uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
--- происходит хардфаулт.

Шозанах? У меня уже глазья слипаются.

P.S. Инициализация проходит успешно.
Порт виден и коннектится.

Чем занимается pClassData()?
И почему бы не использовать что-то типа
u8* src = ...
u8 len = ...
UserToPMABufferCopy( src, ENDP1_TXADDR, len );
// говорим, сколько символов на передачу
SetEPTxCount(ENDP1, len);
// запускаем передачу
SetEPTxValid(ENDP1);
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #333
Чем занимается pClassData()?
И почему бы не использовать что-то типа
u8* src = ...
u8 len = ...
UserToPMABufferCopy( src, ENDP1_TXADDR, len );
// говорим, сколько символов на передачу
SetEPTxCount(ENDP1, len);
// запускаем передачу
SetEPTxValid(ENDP1);

Понятия не имею чем он занимается, это часть инстанса, сейчас залезу на машину - заскриню дебагер.

Так не сделать потому, что это - готовый автогенерёный код от STMCubeMX, и в кубе его именно так сделали.

Не, что-то сделать с ним полюбому надо, но у части людей код работает, а у части - нет. И нифига не понятно в чем причина.
Распотрошить её до регистров, конечно, можно, но тогда теряется весь эффект от кодогенератора.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #334
ХЕЗ,куб может быть и приятная вещь,но все-же не панацея. За тебя он код не напишет. А то,что в ST MCD application team сидят,мягко говоря,веселые ребята - удивляться не приходится. Свой усб сдс запускал с нуля дня 3 :(
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #335
Собсно вот откуда вываливается в фаулт.
faultOrig.png




hcdc - указатель на стандартную структуру ЮСБ, как приведен выше
typedef struct
{
uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE/4]; /* Force 32bits alignment */
uint8_t CmdOpCode;
uint8_t CmdLength;
uint8_t *RxBuffer;
uint8_t *TxBuffer;
uint32_t RxLength;
uint32_t TxLength;

__IO uint32_t TxState;
__IO uint32_t RxState;

этому указателю присвоили указатель на hUsbDevice_0->pClassData

Сам по себе hUsbDevice_0 это вот что:
/* USB handler declaration */
/* Handle for USB Full Speed IP */

USBD_HandleTypeDef *hUsbDevice_0;
/* USER CODE BEGIN PRIVATE_VARIABLES */
/* USER CODE END PRIVATE_VARIABLES */


Давайте их сравним:
USBD_CDC_HandleTypeDef *hcdc =
и
USBD_HandleTypeDef *hUsbDevice_0;

Я не понял пока, что они вообще хотели этим сказать...

Но после каждого обращения к hcdc - трындец и хардфаулт.
Я коментирую обращение - трассируется дальше без той проверки, но в USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len); дальше - есть обращение к hcdc
uint8_t USBD_CDC_SetTxBuffer (USBD_HandleTypeDef *pdev,
uint8_t *pbuff,
uint16_t length)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;

hcdc->TxBuffer = pbuff;
hcdc->TxLength = length;

return USBD_OK;
}
и вместо return USBD_OK; - происходит хардфаулт.

hcdc в ватче и калл стек локейшене висит с локейшеном <not in scope>

Похоже куборезы перемудрили сильно.



USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;

Как можно указателю на USBD_CDC_HandleTypeDef присвоить значение указателя на USBD_HandleTypeDef->pClassData, явным присвоением типа...
если pClassData НЕ ЯВЛЯЕТСЯ структурой USBD_CDC_HandleTypeDef, а является сам указателем тна тип void:

USBD_SetupReqTypedef request;
USBD_DescriptorsTypeDef *pDesc;
USBD_ClassTypeDef *pClass;
void *pClassData;
void *pUserData;
void *pData;

"Ну нахуя же так?"(С)народ.



Свой усб сдс запускал с нуля дня 3 :(
А на каких библиотеках запускал?
Или олдфажно - регистрами и руками?

Блядь, если запустить эхо прямо в обработчиках - эхо работает нормально до... момента, пока не передастся 5 байт в пакете. Система-то 32-битная, а (я щас посмотрю, но кажись - там буфер длиной в 1 получается... 1 int, куда 4 байта ровно и влазит).



Понял я одну важную вэсчЪ - ОБЯЗАТЕЛЬНО надо снабжать МК педальным управлением подвеской 1,5кОм для ЮСБ.

Он, сволочь, это видно в дебаге - если брекпоинт стоит и по какой-то причине операция коннекта не случилась, или ещё какая-то затыка - начинает упорото впрыгивать в прерывание USB и пытаться про инициализироваться.
Однако - поезд ушел, без управления подвеской он компутеру ни чего уже сказать не может - тот его не слушает и порт висит с восклицатльным знаком до отключения.
 
Останнє редагування:
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #336
стек смотрел?
(0x2214FB02) - четта цифирь охуенно большая, оч. похожая на бит-банд регион.
внешней памяти нету?
во вторых. шоза йобань?
hUsbDevice_0 это у нас указатель? так он NULL :пиво:
проздравляю.
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #337
стек смотрел?
(0x2214FB02) - четта цифирь охуенно большая, оч. похожая на бит-банд регион.
внешней памяти нету?
во вторых. шоза йобань?
hUsbDevice_0 это у нас указатель? так он NULL :пиво:
проздравляю.

Внешней памяти нет.
Ты не меня поздравляй - ты "то,что в ST MCD application team сидят,мягко говоря,веселые ребята"(C)ur4lvn
лучше поздравь - это их код из коробки. Я специально создал свежий проект, где нет ни хрена - даже пауза программная, и та - коробочная из HAL. Ни чего лишнего - один USB.



Проверку на !NULL я конечно ставил - а хули с неё толку, там же инстанс не появится по мановению волшебной палочки и данные не примутся от этого.

Вынужден констатировать: это ёбаный косяк.
Очередной, блядь, ёбаный косяк в библиотеках от ST для работы с USB.

А ещё я хочу посмотреть в глаза пользователям, которые говорят "а у меня всё работало"(С)
У них, блядь, или куб какой-то другой, или они немного пиздят.

Вот точно такое у людей было:

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


приглушеный мат из зала:
всем здравствуйте. Нужна помощь с генерировал по статье код для MDK-ARM v5 stm32l152 выдает предупреждение
..\Src\main.c(97): warning: #223-D: function «CDC_Transmit_FS» declared implicitly
//----------------------------
если во время подключения к ПК принять через ком порт данные и, закрыв соединение, отключить провод, то иногда при повторном подключении устройство улетает в HARDFAULT_handler из функции USBD_CDC_DeInit через функцию USBD_free(pdev->pClassData);
может, кто то сталкивался???
...
сам решил проблему:
в файле usbd_conf надо закоментить 494 строку
//free(p); проблема сразу решилась и без плясок с бубном как на видео
//-----------------------------
лрическое отступление:
ААААААААААААААААААААА!
#define APP_RX_DATA_SIZE 4
#define APP_TX_DATA_SIZE 4

Блядь, они шо ебанутыенахуйблядь? Запускаю эхо - хардфаулт при передачи 5 байт. По 4 - работат. Я выше писал, шо заподозрил 1 int? Хуйня - я был не прав. ВОТ ОНО ГДЕ!
Почему они не пишут в файле кто писал? Мне нужно имя. Я хочу знать кому надо сломать руку.
Там же, оказывается, есть ДВА места, где задается буфер!!
Интересно, а кому я в настройках его задаю? Кому он в сетапе стоит?
#define CDC_DATA_HS_MAX_PACKET_SIZE 64 нахуя? проверять, что я первый дефайн не поставил больше, чем второй? И как я должен догадаться, что где-то в глубине глубин файла, сука .С!! С, карл! Не .h! есть ещё 2 дефайна в 62 и 63 строке... а вокруг - никого, и ещё строк через 60 - массивы, которые пользуют эти дефайны. Ну почему не в usbd_def?
"пидорасы, сэээр"(С)
Продолжаем приглушеный мат из зала
У меня проблема решилась уменьшение максимального размера пакета с
512 до 64
#define CDC_DATA_HS_MAX_PACKET_SIZE 64
тоже лулзовато, это должно в зависимости от камня считаться ещё в кубе
щоб проект запрацював, треба у функції CDC_Transmit_FS змінну UserTxBufferFS змінити на Buf і плюс до того, якщо 64б віндовс, то у стартапі проекту змінити Stack_Size EQU 0x00004000 та Heap_Size EQU 0x00002000. А так все працює. Дякую.
Вот это я не понял, но проверил. Там и так Buf (может куб более старой версии был с таким глюкалом), а стек и куча не спасают от хардфаулта.

И, как водится, автор статьи и мощного кода
HAL_Delay(1000);
CDC_Transmit_FS(testDataToSend, 8);
который ни у кого не работает:
Но вообще странно, что у многих людей возникает эта ошибка, у меня на большом количестве разнообразных плат никогда такого не было.

Блядь, он точно запускал этот свой код из 2х строчек?
 
Останнє редагування:
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #338
Код:
 USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
это вызов функции которая лежит в поле pClassData конкретного экземпляра хэндла типа USBD_HandleTypeDef. Этот хэндл создан?

usb запускал на либе stm32_usb-fs-device_driver.

подтяжка к плюсу говорит ОСи,с чем она имеет дело - если подтянута USBDP - FS device, если USBDM - LS device
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #339
У Кейла есть обработчик эксепшна обращения по нулевому указателю. Так сто while(1) искать надо там. :)

Не понял, а зачем Паша сам себя забанил? Или это такая подъебка забанившего его модератора?
 
  • 🔴 21:27 Повітряна тривога в м. Харків та Харківська територіальна громадаСлідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #340
У Кейла есть обработчик эксепшна обращения по нулевому указателю. Так сто while(1) искать надо там. :)

Не понял, а зачем Паша сам себя забанил? Или это такая подъебка забанившего его модератора?

Может решил, что и в субботу заниматься ARM-ом - это диагноз и решил хоть воскресенье отдохнуть?

Там же в главном появилась будка самовыпиливания из футурамы :)

Код:
 USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
это вызов функции которая лежит в поле pClassData конкретного экземпляра хэндла типа USBD_HandleTypeDef. Этот хэндл создан?
Да хрен жеж его знает - код-то не мой :D
Нет, не создан он
во вторых. шоза йобань?
hUsbDevice_0 это у нас указатель? так он NULL :пиво:
проздравляю.

usb запускал на либе stm32_usb-fs-device_driver.

подтяжка к плюсу говорит ОСи,с чем она имеет дело - если подтянута USBDP - FS device, если USBDM - LS device
Ыыы, про подтяжки я знаю. Подтяжка к плюсу, прежде всего, говорит, что девайс ФТЫКНУТ.
Если с девайсом произошло что-то и комп поставил в диспетчере на него треугольничек желтый - надо дёргать его руками.
Однако же, девайс предполагается быть немного закрытым и дёргать руками может не сростись.

Посему в таких случаях - девайс оснащают 1,5кОм, подвешенными не к 5V, а к ножке, или транзистору, управляемому ножкой.
Можно организовать эдакий вачдог - если косяки со связью с портом - девайс отключает себя от USB на пару секунд, а потом включает. Вот таким образом это и делают, комп не только тип устройства по скорости, но и вообще устройство так понимает, что воткнуто.
 
Назад
Зверху Знизу