Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 28.02.2018, 16:29   #1
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/52
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
Question pic18f bootloader с прервываниями

Всем привет.
Подскажите в чем ошибка.
Ранее использовал bootloader без прерываний, все работало замечательно. А с прерываниями ни как не получается запустить.
Вот пример переопределения векторов в загрузчике без прерываний
В bootloader
Код:
#pragma code hight_vector=0x8
void interrupt (void)
	{
	_asm GOTO 0x4008 _endasm	
	}
#pragma code low_vector=0x18
void low_interrupt (void)
	{
	_asm GOTO 0x4018 _endasm	
	}
В основной программе
Код:
#pragma romdata BootloaderProgramMemorySpace = 0x6
const rom char bootloaderProgramMemorySpace[0x4000 - 0x6];

extern void _startup(void);

#pragma code AppVector = 0x4000          
void AppVector(void)
{
	_asm GOTO _startup _endasm
}

#pragma code hight_vector = 0x4008 
	void interrupt (void)
	{
	_asm GOTO hight_isr _endasm	
	}
#pragma code low_vector = 0x4018 
void low_interrupt (void)
{
_asm GOTO low_isr _endasm	
}
В bootloader что делаю с прерываниями
В bootloader isr
Код:
#pragma code hight_vector = 0x8 
	void interrupt (void)
	{
	_asm GOTO hight_isr _endasm	
	}
#pragma code low_vector = 0x18 
	{
	_asm GOTO low_isr _endasm	
	}

#pragma udata access secFboot=0x000
near uchar n_fboot;
#pragma udata access isr
near uchar n_var;
#pragma interrupt hight_isr
void hight_isr(void)
{
if(!n_fboot) 
	{
	_asm GOTO 0x4008 _endasm
	}	
if(PIR1bits.RCIF)
	{
	n_var = RCREG;
	eb_rc[ec_rc] = n_var;
	}
}
#pragma interruptlow low_isr
void low_isr(void)
{
if(!n_fboot) 
	{
	_asm GOTO 0x4018 _endasm
	}
if(INTCONbits.TMR0IF)
	{
	INTCONbits.TMR0IF = 0;
	WriteTimer0(0x63BF);
	Nop();
	}
}
В основной программе делаю как и в первом варианте. Но после ее загрузки, контроллер висит.
n_fboot использую как флаг выбора в какой вектор прерываний переходим, bootloader или основная программа. При старте читаю eeprom, если там указано что нужно загрузить прошивку ставлю его в 1, и загружаю прошивку. Если не нужно, в загрузчике делаю переход на адрес основной программы 0x4000. В основной программе данные по адресу n_fboot не трогаю.
maxNTF вне форума   Ответить с цитированием
Старый 28.02.2018, 16:43   #2
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 58
Сообщений: 2,334
Вес репутации: 3037/94
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: pic18f bootloader с прервываниями

В существо не вникал, однако совершенно непонятно, каким таким образом будет исполнена выходная скобка обработчика (retfie), если внутри него команда goto?
Марк вне форума   Ответить с цитированием
Старый 28.02.2018, 17:18   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: pic18f bootloader с прервываниями

как абсолютно правильно заметил Марк, все это
Код:
_asm GOTO 0x4008 _endasm
конечно не здорово.
besogon вне форума   Ответить с цитированием
Старый 28.02.2018, 17:38   #4
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/52
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: pic18f bootloader с прервываниями

Цитата:
Сообщение от besogon Посмотреть сообщение
как абсолютно правильно заметил Марк, все это
Код:
_asm GOTO 0x4008 _endasm
конечно не здорово.
Я не знаю другого варианта. И что не здорового? Попали мы в вектор прерывания, перескочили в переопределенный вектор основной программы, у которой своя точка выхода.
maxNTF вне форума   Ответить с цитированием
Старый 28.02.2018, 17:45   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: pic18f bootloader с прервываниями

maxNTF
мы не запороли стек?
besogon вне форума   Ответить с цитированием
Старый 28.02.2018, 17:52   #6
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 58
Сообщений: 2,334
Вес репутации: 3037/94
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: pic18f bootloader с прервываниями

Цитата:
Сообщение от maxNTF Посмотреть сообщение
у которой своя точка выхода.
Точка выхода у него может и своя, только в отличии от стандартного обработчика, компилирующего выходную скобку как команда возврата с разрешением глобальных прерываний (retfie), тело иной функции будет завершено скобкой компилируемой как стандартный возврат (return).
Сиречь после однократного входа в такое "прерывание" глобальный флаг разрешения будет сброшен и в момент выхода не установлен.
ЗЫ. Откройте дизасм и убедитесь в оном...
Марк вне форума   Ответить с цитированием
Старый 28.02.2018, 17:55   #7
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/52
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: pic18f bootloader с прервываниями

Цитата:
Сообщение от besogon Посмотреть сообщение
maxNTF
мы не запороли стек?
Вы абсолютно правы, проблема со стеком.
Нужно переход делать не из функции обработчика прерываний, та что в boot, а из места где переопределение векторов. Только я вначале сделал это через Си процедуру условия, а нужно было asm вставкой.
Я в начале сделал так, и у меня стек переполнялся.
Код:
#pragma code hight_vector = 0x8 
	void interrupt (void)
	{
	if(!n_fboot) 
		{
		_asm GOTO GSA_FLASH_HIGHT _endasm
		}
	_asm GOTO hight_isr _endasm	
	}
#pragma code low_vector = 0x18 
void low_interrupt (void)
	{
	if(!n_fboot) 
		{
		_asm GOTO GSA_FLASH_LOW _endasm
		}
	_asm GOTO low_isr _endasm	
	}
А нужно так.
Код:
#pragma code hight_vector = 0x8 
	void interrupt (void)
	{
	_asm btfss n_fboot, 1 _endasm
	_asm GOTO GSA_FLASH_HIGHT _endasm
	_asm GOTO hight_isr _endasm	
	}
#pragma code low_vector = 0x18 
void low_interrupt (void)
	{
	_asm btfss n_fboot, 1 _endasm
	_asm GOTO GSA_FLASH_LOW _endasm
	_asm GOTO low_isr _endasm	
	}
Только компилятор C18 ругается на _asm btfss n_fboot, 0 _endasm.
Не подскажете как это правильно сделать?
maxNTF вне форума   Ответить с цитированием
Старый 28.02.2018, 17:57   #8
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 58
Сообщений: 2,334
Вес репутации: 3037/94
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: pic18f bootloader с прервываниями

Цитата:
Сообщение от besogon Посмотреть сообщение
мы не запороли стек?
Стек останется в порядке, поскольку число вызовов и возвратов будет равно. Проблем на самом деле будет ДВЕ. Одну я озвучил выше, а вторая заключается в порче контекста. Он не будет восстановлен при выходе.
Марк вне форума   Ответить с цитированием
Старый 01.03.2018, 00:46   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,777
Вес репутации: 3483/74
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: pic18f bootloader с прервываниями

Марк
Стек останется в порядке, поскольку число вызовов и возвратов будет равно. - аппаратный стек возвратов да. софтовый стек данных не уверен. не помню abi С18. но в теории на входе в isr в стек будет сохранена часть контекста, которая не сохраняется автоматически, тк. в коде встречается asm вставка, а в случае asm вставок оптимизации вроде как отключаются.

эпилог выполнен, естественно, не будет, тк. внутри asm вставки прыжок.
вот и испортили стек.

как на практике я не знаю. дизасм смотреть надо.

в sdcc в случае объявления naked interrupt можно спокойно писать на asm, тк. будет расположено по адресу 0 8 или 18.
besogon вне форума   Ответить с цитированием
Старый 01.03.2018, 11:03   #10
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/52
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: pic18f bootloader с прервываниями

Так все работает на ура и контекст сохраняется, и возвращается куда нужно.
Код:
#pragma code hight_vector = 0x8 
	void interrupt (void)
	{
	_asm btfss n_fboot, 0, 0 _endasm
	_asm GOTO 0x4008 _endasm
	_asm GOTO hight_isr _endasm	
	}
#pragma code low_vector = 0x18 
void low_interrupt (void)
	{
	_asm btfss n_fboot, 0, 0 _endasm
	_asm GOTO 0x4018 _endasm
	_asm GOTO low_isr _endasm	
	}
Причем глюки были, когда третий параметр команды btfss был = 1. Я в asm не силен, насколько понял он указывает на банк памяти, а поскольку у меня n_fboot находится по адресу 0x5F то это как раз нулевой банк.
maxNTF вне форума   Ответить с цитированием
Старый 01.03.2018, 11:09   #11
maxNTF
Senior Member
 
Регистрация: 12.07.2007
Возраст: 35
Сообщений: 908
Вес репутации: 287/52
maxNTF is a jewel in the roughmaxNTF is a jewel in the roughmaxNTF is a jewel in the rough
По умолчанию Re: pic18f bootloader с прервываниями

P.S.
Директива #pragma interrupt собственно и говорит компилятору, что нужно сохранить контекст. А тот промежуточный goto что находится по адресу вектора прерывания нужен чтоб перенаправить на нужную функцию обработчика прерывания в boot или основной программы. В основной программе эта функция тоже в #pragma interrupt.
По этому из функции f попадаем по адресу вектора прерывания, от туда в нужную функцию boot_isr или flash_isr. И там уже сохраняется контекст функции f и в нее же потом возвращаемся.

Последний раз редактировалось maxNTF; 01.03.2018 в 11:27.
maxNTF вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
USB HID BOOTLOADER PIC24FJ128GB106 Brainiac Продукция MICROCHIP 8 19.04.2016 09:00
HID Bootloader для PIC24F256DA210 abarmail Продукция MICROCHIP 11 14.01.2014 10:41
К готовому проекту "присоединить" bootloader vladtv Продукция MICROCHIP 2 19.02.2011 16:12
Microchip USB HID Bootloader v2.6a, зависание. Specialist Продукция MICROCHIP 23 18.10.2010 20:11
Помогите написать самому Bootloader на С! phase Продукция MICROCHIP 2 28.04.2009 12:11


Часовой пояс GMT +3, время: 06:48.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot