Всем добрый вечер. Начал изучение CAN шины. МК stm32f103 в среде KeilRTX (RTOS) Что бы просканировать реальную шину хотел использовать свободную прогу CANHacker. Судя по описанию протокола, реализовать его не очнь трудно. Как я понял это все, что считали с CAN - передаем на USART в виде ASCII в формате tiiiLDDDDDDDD[0x0D], iii - ID, L - кол-во байт данных, DDD... - собственно данные. В STM32 прием данных с CAN происходит в прерывании. И нужно как можно быстрее завершить процедуру обработки прерывания. В то же время USART довольно медленный канал, что бы вставлять его вызовы в процедуре прерывания. Вопрос: Что если в прерывании полученные данные с CAN шины помещать в очередь сообщений (RTOS). Тогда вывод данных в USART уже не будет ни как влиять на прием и не будет потери фреймов с CAN шины. Имеет ли право на жизнь такая реализация? Не будет ли вызов очереди из процедуры прерывания сильно нагружать саму процедуру?
Комментарии: 35
Shtolcman
Очередь на FreeRtos все равно будет тормозить, делал я систему визуализации подъёмника на базе stm32 с FreeRtos, так вот очередь все равно тормозила всю систему, тогда сделал на кольцевом буфере с указателями головы и хвоста и все пошло. А вообще лучше юзай CANopen, это круче намного, чем голый can)
Pavel
Артур, ему как и мне надо шину в тачке считать, а какой там протокол одному производителю известно)
Shtolcman
А ну моё дело совет подкинуть, а там уже пусть сам ищет варианты
Pavel
Факт :) Почему бы просто не уйти от freertos на LL?
Andrew
как вообще freertos и LL связаны? одно — операционная система, второе — абстракция над железом
Pavel
Чуваку надо просто принимать и отправлять данные Зачем тут целая ОС?
Andrew
господи Ц Е Л А Я О С Ь
Pavel
Давай, стеби меня полностью :D
Andrew
как будто она там биткоины майнит в фоне
Pavel
Но грузит же нещадно, не?
Andrew
да откуда это в вас фактически рантайм фриртоси — это хэндлер на systick при желании можно завести одну задачку и ты фриртось вообще не заметишь а вот примеров, когда человек заводит в main дикий поллинг флага в бесконечном цикле, и задержки на тех же пустых циклах — миллионы в интернетах и по-моему вот это грузит нещадно, а не [проснуться раз в миллисекунду и пробежаться по хэндлерам очередей]
Nikita
Всем ку
Pavel
Понятно дело, но в сравнении отработать по прерываниям и уйти в слип и пробежаться по флагам - шо быстрее?
Andrew
в сферическом в вакууме мире, если все состоит из прерываний, которые друг с другом не связаны — первое быстрее
Pavel
Я тут вспомнил, шо когда работал на военке, нам вообще нельзя было использовать прерывания х)
Andrew
ммм как удобно и быстро реагируешь на все
Pavel
А то
Andrew
вообще странная херня, я тоже работал на военке и вроде с прерываниями проблем не было
Pavel
Заеб начальника
Andrew
вот-вот
Pavel
Типа прерывания долго отлаживать Иди в жопу О, ты используешь указатели в ттаблицах - иди в жопу)
Andrew
так что не «работал на военке», а «работал с одним неординарным руководителем»
Nikita
прерывания реально говно которое долго отлаживать))))
Andrew
да как вы живете-то
Nikita
долго отлаживаем)
Pavel
Не испытывал вообще никаких проблем Шо на аврке, шо на стмке
Nikita
я свое знакомство с арм начинал с прекрасных stellaris производства texas instruments во я там наебался с этими прерываниями)
Pavel
Хехехе
Andrew
за последние три года боли я понял, что если писать нормальный код, и не забивать на организацию многопоточности (не забывая про то, что прерывания — тоже по-сути многопоточность), то странной отладки становится на несколько порядков меньше
Nikita
наебался так что сказал переделывать плату под stm32
Shtolcman
Мудрость приходит с опытом :)
Andrew
а если еще читать даташит, когда заводишь периферию — так количество отладки падает почти до нуля но я пока не достиг такого уровня дзена
Boris
я так генератор кода писал, проскоки есть, но в целом у стм32 за исключением пары косяков всё в норме
Danil
Насколько я знаю, есть стандарты отказоустойчивого кода и там запрещены указатели, думаю прерывание имеет тот же статус. Отладка на железе конечно хорошо, но если у тебя самолёт и там что нибудь тупанет, то типо не кул
Boris
такое не стандартами описано а локальными мифами иначе бы во всех аирспейс контроллерах не было бы прерываний