Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: imx233 три функции main
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sergey sva
Подскажите как реализовать такое, может примеры есть.
Нужны три функции main0 main1 main2 Выполняться должны по очереди например 1000 тактов процессора main0, следующие 1000 main1.. выполняться должны не до конца, а останавливаться в любой точке как счетчик отсчитает 1000 тактов,с сохранением всех данных, с последующем их восстановлением. Думаю это нужно делать в startup на asm. Все это нужно сделать на платке с процессором imx233.
demiurg_spb
Тут наверное требуется РТОС c соответствующим планировщиком...
sergey sva
Цитата(demiurg_spb @ Dec 12 2013, 16:45) *
Тут наверное требуется РТОС c соответствующим планировщиком...

Хотелось бы попроще, ртос из за трех функций, ну если только она будет на одном листе кода. )
AlexandrY
Цитата(sergey sva @ Dec 12 2013, 14:42) *
Подскажите как реализовать такое, может примеры есть.
Нужны три функции main0 main1 main2 Выполняться должны по очереди например 1000 тактов процессора main0, следующие 1000 main1.. выполняться должны не до конца, а останавливаться в любой точке как счетчик отсчитает 1000 тактов,с сохранением всех данных, с последующем их восстановлением. Думаю это нужно делать в startup на asm. Все это нужно сделать на платке с процессором imx233.


SoC на ARM9 это не DSP.
Тут +-1000 тактов уже можно промахнуться только из-за непопаданий в кэш.

Крайне неудачная затея.
sergey sva
Не приходилось ничего подобного делать. Такой алгоритм не будет работать?, крутиться цикл в нем идет счет, после отсчета 1000 циклов, сохранить состояние всех регистров счетчик команд ... после записать в счетчик команд адрес следующей функции и востановить все регистры .... отсчитать еще 1000 тактов.?
aoreh
Цитата(sergey sva @ Dec 12 2013, 17:17) *
Не приходилось ничего подобного делать. Такой алгоритм не будет работать?, крутиться цикл в нем идет счет, после отсчета 1000 циклов, сохранить состояние всех регистров счетчик команд ... после записать в счетчик команд адрес следующей функции и востановить все регистры .... отсчитать еще 1000 тактов.?

вы хотите реализовать ОС с раунд-робин щедулером (точнее эту часть ос)
Потом у вас станет вопрос обмена информацией между мэйнами и вы вспомните про примитивы синхронизации, так потихоньку и получится простенька ос типа FreeRTOS и ей подобным
sergey sva
Понятно, все таки удобнее будет использовать ртос. сейчас посмотрю, что пишут freertos.
AlexandrY
Цитата(sergey sva @ Dec 12 2013, 16:17) *
Не приходилось ничего подобного делать. Такой алгоритм не будет работать?, крутиться цикл в нем идет счет, после отсчета 1000 циклов, сохранить состояние всех регистров счетчик команд ... после записать в счетчик команд адрес следующей функции и востановить все регистры .... отсчитать еще 1000 тактов.?


Это обычные прерывания.
Средний джиттер в пару десятков тактов будет (иногда больше), но реализация примитивнейшая.
Запускаете 3-и compare канала в таймерах. Каждый вызывает свое прерывание в которых выполняются задачи, каждая со своим стеком.
Возврата из прерывание не нужно. Просто каждое следующее прерывание восстанавливает свой стек и разрешает прерывание для следующей задачи.
И так они и прерывают друг друга бесконечно.
Но надо знать какие регистры требуют сохранения состояния, а какие нет. Если задачи написаны на C-и.
Поэтому лучше действительно посмотреть, как делается переключение контекста в RTOS uCOS-II
Golikov A.
а как быстро кончиться стэк если каждое прерывание будет вызывать из другого и никогда не возвращаться?
и как новое вызвавшееся прерывание узнает на какой команде прекратило свою работу прошлый его предок?

вот ни разу это не обычные прерывания...
jcxz
Цитата(Golikov A. @ Dec 12 2013, 21:26) *
а как быстро кончиться стэк если каждое прерывание будет вызывать из другого и никогда не возвращаться?
и как новое вызвавшееся прерывание узнает на какой команде прекратило свою работу прошлый его предок?

Есть такая вещь как переключение стека wink.gif
Сохраняете контекст задачи (все регистры) на стеке задачи, переключаетесь на стек следующей задачи, восстанавливаете её регистры... И так по кругу...

Цитата(Golikov A. @ Dec 12 2013, 21:26) *
вот ни разу это не обычные прерывания...

Не знаю как на imx, но на ARM7/9 и Cortex вполне себе обычное.
На ARM-ах и Cortex-ах реализация на асм пишется на раз.
Про джиттер AlexandrY правильно сказал.
sergey sva
imx это тоже arm9 arm926ej-s. Тоже подумал что не должно быть сложно, попробую вначале без ос обойтись, если не получиться тогда уже буду смотреть на freertos. Может какие примеры есть давайте любые ссылки.
Golikov A.
Цитата(jcxz @ Dec 12 2013, 21:17) *
Не знаю как на imx, но на ARM7/9 и Cortex вполне себе обычное.
На ARM-ах и Cortex-ах реализация на асм пишется на раз.
Про джиттер AlexandrY правильно сказал.


у меня другие понятия обычности получаетсяsm.gif
aoreh
Цитата(sergey sva @ Dec 12 2013, 21:32) *
imx это тоже arm9 arm926ej-s. Тоже подумал что не должно быть сложно, попробую вначале без ос обойтись, если не получиться тогда уже буду смотреть на freertos. Может какие примеры есть давайте любые ссылки.

так а че там не получится, получится, конечно, не боги писали ртосы.
просто вопрос в целях-времени, а сложного, конечно, ничего там нет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.