Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
DzenDyn
0 / 0 / 0
Регистрация: 26.12.2018
Сообщений: 3
1

Управление потоком выполнения

26.12.2018, 22:12. Просмотров 820. Ответов 7
Метки avr (Все метки)

Добрый день.
У меня проблемы с управлением потоком программы. Перешел на ASM с высокоуровневых C# и Python.

В основном потоке "Main" вызывается rcall ChangeState при нажатии кнопки.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; Main =========================================================
Main:
sbic PINB, 0
rjmp Main
rcall ChangeState
cpse state, temp
rjmp Main
rcall ResetState
rjmp Main
; End Main =====================================================
 
 
; Procedure ====================================================
 
ChangeState:
cpi state, 0x00
breq IncState
lsl state
rcall Delay
out PORTD, state
ret
Отсюда при определенном условии прыгаем в IncState

Assembler
1
2
3
4
IncState:
inc state
out PORTD, state
rjmp Main
Здесь у меня были большие надежды вернуться в основной поток "Main:", но даже при наличии rjmp, всеравно происходит выполнение lsl и далее по коду до выхода из процедуры ChangeState.

Подскажите, пожалуйста, как этого избежать? Есть ощущение, что я не правильно использую breq.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2018, 22:12
Ответы с готовыми решениями:

управление дочерним потоком
Как из основного потока узнать что дочерний уже выполнил вою задачу и его можно закрыть? При этом...

Работа с потоком (управление, защита)
Всем добрый день) Требуется момощь для розбора роботы с потоками, создание потока, защита остановка...

Работа с потоком
Добрый день! скрипт1 запускает на выполнение скрипт2 $handle = popen("php script.php" , "r"); ...

Работа с потоком
Если создаю поток по таймеру, каждые 50мс, то хоть как то работает. Но если создаю бесконечный...

ввод потоком
Здраствуйте. Только начинаю изучать этот язык скажите пожалуйста, хочу прочитать потоком из файла...

7
Ethereal
Нарушитель
5197 / 1940 / 251
Регистрация: 17.02.2013
Сообщений: 2,876
27.12.2018, 00:54 2
Лучший ответ Сообщение было отмечено DzenDyn как решение

Решение

rcall ChangeState
эта команда положит на стек адрес возврата для последующей ret
но ты при нулевом state возвращаешься в главный цикл не ret , а
rjmp Main
Т.е. при нулевом state у тебя как пулемет будет выполнятся rcall без ret. И разрастающийся стек моментально затрет собой все ОЗУ. Засирая ОЗУ rcall непременно засрет и переменную state. Она станет ненулевой и тогда выполнится lsl
1
DzenDyn
0 / 0 / 0
Регистрация: 26.12.2018
Сообщений: 3
27.12.2018, 09:12  [ТС] 3
Спасибо за помощь.
Получилось так:

Из основного потока при нажатии кнопки прыгаем в ChangeState, если state == пороговому значению (temp), то прыгаем в ResetState.

Assembler
1
2
3
4
5
6
7
8
Main:
sbic PINB, 0
rjmp Main
rcall ChangeState
cpse state, temp
rjmp Main
rcall ResetState
rjmp Main
Сравниваем state c 0x00,если 0, то прыгаем в it_is, увеличиваем счетчик, делаем задержку, выводим данные в порт и выходим из процедуры (ret), если нет, то выполняем lsl state, прыгаем в конец, делаем задержку, вывод в порт и выходим из процедуры (ret).

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ChangeState:
cpi state, 0x00
breq it_is
it_isnt:
lsl state
rjmp end
it_is:
inc state
end:
rcall Delay
out PORTD, state
ret
 
ResetState:
ldi state, 0b00000000
out PORTD, state
ret

Теперь отрабатывает как надо. Еще раз огромное спасибо за помощь.
0
locm
27.12.2018, 13:35
  #4

Не по теме:

Цитата Сообщение от DzenDyn Посмотреть сообщение
Перешел на ASM с высокоуровневых C# и Python
Для МК есть ЯВУ. Зачем было переходить на асм?

0
Ethereal
27.12.2018, 16:46
  #5

Не по теме:

Цитата Сообщение от locm Посмотреть сообщение
Для МК есть ЯВУ. Зачем было переходить на асм?
На вкус и на цвет ... Я например с асма и не уходил. По моему глупо пытаться обращать других в свою религию.

0
locm
27.12.2018, 17:34
  #6

Не по теме:

Цитата Сообщение от Ethereal Посмотреть сообщение
Я например с асма и не уходил.
Речь не о Вас. ТС имеет опыт разработки на ЯВУ и вероятно ему будет проще для МК также писать на ЯВУ.

0
DzenDyn
27.12.2018, 17:42  [ТС]
  #7

Не по теме:

Я сейчас изучаю МК, и мне кажется, что чтобы лучше изучить архитектуру и работу с переферией МК ASM больше подходит, чем С.
Возможно, потом я буду использовать Си для крупных проектов, но для светодиода с 4 режимами работы и кнопки писать софт на Си – всеравно что из танка по воробьям.

0
COKPOWEHEU
28.12.2018, 10:34     Управление потоком выполнения
  #8

Не по теме:

Цитата Сообщение от DzenDyn Посмотреть сообщение
но для светодиода с 4 режимами работы и кнопки писать софт на Си – всеравно что из танка по воробьям.
Вообще-то наоборот. Для такой программы скорость не критична, а объема камня хватит с запасом, так что можно писать на чем угодно.
Другое дело, что в учебных целях асм лучше, поскольку показывает именно то, что будет делать контроллер, без всяких абстракций, оптимизаций и виртуальных машин. Да и само знание асма разработчику пригодится хотя бы для того, чтобы смотреть дизассемблерный код своих же программ и искать узкие места.
P.S. А чего это все тут серым пишут? Ладно, тоже серым напишу...

0
28.12.2018, 10:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2018, 10:34
Привет! Вот еще темы с ответами:

работа с потоком
есть процедура на появление картинок в таймере procedure TfrmIgra.tmrKal1Timer(Sender: TObject);...

Очередь потоком
Выводятся данные потоком, там же у меня и очередь ( данные массива) , очередь выводит только 10...

работа с потоком
есть текстовый файл с примерно таким сожержанием: 1 5 test 2 9 111 22 12 99 proverka 10 1 1 23...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru