|
Прерывания UART MSP430F5437, Объясните тонкости, пожалуйста. |
|
|
|
Oct 6 2010, 06:47
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Джентльмены! Помогите чайнику в освоении, пжалста! Суть вкратце такова. USCI_A имеет один адрес в таблице векторов прерываний на приём и передачу, поэтому при срабатывании прерывания мы сначала влетаем в обработчик, а потом разбираемся, "кто звонил". Прерывание срабатывает только при разрешении локально и GIE, флаги устанавливаются и так. Вектор IV и флаг IFG сбрасываются сразу при входе в прерывание (точнее, при первом чтении IV, которое обычно в примерах анализируется с помощью switch). Ситуация: Сначала по UART передаётся с помощью прерывания 5 байт, после передачи последнего локальные прерывания на передачу запрещаются и разрешаются прерывания на приём. Далее следует приём, скажем, 6 байт. НО! Влетая в обработчик по приёму, программа нормально отрабатывает switch - case:2, после этого заходит в case:4 (передача, хотя она запрещена локально. Флаг, конечно, стоит, куда же он денется.) и передаёт лишний байт. Итог: Передаётся 5 байт, потом ещё 6 при приёме. Откуда это,а? Нет, я понял, что если после каждого case ставить break, то всё будет нормально. Но почему всё-таки? Ведь не должен он попадать внутрь case 4, даже если 2 флага стоят. Прерывания-то по передаче запрещены, и IV просто не должен генериться.
|
|
|
|
|
 |
Ответов
|
Oct 6 2010, 06:55
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Oct 6 2010, 10:47)  Нет, я понял, что если после каждого case ставить break, то всё будет нормально. Но почему всё-таки? То есть что почему? Если вы не поставили break; то ваша программа продолжается дальше, case - это всего лишь метка. И главное, какой резон не ставить break?
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 6 2010, 07:04
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(MrYuran @ Oct 6 2010, 10:55)  То есть что почему? Если вы не поставили break; то ваша программа продолжается дальше, case - это всего лишь метка.
И главное, какой резон не ставить break? Ну да, продолжается. Но IV не может быть равен 4, если при входе он был равен 2. Соответственно, тело case 4: {} выполняться не должно. Так почему же программа заходит в тело и передаёт байт?
|
|
|
|
|
Oct 6 2010, 07:09
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Oct 6 2010, 11:04)  Ну да, продолжается. Но IV не может быть равен 4, если при входе он был равен 2. Соответственно, тело case 4: {} выполняться не должно. Так почему же программа заходит в тело и передаёт байт? Код label_1: DoSomething(); Label_2: DoSomethingElse(); Программе глубоко наплевать, чему равен ваш IV. Она попадает на метку и выполняет от и до. оператор break выкидывает программу из тела цикла или switch. Если его нет, программа идет дальше. Учите матчасть.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 6 2010, 07:17
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820

|
Цитата(MrYuran @ Oct 6 2010, 11:09)  Код label_1: DoSomething(); Label_2: DoSomethingElse(); Программе глубоко наплевать, чему равен ваш IV. Она попадает на метку и выполняет от и до. оператор break выкидывает программу из тела цикла или switch. Если его нет, программа идет дальше. Учите матчасть. ВАХ! А я думе\ал, что switch отрабатывается аналогично if (IV==4) {} if (IV==2) {} А вишь оно как! Чудны дела твои господи! Спасибо, буду теперь знать! Для меня это правда неожиданность!!!
|
|
|
|
|
Oct 6 2010, 07:25
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(1921 @ Oct 6 2010, 11:17)  ВАХ! А я думе\ал, что switch отрабатывается аналогично if (IV==4) {} if (IV==2) {} А вишь оно как! Чудны дела твои господи! Спасибо, буду теперь знать! Для меня это правда неожиданность!!! Скорее, так: if() goto L1; if() goto L2; ... L1: f1(); l2: f2(); ... Это если без оптимизации. С оптимизацией бывает интереснее. В вашем случае это будет что-то типа: goto &(PC + IV); ниже - вплотную таблица переходов Чуете разницу? Одной командой вы переноситесь в нужный обработчик, без перебора вариантов. Быстро и компактно. Кстати, именно так и рекомендуют обрабатывать IV сами техасовцы в своих юзер-гуайдах
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|