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

Вернуться   Форум Микро-Чип > Вопросы начинающих

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

Ответ
 
Опции темы Опции просмотра
Старый 10.11.2016, 10:29   #1
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,098
Вес репутации: 2433/51
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 core timer

как-то возникали общие вопросы по тому, как сделать отложенный запуск и прочее внутри pic32mx.
в силу в целом малой ценности интеллектуальной собственности отложенного запуска самого по себе буду выкладывать те или иные реализации подсистемы отложенного запуска для pic32mx.
API будет время от времени меняться и все такое.
Код под gpl на github.
естественно скорее для справок, нежели прямая команда к использованию.
https://github.com/egan-ru/core-time...out-pref-cache
besogon вне форума   Ответить с цитированием
Старый 10.11.2016, 16:30   #2
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,046
Вес репутации: 3282/68
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: pic32mx core timer

Не засекал, сколько выполняется coretimer_proceed когда все 32 таймера активны?
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 10.11.2016, 16:46   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,098
Вес репутации: 2433/51
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 core timer

yeskela
в зависимости от обработчика.

грубо говоря как это выглядит:
Код:
if(coretimer_reg(&button_device_counter_number)) debug_trap("button init failed");
coretimer_set_handler(button_device_counter_number, (void*)button_ctl);
coretimer_routine_ms(button_device_counter_number, TIME_CALL_MS);
раз примерно в TIME_CALL_MS будет вызываться обработчик кнопок. (button_ctl())

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

на практике, можно обнулять count вначале прерывания таймера ядра и выставлять compare вконце(или вызывать procceed, если в силу каких-то причин обработчики выполнялись столь долго, что таймер ушел за compare).

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

иначе говоря, когда-нибудь дополню этот код с учетом ньюансов.

сейчас он работает в режиме, когда с есть с десяток таймеров, часть из которых активны и некоторые время от времени запускаются.
аля внутри рутины:
Код:
	get_data_params_start:
	cc110l_substate = && get_data_params_end;
	if(__builtin_expect(spi1_add(&cc110l_spi_com),SUCCESS)){
		cc110l_substate = && get_data_params_start;
		coretimer_oneshot_ms(cc110l_fail_counter,5);
	}
	return;
	get_data_params_end:
таймер активен, когда оказалось так, что подсистема была столь занята, что внутри кольцевого буфера транзакций по spi не нашлось места для еще одной записи.
кольцевой буфер записей spi широк и в нем почти всегда находится место для еще запросов на транзакцию по шине - иначе говоря откладывать действие почти никогда не нужно.
однако если допустить, что попытка добавить транзакцию вернет BUSY, то действие будет отложено на 5ms.
besogon вне форума   Ответить с цитированием
Старый 10.11.2016, 17:01   #4
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,046
Вес репутации: 3282/68
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: pic32mx core timer

По диагонали смотрел, проглядел, что у тебя callback прям из прерывания вызываются.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 10.11.2016, 17:06   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,098
Вес репутации: 2433/51
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 core timer

yeskela
да, так и есть.
исправлю позже.
буду сохранять уровень исполнения и возвращать уровень исполнения на время обратного вызова.
сейчас руки не дошли. (иначе говоря для уровня, где это используется в целом нет разницы с каким уровнем исполнения вызываются обратные вызовы, тк. все они вызываются с приоритетом больше, чем основной код).

по сути - накладные расходы на вызов этой подсистемы для 40MHz sys/20MHz pbus (0 ram delay) без pref cache невелики, так что можно не особенно думать о вносимых подсистемой задержках. другой вопрос, что в данный момент упущены мысли о динамической перестройке частоты ядра/периферии под нагрузкой и то, что в некоторых pic32mx есть кеши, которые неплохо бы тоже учесть условной компиляцией.

в основном завязаны какие-то короткие вещи, которые обычно исполняются в таймерах, однако для которых точность не особенно важна.
besogon вне форума   Ответить с цитированием
Старый 17.11.2016, 18:58   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,098
Вес репутации: 2433/51
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 core timer

коммит с более точной системой обратных вызовов.
теперь частично нивелировано влияние времени исполнения обратных вызовов и возможных высокоуровневых прерываний на ход работы подсистемы.
обратным закономерным эффектом является то, что в случае большого колличества реально сложных обратных вызовов из подсистемы может и не выйти(все время будет отдано выполнению запланированных действий, которые к тому же могут и не быть выполнены в срок).
besogon вне форума   Ответить с цитированием
Старый 26.11.2016, 16:05   #7
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,098
Вес репутации: 2433/51
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 core timer

не буду плодить темы.
несколько занимательных мыслей о реализаций для отладки для pic32mx m4k without pref cache.
общих вопросов.
_trap для обработчика исключений.
Код:
	.section .text.trap, code
	.set noreorder
	.set nomips16
	.align 4
	.globl _trap
	.ent _trap
_trap:
	/*check correct*/
	bltz v0, __trap_wrong
	ori k0, zero, TRAP_COUNT
	subu k0, v0, k0
	bgez k0, __trap_wrong
	ssnop
	/*save current stack and gp*/
	sw sp, _s_stack
	sw gp, _s_gp
	/*load k_stack and k_gp*/
	lw sp, _k_stack
	lw sp, _k_gp
	
	/*save*/
	addiu   sp, sp, -8
    /*STATUS, EPC*/
	mfc0	k0, _CP0_STATUS
	sw      k0, 4(sp)
	mfc0	k0, _CP0_EPC
	sw		k0, 0(sp)
	/*enable interrupts*/
	mfc0	k0, _CP0_STATUS
	ins		k0, zero, _CP0_STATUS_EXL_POSITION, 4
	mtc0 k0, _CP0_STATUS
	
	/*
	* should be revorked
	* syscall list should located at 0xXXXX0000 addrs
	* then we can use ins(not sll+addu)
	*/		
	
    la		k0, trap_list
	sll		v0, v0, 2
    addu	k0, k0, v0
	lw		k0, 0(k0)
    jalr	k0
	ssnop
	
	mfc0	k0, _CP0_STATUS
	ori		k0, zero, _CP0_STATUS_EXL_MASK
	mtc0	k0, _CP0_STATUS
	ehb
	lw      k0, 4(sp)
	mtc0	k0, _CP0_STATUS
	lw		k0, 0(sp)
	addiu	k0, 4
	mtc0	k0, _CP0_EPC
	addiu   sp, sp, 8
    lw sp, _s_stack
	lw gp, _s_gp
    ehb
    eret
	ssnop
	
__trap_wrong:
	mfc0	k0, _CP0_EPC
	addiu	k0, 4 
	mtc0	k0, _CP0_EPC
    ehb
    eret
	ssnop
	
  .end _trap

...
void (*trap_list[TRAP_COUNT])() = {
	(void (*)())_trap_bug,
};
для генерации отчета о багах
Код:
__attribute__((used, noinline)) void _trap_bug(char* func_name){
uint32_t status;
	status = __builtin_mfc0(_CP0_STATUS, 0);
	if(!(status&_CP0_STATUS_UM_MASK)){
		/* kernel trap */
#ifdef DEBUG
	__asm__ __volatile__ ("SDBBP");
#endif
		WDTCONCLR = _WDTCON_ON_MASK;
		__printk(func_name);		
#ifdef DEBUG
		while(1);					//we now havent external iface to control bugs
#endif
		WDTCONSET = _WDTCON_ON_MASK;
	}else{
		/*user mode trap not implemented yet*/
	}
}

__attribute__((noinline)) void __bug(const char* message){
	__asm__ __volatile__("ORI $v0, $zero, 0");
	__asm__ __volatile__("TEQI $zero,0");
}

__attribute__((noinline)) void __bug_on(const char* message, bool condition){
	__asm__ __volatile__("ORI $v0, $zero, 0");
	__asm__ __volatile__("TNE $zero, $a1");
}
иначе говоря вызывая BUG() можно отпечатать через интерфейс печати ядра сообщение о том, в какой функции был баг и вызвать софтовый брейкпоинт.

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

в случае хорошего интерфейса ядра, можно реализовать вместо
while(1) нажмите а для ошибки, б для отправки статистики на сервер, с для перезагрузки.

естественно, для ознакомления, а не руководство к тому, что так надо всегда делать.
besogon вне форума   Ответить с цитированием
Ответ

Метки
pic32mx routines


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC core independent peripherals Pridnya Продукция MICROCHIP 58 10.11.2016 12:26
Прерывания PIC32MX Gallean Вопросы начинающих 8 07.10.2016 17:08
PIC18LF13K22. Watchdog timer сам останавливается(?) YBosco Вопросы начинающих 23 30.10.2015 18:34
RTCC в PIC32MX Mahonja Продукция MICROCHIP 1 25.05.2010 11:08
Приоритеты в прерываниях maxNTF Продукция MICROCHIP 21 05.02.2010 00:11


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


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