Перейти к содержанию
    

mips-mti-elf не работает .org

Здравствуйте!

Использую cygwin64 и 

mips-mti-elf-gcc.exe (Codescape GNU Tools 2017.10-08 for MIPS MTI Bare Metal) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
И хотел использовать смещение относительно адреса секции прописанной в линкер скрипте

	PROVIDE(isr_start = 0xFFFFFFFFB500E000);
 	_GEN_EXCPT_ADDR   =  0x200 ;
	. = isr_start + _GEN_EXCPT_ADDR; 
	.text.gen_handler :
	{
		_gen_handler_start = .;		
		*(.text.gen_handler)
		*(.text.gen_handler.*)
		KEEP(*(.SW_VEC1_Vector))
		KEEP(*(.CP0_TIM_VEC4_Handler))
		_gen_handler_end = .;
	} 
	 
	.text.SW_VEC1_Vector :
	{
		_SW_VEC1_Vector_start = .;
		*(.text.SW_VEC1_Vector)
		*(.text.SW_VEC1_Vector.*)		
		_SW_VEC1_Vector_end = .;
	} 
   	
   	.text.CP0_TIM_VEC4_Vector :
	{
		_CP0_TIM_VEC4_Vector_start = .;
		*(.text.CP0_TIM_VEC4_Vector)
		*(.text.CP0_TIM_VEC4_Vector.*)	
		_CP0_TIM_VEC4_Vector_end = .;
	} 

Смещение делаю с помощью .org

.section .text.gen_handler
		.set noreorder
        .ent _SW_VEC1_vector
_SW_VEC1_vector:
        .org+ 544
 		la		k0, _SW_VEC1_handler
 		beqz	k0, _SW_VEC1_vector
 		jr		k0
		nop
		nop
		.end _SW_VEC1_vector
		
		.section .text.gen_handler
		.set noreorder
        .ent _CP0_TIM_VEC4_vector
_CP0_TIM_VEC4_vector:
		.org + 640 
		la		k0, _CP0_TIM_VEC4_handler
 		beqz	k0, _CP0_TIM_VEC4_vector
 		jr		k0
		nop
		nop
		.end _CP0_TIM_VEC4_vector

В листинге нужного смещения не наблюдается

Disassembly of section .text.gen_handler:

ffffffffb500e200 <_gen_handler>:
        eret
ffffffffb500e200:	42000018 	eret
		nop
ffffffffb500e204:	00000000 	sll	$0,$0,0x0

ffffffffb500e208 <_SW_VEC1_vector>:
	...
 		la		k0, _SW_VEC1_handler
ffffffffb500e420:	3c1a0000 	lui	$26,0x0
ffffffffb500e424:	3c01b501 	lui	$1,0xb501
ffffffffb500e428:	675a0000 	daddiu	$26,$26,0
ffffffffb500e42c:	6421e500 	daddiu	$1,$1,-6912
ffffffffb500e430:	001ad03c 	dsll32	$26,$26,0x0
ffffffffb500e434:	0341d02d 	daddu	$26,$26,$1
 		beqz	k0, _SW_VEC1_vector
ffffffffb500e438:	1340ff73 	beqz	$26,ffffffffb500e208 <_SW_VEC1_vector>
 		jr		k0
ffffffffb500e43c:	03400008 	jr	$26
		nop
ffffffffb500e440:	00000000 	sll	$0,$0,0x0
		nop
ffffffffb500e444:	00000000 	sll	$0,$0,0x0

ffffffffb500e448 <_CP0_TIM_VEC4_vector>:
	...
		la		k0, _CP0_TIM_VEC4_handler
ffffffffb500e480:	3c1a0000 	lui	$26,0x0
ffffffffb500e484:	3c01b501 	lui	$1,0xb501
ffffffffb500e488:	675a0000 	daddiu	$26,$26,0
ffffffffb500e48c:	6421e824 	daddiu	$1,$1,-6108
ffffffffb500e490:	001ad03c 	dsll32	$26,$26,0x0
ffffffffb500e494:	0341d02d 	daddu	$26,$26,$1
 		beqz	k0, _CP0_TIM_VEC4_vector
ffffffffb500e498:	1340ffeb 	beqz	$26,ffffffffb500e448 <_CP0_TIM_VEC4_vector>
 		jr		k0
ffffffffb500e49c:	03400008 	jr	$26
		nop
ffffffffb500e4a0:	00000000 	sll	$0,$0,0x0
		nop
ffffffffb500e4a4:	00000000 	sll	$0,$0,0x0

Должно быть смещение + 220 и +280 для двух векторов

Прошу помочь, может какой флаг надо установить в мэйке

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё у вас как просили - первая команда по запрошенному смещению. А то, что метка до него - так вы .org после метки поставили 🙂

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое!!!

Теперь почти получилось

Я исправил, согласно Вашем замечанию следующим образом:

	.section .text.gen_handler
		.set noreorder
        .ent _SW_VEC1_vector
		.org + 20
_SW_VEC1_vector:
 		la		k0, _SW_VEC1_handler
 		beqz	k0, _SW_VEC1_vector
 		jr		k0
		nop
		nop
		.end _SW_VEC1_vector

		.section .text.gen_handler/*text.CP0_TIM_VEC4_vector*/
		.set noreorder
        .ent _CP0_TIM_VEC4_vector
		.org + 80 
_CP0_TIM_VEC4_vector:
		la		k0, _CP0_TIM_VEC4_handler
 		beqz	k0, _CP0_TIM_VEC4_vector
 		jr		k0
		nop
		nop
		.end _CP0_TIM_VEC4_vector

и листинг стал почти правильным

Disassembly of section .text.gen_handler:

ffffffffb500e200 <_gen_handler>:
        eret
ffffffffb500e200:	42000018 	eret
	...

ffffffffb500e214 <_SW_VEC1_vector>:
 		la		k0, _SW_VEC1_handler
ffffffffb500e214:	3c1a0000 	lui	$26,0x0
ffffffffb500e218:	3c01b501 	lui	$1,0xb501
ffffffffb500e21c:	675a0000 	daddiu	$26,$26,0
ffffffffb500e220:	6421e300 	daddiu	$1,$1,-7424
ffffffffb500e224:	001ad03c 	dsll32	$26,$26,0x0
ffffffffb500e228:	0341d02d 	daddu	$26,$26,$1
 		beqz	k0, _SW_VEC1_vector
ffffffffb500e22c:	1340fff9 	beqz	$26,ffffffffb500e214 <_SW_VEC1_vector>
 		jr		k0
ffffffffb500e230:	03400008 	jr	$26
		nop
ffffffffb500e234:	00000000 	sll	$0,$0,0x0
	...

ffffffffb500e250 <_CP0_TIM_VEC4_vector>:
		la		k0, _CP0_TIM_VEC4_handler
ffffffffb500e250:	3c1a0000 	lui	$26,0x0
ffffffffb500e254:	3c01b501 	lui	$1,0xb501
ffffffffb500e258:	675a0000 	daddiu	$26,$26,0
ffffffffb500e25c:	6421e624 	daddiu	$1,$1,-6620
ffffffffb500e260:	001ad03c 	dsll32	$26,$26,0x0
ffffffffb500e264:	0341d02d 	daddu	$26,$26,$1
 		beqz	k0, _CP0_TIM_VEC4_vector
ffffffffb500e268:	1340fff9 	beqz	$26,ffffffffb500e250 <_CP0_TIM_VEC4_vector>
 		jr		k0
ffffffffb500e26c:	03400008 	jr	$26
		nop
ffffffffb500e270:	00000000 	sll	$0,$0,0x0
		nop
ffffffffb500e274:	00000000 	sll	$0,$0,0x0

Теперь осталось понять как выронить(хотя пока не понятно в этом ли проблема), в линкере ALIGN(8), - MIPS64

Должно быть 220 и 280 по двум векторам, а сейчас какое то близкое но непонятное смещение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу помочь еще в одном вопросе, - вложенные прерывания.

Как я понимаю это специфика мипс, но не пойму зачем они нужны?

И как их учитывать при портировании RTOS?

Прошу объяснить на пальцах) или подсказать доступную литературу

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/19/2022 at 1:53 PM, addi II said:

Как я понимаю это специфика мипс, но не пойму зачем они нужны?

 

Вкратце - если вы не понимаете, зачем они нужны, то они вам не нужны 🙂

К ним приходят с другой стороны - когда совсем прижмёт, что без них никак, тогда и начинают разбираться.

Их использование очень часто вызывает головную боль разработчика, а уж портирование в RTOS - вообще постоянную мигрень.

On 11/19/2022 at 1:53 PM, addi II said:

Как я понимаю это специфика мипс, но не пойму зачем они нужны?

 

Не только

 

On 11/19/2022 at 1:53 PM, addi II said:

Прошу объяснить на пальцах)

На пальцах всё очень просто - одни прерывания могут возникнуть во время обработки других. Дальше начинаются детали -

  • Обработчики прерываний более не атомарны
  • Время обработки прерывания становится менее детерминированно
  • Если есть стеки прерываний, то придётся заводить разные стеки либо делать более изощрённое переключение стеков
  • RTOS в принципе должна понимать, что прерывания у неё могут вложиться друг в друга

Плюс один - более критичные по времени прерывания будут обрабатываться с минимальной и более детерминированной задержкой

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...