_pasha
P
- 🔴 10:02 Повітряна тривога в Харків.обл.
- #321
лучше бы стек фреймы меняло за 2-3 цикла
и регистров поменьше, шоб они все в озу огранизовывались, типа базовый рег - от него считается все остальное.

Перегляньте відео нижче, щоб дізнатися, як встановити наш сайт як веб-програму на головному екрані.
Замітка: Для цієї функції наразі потрібен доступ до сайту за допомогою вбудованого браузера Safari.
лучше бы стек фреймы меняло за 2-3 циклаи регистров поменьше, шоб они все в озу огранизовывались, типа базовый рег - от него считается все остальное.
нахрен регистры. все на озу. контекст задачи задал двумя регистрами- начало конец области. а в ней уже регистровый файл и стек с указателем. указатель в озу, т.к. такой же регистр
регистровый файл "резиновый", может иметь не 16 а 8 или 32 регистра
Микрочиповская архитектура банков регистров? Фу фу фуА лучше - вообще мультиплексор, чтобы можно было один фзический блок адресов заменить за 3 такта другим блоком адресов равноценной длины, просто поменяв их адресами.
Микрочиповская архитектура банков регистров? Фу фу фу
/* 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;
там уже ld st не нужныКак mov, так и st/ld.
там уже ld st не нужны
ну хз. косвенная адресация, push|pop или пред-пост инкременты добавляют тактов маманегорюй.
на уровне чуть выше асма - уже никакого разделения нету. Такшта.Я имел в виду, что не должно быть разделения на ОЗУ и регистры вообще.
Типа как в 51-м кристале? Там ST/LD нет, а разновидностей mov'ов ебетник.Я имел в виду, что не должно быть разделения на ОЗУ и регистры вообще.
Почему нету? Спецификатор register позволяет запердолить переменную в РОН насильно. Ну по крайней мере так делает компилятор Кодвижна. На других архитектурах не знаю.на уровне чуть выше асма - уже никакого разделения нету. Такшта.
та есть оно во всех сях.Спецификатор register
Задачка, бля, на ночь от кейла:
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);
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;
и вместо return USBD_OK; - происходит хардфаулт.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;
}
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
USBD_SetupReqTypedef request;
USBD_DescriptorsTypeDef *pDesc;
USBD_ClassTypeDef *pClass;
void *pClassData;
void *pUserData;
void *pData;
А на каких библиотеках запускал?Свой усб сдс запускал с нуля дня 3![]()
стек смотрел?
(0x2214FB02) - четта цифирь охуенно большая, оч. похожая на бит-банд регион.
внешней памяти нету?
во вторых. шоза йобань?
hUsbDevice_0 это у нас указатель? так он NULL
проздравляю.
лрическое отступление:всем здравствуйте. Нужна помощь с генерировал по статье код для 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); проблема сразу решилась и без плясок с бубном как на видео
//-----------------------------
тоже лулзовато, это должно в зависимости от камня считаться ещё в кубеУ меня проблема решилась уменьшение максимального размера пакета с
512 до 64
#define CDC_DATA_HS_MAX_PACKET_SIZE 64
Вот это я не понял, но проверил. Там и так Buf (может куб более старой версии был с таким глюкалом), а стек и куча не спасают от хардфаулта.щоб проект запрацював, треба у функції CDC_Transmit_FS змінну UserTxBufferFS змінити на Buf і плюс до того, якщо 64б віндовс, то у стартапі проекту змінити Stack_Size EQU 0x00004000 та Heap_Size EQU 0x00002000. А так все працює. Дякую.
Но вообще странно, что у многих людей возникает эта ошибка, у меня на большом количестве разнообразных плат никогда такого не было.
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
У Кейла есть обработчик эксепшна обращения по нулевому указателю. Так сто while(1) искать надо там.
Не понял, а зачем Паша сам себя забанил? Или это такая подъебка забанившего его модератора?
Да хрен жеж его знает - код-то не мойэто вызов функции которая лежит в поле pClassData конкретного экземпляра хэндла типа USBD_HandleTypeDef. Этот хэндл создан?Код:USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDevice_0->pClassData;
во вторых. шоза йобань?
hUsbDevice_0 это у нас указатель? так он NULL
проздравляю.
Ыыы, про подтяжки я знаю. Подтяжка к плюсу, прежде всего, говорит, что девайс ФТЫКНУТ.usb запускал на либе stm32_usb-fs-device_driver.
подтяжка к плюсу говорит ОСи,с чем она имеет дело - если подтянута USBDP - FS device, если USBDM - LS device