Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Вопросы по многозадачности
#1
Здатуте уважаЕмые товарИщи. На языке Си (ну и хрень), конечно лучше чем асемблер, столкнулся с проблемой однопоточности. Вопрос в том, как же вообще аппаратно делают многозадачность. У меня программа компиллируется из Си в ассемблер, потом из ассемблера в HEX (прошивка). Как ни странно, но она однопоточная. Слышал в среде Keil компиллятор Си раскидывает ассемблерные блоки по-очереди из разных потоков. А на практике приходится иметь дело с перываниями. И как же тогда один стек возврата из подпрограмм будет работать в двух потоках. Т.е. один поток вызвал функцию, затем второй поток тоже вызывает функцию, первая функция заканчивается быстрее второй и адрес возврата попадает в код чужого потока?

Пока что в качестве потока использую таймерные прерывания по N мс. Затем обработчик прерывания меняет ID потока и в бесконечном цикле mein выполняется условный переход. Можно попробовать сразу в обработчике менять адрес возврата, по соответствующему потоку, но кажется Си так не умеет, надо чё-то на ассмблере мутить.
Ответ
#2
какой у тебя микроконтролер?

Добавлено через 3 минуты
Я очень давно читал статью о много поточности для МК, уже даже и не помню, что там было но суть была такова, что МК не поддерживают много поточность но есть модели в которых это можно на программным образом сделать, работает эта фишка не со всеми МК.
Ответ
#3
DiagoD Написал:какой у тебя микроконтролер?
AVR 8bit

DiagoD Написал:Я очень давно читал статью о много поточности для МК, уже даже и не помню, что там было
Дай ссылку.

DiagoD Написал:МК не поддерживают много поточность но есть модели в которых это можно на программным образом сделать, работает эта фишка не со всеми МК.
Ну это возможно на ARM7-9 и Cortex-е - 32-х битных процах поддерживается. Может где-то и на 16-ти битных. Но использовать такие аппаратные вещи для какой-то мелочной задачи экономически нецелесообразно.

Взгляни, например, на музыкальные центры, там стоят такие же слабые МК, причем успеват все делать и команды обработать и лампочками одновременно помигать и время на экране считать.

Хлорка подумала и вот что решила. Можно попробовать реализовать такую функцию через прерывания таймера, как ранее, но обработчик прерываний будет менять (swap) объекты обработки (задачи) местами по-очереди. При этом в объект задачи должны хранится экземпляры ID-потока и его стек. Т.е. подмена не адреса возврата для какого-то потока, а целого стека. Наверно можно столкнуться с проблемой нехватки оперативки и предварительного его резервирования, но это решаемо куда меньшими затратами. В любом случае наверно тут понядобятся ассеблерные вставки, а я его не люблю.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)