реклама на сайте
подробности

 
 
> HI-TECH C for PIC10/12/16, setjmp / longjmp, увы, их нет... но почему?!
ViKo
сообщение Feb 11 2012, 22:10
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В руководстве данные функции имеются, даже пример показан. В папке с установленным компилятором есть setjmp.h. Только в нем описывается буфер jmp_buf для разных процессоров, кроме тех, для которых этот компилятор создан. Для них есть ответ:
#error setjmp.h: Processor type not supported, or not defined.
Понимаю, что так есть. И вряд ли будет иначе. Выражаю возмущение и разочарование.
Не понимаю, эти переходы принципиально невозможны для PIC16, или просто разработчики поленились сделать. Ведь указатели на функцию умудрились же сделать.
В других компиляторах, вроде, есть. В mikroC, например. Перейти на другой компилятор?
А еще лучше - на другой микроконтроллер.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
XVR
сообщение Feb 13 2012, 08:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(ViKo @ Feb 12 2012, 02:10) *
Не понимаю, эти переходы принципиально невозможны для PIC16, или просто разработчики поленились сделать.
Невозможны. HITECH использует аппаратный стек PIC'ов для вызовов функций, а он програмно недоступен. А т.к. longjmp должен свернуть стек, то сделать это не представляется возможным
Цитата
В других компиляторах, вроде, есть. В mikroC, например.
Как то не верится. Это можно сделать только, если не использовать аппаратный стек, а делать свой собственный. Проигрыш будет гораздо больше, чем возможный выигрыш rolleyes.gif
Цитата
Перейти на другой компилятор?
На другой МК
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 13 2012, 09:22
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(XVR @ Feb 13 2012, 11:12) *
Невозможны. HITECH использует аппаратный стек PIC'ов для вызовов функций, а он програмно недоступен. А т.к. longjmp должен свернуть стек, то сделать это не представляется возможным
Как то не верится. Это можно сделать только, если не использовать аппаратный стек, а делать свой собственный. Проигрыш будет гораздо больше, чем возможный выигрыш rolleyes.gif

Зачем стек? Есть буфер типа jmp_buf.
Туда при вызове setjmp занести младшую и старшую часть адреса, следующего за setjmp, и 0 в wreg.
А longjmp заполнит PCLatH, PCL из буфера, и так вернется назад. Но при этом не сможет передать в wreg нужное значение. Вот в чем проблема, наверное.
Go to the top of the page
 
+Quote Post
XVR
сообщение Feb 13 2012, 10:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Зачем стек? Есть буфер типа jmp_buf.
Туда при вызове setjmp занести младшую и старшую часть адреса, следующего за setjmp, и 0 в wreg.

Кроме PC туда нужно еще занести адрес текущего фрейма стека, т.к. longjmp может быть сделан из вложенной процедуры (по отношению к setjmp). Вот тут и надо будет свернуть стек.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 15 2012, 07:35
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(XVR @ Feb 13 2012, 11:12) *
На другой МК

Жду STM32F050
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 13:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016