05-04-2012, 11:11 PM
Здатуте уважаЕмые товарИщи. На языке Си (ну и хрень), конечно лучше чем асемблер, столкнулся с проблемой однопоточности. Вопрос в том, как же вообще аппаратно делают многозадачность. У меня программа компиллируется из Си в ассемблер, потом из ассемблера в HEX (прошивка). Как ни странно, но она однопоточная. Слышал в среде Keil компиллятор Си раскидывает ассемблерные блоки по-очереди из разных потоков. А на практике приходится иметь дело с перываниями. И как же тогда один стек возврата из подпрограмм будет работать в двух потоках. Т.е. один поток вызвал функцию, затем второй поток тоже вызывает функцию, первая функция заканчивается быстрее второй и адрес возврата попадает в код чужого потока?
Пока что в качестве потока использую таймерные прерывания по N мс. Затем обработчик прерывания меняет ID потока и в бесконечном цикле mein выполняется условный переход. Можно попробовать сразу в обработчике менять адрес возврата, по соответствующему потоку, но кажется Си так не умеет, надо чё-то на ассмблере мутить.
Пока что в качестве потока использую таймерные прерывания по N мс. Затем обработчик прерывания меняет ID потока и в бесконечном цикле mein выполняется условный переход. Можно попробовать сразу в обработчике менять адрес возврата, по соответствующему потоку, но кажется Си так не умеет, надо чё-то на ассмблере мутить.