Dziś w jednym z projektów postanowiłem włączyć profilaktycznie funkcję którą dodałem ostatnio do mojego RTOSa - sprawdzanie czy niektóre funkcje nie są używane w przerwaniu (m.in. mutexy, których użycie w przerwaniach jest błędem logicznym). No i co się okazuje? Że albo ja coś źle zrobiłem, ale programiści firmy ST w swojej bezkresnej mądrości stwierdzili, że przerwanie to jest świetne miejsce do alokowania pamięci przez malloc()...
Wniosek taki nasunął mi się po pierwszym spojrzeniu na callstack:
Widzimy tam następującą sekwencję:
- przerwanie OTG_FS_IRQHandler(),
- funkcja HAL_PCD_IRQHandler(),
- funkcja HAL_PCD_SetupStageCallback(),
- funkcja USBD_LL_SetupStage(),
- funkcja USBD_StdDevReq(),
- funkcja USBD_SetConfig(),
- funkcja USBD_SetClassConfig(),
- wywołanie funkcji spod wskaźnika Init w strukturze USBD_ClassTypeDef.
Wskaźnik "Init" w strukturze USBD_ClassTypeDef inicjalizowany jest funkcją USBD_CDC_Init(), która praktycznie na samym początku wywołuje malloc() poprzez makro USBD_malloc().
Teraz pytanie zasadnicze - czy ja coś zrobiłem źle czy może jednak ludzie z ST są... hmm... jakby to powiedzieć... "niezbyt mądrzy"?
Wniosek taki nasunął mi się po pierwszym spojrzeniu na callstack:
Widzimy tam następującą sekwencję:
- przerwanie OTG_FS_IRQHandler(),
- funkcja HAL_PCD_IRQHandler(),
- funkcja HAL_PCD_SetupStageCallback(),
- funkcja USBD_LL_SetupStage(),
- funkcja USBD_StdDevReq(),
- funkcja USBD_SetConfig(),
- funkcja USBD_SetClassConfig(),
- wywołanie funkcji spod wskaźnika Init w strukturze USBD_ClassTypeDef.
Wskaźnik "Init" w strukturze USBD_ClassTypeDef inicjalizowany jest funkcją USBD_CDC_Init(), która praktycznie na samym początku wywołuje malloc() poprzez makro USBD_malloc().
Teraz pytanie zasadnicze - czy ja coś zrobiłem źle czy może jednak ludzie z ST są... hmm... jakby to powiedzieć... "niezbyt mądrzy"?