Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: HI-TECH C for PIC10/12/16, setjmp / longjmp
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ViKo
В руководстве данные функции имеются, даже пример показан. В папке с установленным компилятором есть setjmp.h. Только в нем описывается буфер jmp_buf для разных процессоров, кроме тех, для которых этот компилятор создан. Для них есть ответ:
#error setjmp.h: Processor type not supported, or not defined.
Понимаю, что так есть. И вряд ли будет иначе. Выражаю возмущение и разочарование.
Не понимаю, эти переходы принципиально невозможны для PIC16, или просто разработчики поленились сделать. Ведь указатели на функцию умудрились же сделать.
В других компиляторах, вроде, есть. В mikroC, например. Перейти на другой компилятор?
А еще лучше - на другой микроконтроллер.
XVR
Цитата(ViKo @ Feb 12 2012, 02:10) *
Не понимаю, эти переходы принципиально невозможны для PIC16, или просто разработчики поленились сделать.
Невозможны. HITECH использует аппаратный стек PIC'ов для вызовов функций, а он програмно недоступен. А т.к. longjmp должен свернуть стек, то сделать это не представляется возможным
Цитата
В других компиляторах, вроде, есть. В mikroC, например.
Как то не верится. Это можно сделать только, если не использовать аппаратный стек, а делать свой собственный. Проигрыш будет гораздо больше, чем возможный выигрыш rolleyes.gif
Цитата
Перейти на другой компилятор?
На другой МК
ViKo
Цитата(XVR @ Feb 13 2012, 11:12) *
Невозможны. HITECH использует аппаратный стек PIC'ов для вызовов функций, а он програмно недоступен. А т.к. longjmp должен свернуть стек, то сделать это не представляется возможным
Как то не верится. Это можно сделать только, если не использовать аппаратный стек, а делать свой собственный. Проигрыш будет гораздо больше, чем возможный выигрыш rolleyes.gif

Зачем стек? Есть буфер типа jmp_buf.
Туда при вызове setjmp занести младшую и старшую часть адреса, следующего за setjmp, и 0 в wreg.
А longjmp заполнит PCLatH, PCL из буфера, и так вернется назад. Но при этом не сможет передать в wreg нужное значение. Вот в чем проблема, наверное.
XVR
Цитата
Зачем стек? Есть буфер типа jmp_buf.
Туда при вызове setjmp занести младшую и старшую часть адреса, следующего за setjmp, и 0 в wreg.

Кроме PC туда нужно еще занести адрес текущего фрейма стека, т.к. longjmp может быть сделан из вложенной процедуры (по отношению к setjmp). Вот тут и надо будет свернуть стек.
ViKo
Цитата(XVR @ Feb 13 2012, 11:12) *
На другой МК

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