Mty 0 4 мая Опубликовано 4 мая · Жалоба Приветствую, Подскажите пожалуйста, насколько совместимы сейчас HAL и FreeRTOS в данное время. Существует мнение, что многие функции HAL не подходят для работы во FreeRTOS. Т.к. неентрабельны, отсутствует блокировка ресурсов итд. Так ли это в современной ситуации? Стоит ли писать проект на HAL или осваивать LL? Проект с UART i2c ADC таймерами. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 58 4 мая Опубликовано 4 мая · Жалоба Почему же не совместимы, если CubeIDE в своей поставке напрямую интегрирует FreeRTOS. Блокировка ресурсов достигается ручками программиста, для этого есть возвращаемое значение состояния HAL - HAL_OK, HAL_BUSY, ну и средства FreeRTOS. Вы не ленитесь читать мануалы, на HAL он тоже есть, да и на FreeRTOS тоже. Отличие LL от HAL - непринципиальное, это разновидность реализации низкоуровневого драйвера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 20 4 мая Опубликовано 4 мая · Жалоба все работает, но нужно понимать, что многозадачность требует аккуратного отношения к данным и ресурсам. кубовская ос генерит код с обертками над классической, убирая необходимость думать из прерывания вызов или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 58 4 мая Опубликовано 4 мая (изменено) · Жалоба А самое смешное, что задача с УАРТом, И2Ц, АЦП и таймером решается без каких-либо РТОС 🙂 По крайней мере, мы раньше на такие темы даже и не заморачивались. Это вот сейчас стало модно крутить РТОС даже в светомигалку. Использование ДМА и прерываний, вкупе с системным таймером позволит устаканить указанные четыре вещи без РТОС как за нефик делать. Перечисленные модули все равно же будут работать примерно поочередно, типа пока не будет готов результат АЦП, УАРТ не будет начинать передачу. И наоборот, пока по УАРТу не придет команда запуска АЦП, он не будет запускать процесс измерения. И2С - это наверно какой-нить OLED 128х64. В лучшем случае 🙂 Ну это так, для справки, примерно плюс-минус както так. Изменено 4 мая пользователем EdgeAligned 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mty 0 4 мая Опубликовано 4 мая · Жалоба Да. согласен, делал подобное на последовательности задач, которая крутится в цикле. Такая кооперативная многозадачность. Но после того как попробовал FreeRTOS даже мигание светодиодом буду делать на нем. Настолько все удобно. А вы уверены, что скажем считывание i2c в поллинг режиме через hal не сбойнет, если у задачи не будет отобран timeslice? 7 hours ago, firstvald said: кубовская ос генерит код с обертками над классической, убирая необходимость думать из прерывания вызов или нет. Долго думал над этой фразой, но не понял, могли бы прояснить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 20 4 мая Опубликовано 4 мая · Жалоба в классическом FREERTOS есть различные функции для работы в основном цикле и в прерывании. куб генерит код в котором штатные функции ос запрятаны в кубовские функции которые анализируют откуда происходит вызов : из основного цикла или из прерывания. /** * @brief Release a Semaphore token * @param semaphore_id semaphore object referenced with \ref osSemaphore. * @retval status code that indicates the execution status of the function. * @note MUST REMAIN UNCHANGED: \b osSemaphoreRelease shall be consistent in every CMSIS-RTOS. */ osStatus osSemaphoreRelease (osSemaphoreId semaphore_id) { osStatus result = osOK; portBASE_TYPE taskWoken = pdFALSE; if (inHandlerMode()) { if (xSemaphoreGiveFromISR(semaphore_id, &taskWoken) != pdTRUE) { return osErrorOS; } portEND_SWITCHING_ISR(taskWoken); } else { if (xSemaphoreGive(semaphore_id) != pdTRUE) { result = osErrorOS; } } return result; } кубовская функция освобождения семафора osSemaphoreReease может вызвать xSemaphoreGiveFromISR в прерывании или xSemaphoreGive в основном цикле (или любой задаче) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 58 5 мая Опубликовано 5 мая · Жалоба 6 часов назад, Mty сказал: А вы уверены, что скажем считывание i2c в поллинг режиме через hal не сбойнет Ну если вы косячно напишите, то конечно "сбойнет" 🙂 Ну и учитывая, что I2C очень медленный интерфейс, ожидание прихода байта поллингом - очень нерациональное решение. Есть же для этого прерывания, DMA в конце концов. Никаких сложностей, надо просто понимать, как что делать рационально. Конечно, если понимания этого нет, тогда FreeRTOS услужливо подставляет костыль для обхода сей некомпетентности кодописателя. "Удобно-неудобно"... Неудобно срать спать стоя, остальное фигня, как у нас говорили 🙂 Во многих случаях FreeRTOS - всего лишь маркетинг, предложенный как "удобно". На самом деле, если разобраться, в ней хватает "неудобных" моментов даже более чем. 5 часов назад, firstvald сказал: куб генерит код в котором штатные функции ос запрятаны в кубовские функции Ох мать, еще одна надстройка... Дааа, Куб услужливо подставил еще один костыль для не слишком смышлёных тушканчиков 🙂 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться