-
- 1) просто везло или не заметили. У вас счётчик задержки модифицируется и основной задачей и обработчиком прерывания, без каких-либо средств обеспечения атомарности LightElf(67 знак., 03.09.2019 01:11)
- Под Ардуиной я даже прерывания не использую, задержки сделаны на основе millis() - =AK=(03.09.2019 02:13, ссылка)
- Если б я еще знал, что такое millis(). Вообще, использовать setjmp/longjmp нужно аккуратно и вдумчиво, там граблей разложено много. Конкретно у вас есть конструкция res = setjmp(bla-bla), которая, ЕМНИП, с точки зрения стандарта есть Undefined LightElf(724 знак., 03.09.2019 09:54 - 10:20, ссылка)
- millis(0 - стандартная функция Ардуино, возвращает uint32_t, кол-во миллисекунд с момента старта. Об атомарности позаботились в ней. =AK=(2209 знак., 03.09.2019 11:24 - 11:51)
- Кстати, да. Но допилить вроде бы несложно. - SciFi(03.09.2019 10:39)
- Это да. Но там еще грабли есть со стеком. Суть, кагбэ, в том, что вообще говоря никто не гарантирует, что выпрыгнув однажды из функции по longjmp можно будет в нее потом запрыгнуть назад. Компилятор имеет полное право раскладывать на стеке свои LightElf(249 знак., 03.09.2019 11:08)
- Вот, кстати, прекрасная цитата. "Оставь надежду, всяк сюда входящий": SciFi(380 знак., 03.09.2019 11:49)
- Это мне не понятно. Я же не надеюсь на постоянство содержимого стека, при выходе сохраняю контекст, при входе - восстанавливаю. Какая при этом разница, кто там что перезатер в промежутке? - =AK=(03.09.2019 11:30)
- Компилятор имеет полное право раскладывать в стеке свое грязное белье и никому об этом не говорить. - LightElf(03.09.2019 11:55)
- Не вижу, как это соотносится с моим предыдущим высказыванием. - =AK=(03.09.2019 12:16)
- setjmp сохраняет регистры процессора и указатель стека. Содержимое стека она не сохраняет. А там компилятор может разложить всякое, после longjmp это всякое окажется ниже указателя стека и его может порушить любой залетевший дятел. - LightElf(03.09.2019 13:18)
- В описании ограничений coos ясно сказано, что из функций вызывать DELAY() нельзя, можно только из самой задачи. =AK=(410 знак., 03.09.2019 13:32 - 13:57, ссылка)
- Сама задача (COOS_Task0, COOS_Task1 и тыды в файле main.c LightElf(90 знак., 03.09.2019 14:32)
- Угу, функция. Но для ее восстановления стек не нужен, только регистры, а главное - PC. Как из нее вышли, так в нее и вернемся. - =AK=(03.09.2019 14:35)
- Не буду повторяться - LightElf(03.09.2019 14:58, ссылка)
- C ESP32 бабушка натрое сказала =AK=(444 знак., 03.09.2019 15:22 - 15:25)
- Не буду повторяться - LightElf(03.09.2019 14:58, ссылка)
- Угу, функция. Но для ее восстановления стек не нужен, только регистры, а главное - PC. Как из нее вышли, так в нее и вернемся. - =AK=(03.09.2019 14:35)
- Что вижу (сорец на гитхабе) - о том и пою. Обсуждать какой-то другой код за глаза - не готов. - LightElf(03.09.2019 14:08)
- Там к сорцам еще описание приложено, README.md Как интегральная составная часть. А за "проверку на вшивость" - спасибо. - =AK=(03.09.2019 14:12 - 14:26)
- Сама задача (COOS_Task0, COOS_Task1 и тыды в файле main.c LightElf(90 знак., 03.09.2019 14:32)
- В описании ограничений coos ясно сказано, что из функций вызывать DELAY() нельзя, можно только из самой задачи. =AK=(410 знак., 03.09.2019 13:32 - 13:57, ссылка)
- setjmp сохраняет регистры процессора и указатель стека. Содержимое стека она не сохраняет. А там компилятор может разложить всякое, после longjmp это всякое окажется ниже указателя стека и его может порушить любой залетевший дятел. - LightElf(03.09.2019 13:18)
- Не вижу, как это соотносится с моим предыдущим высказыванием. - =AK=(03.09.2019 12:16)
- Компилятор имеет полное право раскладывать в стеке свое грязное белье и никому об этом не говорить. - LightElf(03.09.2019 11:55)
- Э-э, так нечестно. Если компилятор любит так безобразничать, пусть отслеживает, что вот тут longjmp, отставить безобразия. - SciFi(03.09.2019 11:28)
- Это да. Но там еще грабли есть со стеком. Суть, кагбэ, в том, что вообще говоря никто не гарантирует, что выпрыгнув однажды из функции по longjmp можно будет в нее потом запрыгнуть назад. Компилятор имеет полное право раскладывать на стеке свои LightElf(249 знак., 03.09.2019 11:08)
- Если б я еще знал, что такое millis(). Вообще, использовать setjmp/longjmp нужно аккуратно и вдумчиво, там граблей разложено много. Конкретно у вас есть конструкция res = setjmp(bla-bla), которая, ЕМНИП, с точки зрения стандарта есть Undefined LightElf(724 знак., 03.09.2019 09:54 - 10:20, ссылка)
- Под Ардуиной я даже прерывания не использую, задержки сделаны на основе millis() - =AK=(03.09.2019 02:13, ссылка)
- 1) просто везло или не заметили. У вас счётчик задержки модифицируется и основной задачей и обработчиком прерывания, без каких-либо средств обеспечения атомарности LightElf(67 знак., 03.09.2019 01:11)