-
- Кооперативную не хотите попробовать? Написана на С, без ассемблера - =AK=(02.09.2019 05:37, ссылка)
- 1) Гм, если размер int не равен разрядности процессора - можно огрести забавных глюков. LightElf(230 знак., 02.09.2019 17:32)
- Я с 8-битными Ардунками пользовал, глюков не заметил. =AK=(112 знак., 03.09.2019 00:17)
- 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)
- Я с 8-битными Ардунками пользовал, глюков не заметил. =AK=(112 знак., 03.09.2019 00:17)
- Спасибо, интересно - Vit(02.09.2019 11:28)
- "Написана без ассемблера", а setjmp и longjmp что такое? - Ale3000(02.09.2019 10:37)
- Это функции стандартной библиотеки С setjmp. =AK=(168 знак., 02.09.2019 11:43)
- Тогда и оператор if/while за ассемблер посчитаем, там же JC/JNC/JZ/JNZ используется. - Dingo(02.09.2019 10:46)
- Нет. Здесь longjmp из одной функции в другую ходит. На С такое сделать нельзя никак. - Ale3000(02.09.2019 11:18)
- Тогда уж и protothreads от Adam Dunkels посмотрите. - Dingo(02.09.2019 06:12 - 06:17, ссылка, ссылка)
- Я смотрел, не понравилось. Вижу единственное достоинство в том, что она вообще ни от чего не зависит. =AK=(212 знак., 02.09.2019 11:47 - 11:54)
- Что не понравилось? Как по мне, НАЗВАНИЯ_МАКРОСОВ оставляют желать, а в остальном всё прекрасно. - SciFi(02.09.2019 12:11)
- Неудобно пользоваться. =AK=(343 знак., 02.09.2019 12:45)
- Нет ничего проще: SciFi(286 знак., 02.09.2019 13:17)
- Ну а в coos это просто DELAY(val); - =AK=(02.09.2019 13:25)
- Можно ещё сократить: DLY(v) :=) - SciFi(02.09.2019 13:29)
- Важнее pt выбросить. На кой этим голову забивать. - =AK=(02.09.2019 13:33)
- Можно ещё сократить: DLY(v) :=) - SciFi(02.09.2019 13:29)
- Ну а в coos это просто DELAY(val); - =AK=(02.09.2019 13:25)
- а как с задержками в функциях, которые вызываются в задачах? - Vit(02.09.2019 13:12)
- Задержки можно только в задачах, это ограничение coos. Нет в мире совершенства. =AK=(298 знак., 02.09.2019 13:16 - 13:18)
- Нет ничего проще: SciFi(286 знак., 02.09.2019 13:17)
- Неудобно пользоваться. =AK=(343 знак., 02.09.2019 12:45)
- Что не понравилось? Как по мне, НАЗВАНИЯ_МАКРОСОВ оставляют желать, а в остальном всё прекрасно. - SciFi(02.09.2019 12:11)
- Я смотрел, не понравилось. Вижу единственное достоинство в том, что она вообще ни от чего не зависит. =AK=(212 знак., 02.09.2019 11:47 - 11:54)
- 1) Гм, если размер int не равен разрядности процессора - можно огрести забавных глюков. LightElf(230 знак., 02.09.2019 17:32)
- Кооперативную не хотите попробовать? Написана на С, без ассемблера - =AK=(02.09.2019 05:37, ссылка)