Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR EW3.30A Объявление глобальной метки в CИ-шной функции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Petrooo
Добрый день!
IAR EW3.30A
Возможно ли в СИ-шном модуле внутри какой-либо функции объявить глобальную метку, которою я мог бы "видеть" из другого модуля?
Если интересно, мне это нужно для следующего:

void func1() {
...
GLOBAL_LABEL:
...
}
//-----------------

void func2() {
...
}
//-----------------

void main() {
...
asm ("PUSH.W #GLOBAL_LABEL");
asm ("BR #func2");
...
}

и чтобы после выполнения func2 вернуться не в main, а в func1 на метку GLOBAL_LABEL.
Или все мной вышеописанное можно сделать другим способом?

За ранее благодарю за ответ
dxp
Цитата(Petrooo @ Feb 13 2006, 17:40) *
Добрый день!
IAR EW3.30A
Возможно ли в СИ-шном модуле внутри какой-либо функции объявить глобальную метку, которою я мог бы "видеть" из другого модуля?

Метки в С всегда локальные в пределах функции.

Цитата(Petrooo @ Feb 13 2006, 17:40) *
Если интересно, мне это нужно для следующего:

[...]

и чтобы после выполнения func2 вернуться не в main, а в func1 на метку GLOBAL_LABEL.
Или все мной вышеописанное можно сделать другим способом?

А зачем такое вообще? Сформулируйте полную задачу, может удастся что-то посоветовать.

P.S. Писание на асмовых вставках имеет мало хорошего - оно весьма мешает компилятору оптимизировать код. Если уж нужен асм, то, как правило, лучше целиком на асме и писать. Исключения редки.
Petrooo
Почитал документацию smile.gif
Похоже setjmp и longjmp могут спасти "отца русской демократии" smile.gif

Цитата(dxp @ Feb 13 2006, 15:21) *
А зачем такое вообще? Сформулируйте полную задачу, может удастся что-то посоветовать.


Нужно это вот для чего:
Если какая то критическая секция программы начала выполняться, но не завершилась до конца (к примеру, выключили девайс), то по его включении должна быть возможность возврата на начало критической секции и продолжения выполнения программы с нее.

Полагаю, что многие "завсегдатаи" форума сталкивались с подобной задачей и было бы интересно увидеть какими методами ее решали.
dxp
Цитата(Petrooo @ Feb 13 2006, 18:43) *
Нужно это вот для чего:
Если какая то критическая секция программы начала выполняться, но не завершилась до конца (к примеру, выключили девайс), то по его включении должна быть возможность возврата на начало критической секции и продолжения выполнения программы с нее.

Не понял - если выключили дивайс, то при включении проц все равно будет начинать с вектора сброса независимо от того, в какой точке находился в момент выключения. Другое дело, если, к примеру, при выключении какой-то внешний датчик сигнализирует, что питание пропало и у проца есть время зафиксировать место выполнения программы в энергонезависимой памяти. Но и тут не все просто - контекст программы все равно пропадет. Или что-то я не понял в условиях?
Petrooo
Цитата(dxp @ Feb 13 2006, 15:51) *
Не понял - если выключили дивайс, то при включении проц все равно будет начинать с вектора сброса независимо от того, в какой точке находился в момент выключения. Другое дело, если, к примеру, при выключении какой-то внешний датчик сигнализирует, что питание пропало и у проца есть время зафиксировать место выполнения программы в энергонезависимой памяти. Но и тут не все просто - контекст программы все равно пропадет. Или что-то я не понял в условиях?

Все верно понимаете:
1. при выключении "запоминаем" какую критическую секцию выполняли и выполняли ее вообще.
2. По ключению разумеется "с вектора сброса независимо от того, в какой точке находился в момент выключения".
3. После начальной инициализации анализируем то, что сохранили в энергонезависимой памяти и в зависимости от того, была ли "свертка" (к примеру вырубили питание на печати документа) - идем снова на выполнение данной критической секции (печать документа с номером X) или штатный старт девайса

Еще дополнительная информация, которую мне немешало бы указать еще в начальном посте.
1. Проц MSP430F449
2. "Выключение" питания по кнопке - просто уход проца в LPM3. Соответсвенно при рестарте содержимое переменных в ОЗУ в сегменте DATA16_N не теряется от предыдущего сеанса работы.

Просто нужно корректно вернуться даже не точно в ту ассемблерную команду, на которую указывал SP перед срабатыванием перерывания по кнопке, а на начало критической секции, начинающейся к примеру с метки GLOBAL_LABEL в func1
dxp
Цитата(Petrooo @ Feb 13 2006, 19:21) *
Еще дополнительная информация, которую мне немешало бы указать еще в начальном посте.
1. Проц MSP430F449
2. "Выключение" питания по кнопке - просто уход проца в LPM3. Соответсвенно при рестарте содержимое переменных в ОЗУ в сегменте DATA16_N не теряется от предыдущего сеанса работы.

Просто нужно корректно вернуться даже не точно в ту ассемблерную команду, на которую указывал SP перед срабатыванием перерывания по кнопке, а на начало критической секции, начинающейся к примеру с метки GLOBAL_LABEL в func1

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