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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 21.09.2017, 14:12   #1
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,520
Вес репутации: 3061/65
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
По умолчанию pic32mx syscall

почти во всех программах для pic32mx используются вызовы ядра.
традиционно используется механизм syscall
сходу информацию по вопросу трудно найти в поисковике
приведу пример своей реализации, чтобы если кто-либо будет искать, чтобы можно было увидеть, как делал я.
Код:
/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall0(u8 syscall_num)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	__asm__ ("move $2, %0\n\t\
			syscall":: "r"(syscall_num));
	return result;
}

/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall1(u8 syscall_num,
							     u32 arg0)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	__asm__ ("move $2, %0 \n\t\
		move $4, %1 \n\t\
		syscall" ::"r"(syscall_num), "r"(arg0));
	return result;
}

/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall2(u8 syscall_num,
							     u32 arg0,
							     u32 arg1)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	__asm__ ("move $2, %0 \n\t\
		move $4, %1 \n\t\
		move $5, %2 \n\t\
		syscall" ::"r"(syscall_num), "r"(arg0), "r"(arg1));
	return result;
}

/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall3(u8 syscall_num,
							     u32 arg0,
							     u32 arg1,
							     u32 arg2)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	__asm__ ("move $2, %0 \n\t\
		move $4, %1 \n\t\
		move $5, %2 \n\t\
		move $6, %3 \n\t\
		syscall" ::"r" (syscall_num), "r" (arg0), "r"(arg1), "r"(arg2));
	return result;
}

/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall4(u8 syscall_num,
							     u32 arg0,
							     u32 arg1,
							     u32 arg2,
							     u32 arg3)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	__asm__ ("move $2, %0 \n\t\
		move $4, %1 \n\t\
		move $5, %2 \n\t\
		move $6, %3 \n\t\
		move $7, %4 \n\t\
		syscall" ::"r"(syscall_num), "r"(arg0), "r"(arg1), "r"(arg2), "r"(arg3));
	return result;
}

#define GET_MACRO_SYSCALL(syscall_num, arg0, arg1, arg2, arg3, NAME, ...) NAME
#define syscall(...) GET_MACRO_SYSCALL(__VA_ARGS__,\
			syscall4,\
			syscall3,\
			syscall2,\
			syscall1,\
			syscall0\
			)(__VA_ARGS__)
проверял. селекторы работают верно, в обычных условиях вроде изъянов нет.
besogon вне форума   Ответить с цитированием
Старый 21.09.2017, 18:01   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,520
Вес репутации: 3061/65
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: pic32mx syscall

нет, все же изъян есть. нашел изъян. выложу исправленную через пару часов.
besogon вне форума   Ответить с цитированием
Старый 21.09.2017, 18:45   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,520
Вес репутации: 3061/65
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: pic32mx syscall

в общем судя по всему перестановка помогает.
Код:
/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall4(u8 syscall_num,
							     u32 arg0,
							     u32 arg1,
							     u32 arg2,
							     u32 arg3)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	__asm__ ("move $2, %0 \n\t\
		move $7, %4 \n\t\
		move $6, %3 \n\t\
		move $5, %2 \n\t\
		move $4, %1 \n\t\
		syscall" ::"r"(syscall_num), "r"(arg0), "r"(arg1), "r"(arg2), "r"(arg3));
	return result;
}
иначе говоря использование в обратном порядке. соответственно для всех выше. или я все еще не до конца понял gnu inline assembly в static inline функциях.

пробовал clobbers - такое ощущение, что игнорирует рекомендации что колошматить.

+наверняка может сломаться при переходе на другую версию xc32.

Код:
9D0074C0  00003021   ADDU A2, ZERO, ZERO
9D0074C4  3C059D00   LUI A1, -25344
9D0074C8  24A572A0   ADDIU A1, A1, 29344
9D0074CC  3C049D01   LUI A0, -25343
9D0074D0  24848C74   ADDIU A0, A0, -29580
9D0074D4  27838278   ADDIU V1, GP, -32136
9D0074D8  24020001   ADDIU V0, ZERO, 1
9D0074DC  00401021   ADDU V0, V0, ZERO
9D0074E0  00C03821   ADDU A3, A2, ZERO
9D0074E4  00A03021   ADDU A2, A1, ZERO
9D0074E8  00802821   ADDU A1, A0, ZERO
9D0074EC  00602021   ADDU A0, V1, ZERO
9D0074F0  0000000C   SYSCALL
besogon вне форума   Ответить с цитированием
Старый 29.09.2017, 17:46   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,520
Вес репутации: 3061/65
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: pic32mx syscall

реализация выше содержит изъяны, которые могут проявляться в некоторых случаях, как то когда аргументы размазаны по нескольким регистрам.

следующая ревизия, вроде бы, устраняет существующие недостатки.
Код:
/**
 * system call
 * number after syscall is argument count
 */
static inline __attribute__((always_inline)) u32_u32 syscall4(u8 syscall_num,
							     u32 arg0,
							     u32 arg1,
							     u32 arg2,
							     u32 arg3)
{
	volatile register u32_u32 __attribute__((unused)) result asm ("$2");
	volatile register u32 __attribute__((unused)) bogus asm ("$3");
	register u32 a0 asm("$4");
	register u32 a1 asm("$5");
	register u32 a2 asm("$6");
	register u32 a3 asm("$7");
	__asm__ volatile ("move %0, %5 \n\t\
		move %1, %6 \n\t\
		move %2, %7 \n\t\
		move %3, %8 \n\t\
		move %4, %9 \n\t\
		syscall"\
		: "+r"(result), "+r"(a0), "+r"(a1), "+r"(a2), "+r"(a3) \
		: "r"(syscall_num), "r"(arg0), "r"(arg1), "r"(arg2), "r"(arg3));
	return result;
}
касается и остальных.
besogon вне форума   Ответить с цитированием
Старый 29.09.2017, 19:23   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,520
Вес репутации: 3061/65
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: pic32mx syscall

за пределами этого всего в целом ничего нового, как и интересного.
выборка из списков обработчиков, тк. попадает на главный вектор.
Код:
/**
* gen exception handler
* size 0x20	
*/
	.section .gen_handler, code
	.set mips32r2
	.set nomips16
	.set noreorder
	.align 4
	.globl _gen_exception
	.ent _gen_exception
_gen_exception:
	mfc0 k0, _CP0_CAUSE
	andi k0, k0, _CP0_CAUSE_EXCCODE_MASK
	la k1, exception_list
	addu k1, k0, k1
	lw k0, 0(k1)
	jr k0
	ssnop
	.end _gen_exception    
.size	_gen_exception, . - _gen_exception

	
	
/**
* syscall handler
*/
	.section .text.syscall, code
	.set mips32r2	
	.set noreorder
	.set nomips16
	.align 4
	.globl _syscall
	.ent _syscall
_syscall:
	/*check correct*/
	bltz v0, __syscall_wrong
	ori k0, zero, SYSCALL_COUNT
	subu k0, v0, k0
	bgez k0, __syscall_wrong
	lui k0, %hi(syscall_list)
	sll v0, v0, 2
	addu k0, k0, v0
	lw v0, %lo(syscall_list)(k0)
	jr v0
__syscall_wrong:
	mfc0 k0, _CP0_EPC
	addiu k0, k0, 4 
	mtc0 k0, _CP0_EPC
	ori a3, zero, 1
	eret
.end _syscall
.size	_syscall, . - _syscall
besogon вне форума   Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
pic32mx nvm besogon Вопросы начинающих 3 20.03.2017 11:31
pic32mx core timer besogon Вопросы начинающих 6 26.11.2016 16:05
PIC32MX SD Card reader AleIv Продукция MICROCHIP 11 13.02.2015 15:19
Переход с PIC18 на PIC32MX работа с flash памятью smart_pic Продукция MICROCHIP 4 03.11.2014 14:49
RTCC в PIC32MX Mahonja Продукция MICROCHIP 1 25.05.2010 11:08


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


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