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

Только что, adnega сказал:

			asm("cpsid f");
			SCB->SHCSR = (1 << 15);

 

...и ничего не вызывается! как и следовало ожидать  :biggrin:

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


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

Это не приведет к блокировке, а после окончания текущего прерывания вызовется обработчик SVCall.

Разумеется, до окончания данного прерывания обработчик SVCall вызван не будет, т.к. у него приоритет ниже -1 (HF).

1 минуту назад, jcxz сказал:

...и ничего не вызывается! как и следовало ожидать  :biggrin:

Происходит асинхронный вызов SVCall когда-то в будущем. Лог посмотрите и увидите, что SVCall срабатывает.

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


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

23 минуты назад, adnega сказал:

Это не приведет к блокировке, а после окончания текущего прерывания вызовется обработчик SVCall.

Разумеется, до окончания данного прерывания обработчик SVCall вызван не будет, т.к. у него приоритет ниже -1 (HF).

Происходит асинхронный вызов SVCall когда-то в будущем. Лог посмотрите и увидите, что SVCall срабатывает.

МК STM32F429. Установка 15-го бита вручную под отладчиком SWD приводит к вызову SVC после разрешения, да. Но установка этого же бита в режиме run (хоть с подключенным отладчиком хоть без) - приводит к блокировке на инструкции записи - зависанию процессора в этом месте. Так что под отладчиком что-то не так происходит, а без него - всё как и полагается для синхронных fault-ов. Проверено. Код:

static void DteZZ1()
{
  u32 i;
  asm("cpsid f");
  NVIC.SHCSR = (i = NVIC.SHCSR) | B15;
  DelayMcs(100, HrTimerCLK(H));
  NVIC.SHCSR = i;
  __DMB();
  asm("cpsie f");
}

В run-режиме получаю повисон на команде перед STR (в NVIC.SHCSR). Вот здесь и заблокировался CPU:

20190616-162.gif

 

А вот если закомментировать asm("cpsid f"), то попадаю в обработчик SVC. И вижу это в логе.

 

PS: Вывод: поведение при программной записи в SHCSR в любом случае как для синхронных fault-ов - как указано в мануале на ядро. При записи через отладчик - есть какие-то несоответствия, почему - можно поискать но не вижу надобности.

 

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


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

9 минут назад, jcxz сказал:

Установка 15-го бита вручную под отладчиком SWD приводит к вызову SVC после разрешения, да.

;)

9 минут назад, jcxz сказал:

Проверено. Код:

Что в

DelayMcs

?

	asm("cpsid f");
	for(volatile int i = 0; i < 100000000; i++) asm("nop");
	SCB->SHCSR = (1 << 15);
	asm("cpsie f");

У меня такой код морозит систему на ~7 секунд, а затем все оживает - но именно это поведение в коде и описано.

Да, после оживления приходит сообщение от обработчика SVCall.

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


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

9 минут назад, adnega сказал:

Что в


DelayMcs

?

Задержка на количество мкс из 1-го аргумента (на 100мкс).

Да неважно что там, так как при комментировании asm("cpsid f") я получаю SVC-fault (мой обработчик fault-ов при этом говорит "произошло SVC с неизвестным номером функции). А если раскомментировать - получаю повисон (это если отключен отладчик, если подключен - останов CPU внутри этой функции). Разница в одной инструкции.

 

Цитата

У меня такой код морозит систему на ~7 секунд, а затем все оживает - но именно это поведение в коде и описано.

Да, после оживления приходит сообщение от обработчика SVCall.

Может у Вас не Cortex-M?  :biggrin:

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


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

Цитата

Есть ограничение вызова SVC от обычных функций: обычные можно вызывать при запрещённых fault-ах, но если так попытаться сделать с SVC, то очень поплохеет.

Соглашаетесь уже, что при запрещенных fault`ах от попытки вызова обработчика SVCаll (через SVCALLPENDED) никому не плохеет.

Разумеется, выполнение инструкции svc (swi) в приоритете -1 (и любом выше или равном приоритету SVCall) невозможно.

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


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

2 минуты назад, adnega сказал:

Соглашаетесь уже, что при запрещенных fault`ах от попытки вызова обработчика SVCаll (через SVCALLPENDED) никому не плохеет.

В смысле не поплохеет??? Вы мой результат прочитали? "Зависон" - это не поплохеет?  :shok:

И у меня - всё согласно доке на ядро. Почему у вас не так - ищите.

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


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

2 минуты назад, jcxz сказал:

Да неважно что там

Если там что-то связанное с прерываниями, то разумеется работать не должно.

Если там цикл на nop`ах или на регистрах таймера, то все Ок.

2 минуты назад, jcxz сказал:

Может у Вас не Cortex-M?  :biggrin:

Cortex-M4.

1 минуту назад, jcxz сказал:

В смысле не поплохеет??? Вы мой результат прочитали? "Зависон" - это не поплохеет?  :shok:

Значит сейчас вы замените DelayMcs на asm("nop") и ему также будет плохо?

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


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

5 минут назад, adnega сказал:

Если там что-то связанное с прерываниями, то разумеется работать не должно.

Вы меня за кого держите?  :wacko2:

Цитата

Если там цикл на nop`ах или на регистрах таймера, то все Ок.

#define DelayMcs(mcs, clk) HrTimerDelay(mcs2clk(mcs, clk));
//mcs2clk() - макрос преобразует мкс в тики таймера номер nTIM_hr работающего на частоте clk

void HrTimerDelay(u32 tkt)
{
  u32 t, i0, i1 = concat(TIMER, nTIM_hr).CNT;
  do {
    i1 = (i0 = concat(TIMER, nTIM_hr).CNT) - i1;
    tkt = (t = tkt) - i1;
    i1 = i0;
  } while (tkt <= t);
}
//concat - текстовая склейка

 

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


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

8 минут назад, adnega сказал:

Значит сейчас вы замените DelayMcs на asm("nop") и ему также будет плохо?

static int DteZZ1(char const *str, uint, uint)
{
  u32 i;
  asm("cpsid f");
  __ISB();
  __DSB();
  NVIC.SHCSR = (i = NVIC.SHCSR) | B15;
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  NVIC.SHCSR = i & ~B15;
  __ISB();
  __DSB();
  asm("cpsie f");
  return DteRes_OK;
}

Ничего не изменилось.

Ищите у себя баг! У меня всё работает согласно мануалу на ядро.

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


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

39 минут назад, jcxz сказал:

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

Обычно 12 обработчик используют для DebugMonitor. После повышения уровня до -1, он тоже должен перестать работать.

3 минуты назад, jcxz сказал:

static int DteZZ1(char const *str, uint, uint)
{
  u32 i;
  asm("cpsid f");
  __ISB();
  __DSB();
  NVIC.SHCSR = (i = NVIC.SHCSR) | B15;
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  NVIC.SHCSR = i & ~B15;
  __ISB();
  __DSB();
  asm("cpsie f");
  return DteRes_OK;
}

Ничего не изменилось.

Ищите у себя баг! У меня всё работает согласно мануалу на ядро.

У меня все работает ))

Что насчет такого обрубка:

static int DteZZ1(char const *str, uint, uint)
{
  u32 i;
  asm("cpsid f");
  NVIC.SHCSR = B15;
  asm("nop");
  asm("cpsie f");
  return DteRes_OK;
}

 

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


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

	asm("cpsid f");
 800030e:	b671      	cpsid	f
  __ASM volatile ("isb");
 8000310:	f3bf 8f6f 	isb	sy
  __ASM volatile ("dsb");
 8000314:	f3bf 8f4f 	dsb	sy
	SCB->SHCSR = (1 << 15);
 8000318:	f44f 4300 	mov.w	r3, #32768	; 0x8000
 800031c:	626b      	str	r3, [r5, #36]	; 0x24
  __ASM volatile ("isb");
 800031e:	f3bf 8f6f 	isb	sy
  __ASM volatile ("dsb");
 8000322:	f3bf 8f4f 	dsb	sy
	asm("cpsie f");
 8000326:	b661      	cpsie	f

У меня не зависает. Что я делаю не так?

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


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

4 часа назад, adnega сказал:

Что насчет такого обрубка:

Всё то же самое. И вообще без NOP - то же самое.

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


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

4 часа назад, adnega сказал:

	asm("cpsid f");
 800030e:	b671      	cpsid	f
  __ASM volatile ("isb");
 8000310:	f3bf 8f6f 	isb	sy
  __ASM volatile ("dsb");
 8000314:	f3bf 8f4f 	dsb	sy
	SCB->SHCSR = (1 << 15);
 8000318:	f44f 4300 	mov.w	r3, #32768	; 0x8000
 800031c:	626b      	str	r3, [r5, #36]	; 0x24
  __ASM volatile ("isb");
 800031e:	f3bf 8f6f 	isb	sy
  __ASM volatile ("dsb");
 8000322:	f3bf 8f4f 	dsb	sy
	asm("cpsie f");
 8000326:	b661      	cpsie	f

У меня не зависает. Что я делаю не так?

Непонятно - чему у Вас равен R5? Туда-ли вообще пишется? :biggrin:

И пишется-ли вообще? И запрещаются ли реально фаулт-ы? Сделайте обратное чтение из SHCSR сразу после записи. И из FAULTMASK.

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


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

10 минут назад, jcxz сказал:

Всё то же самое. И вообще без NOP - то же самое.

Попробуйте сделать пустой обработчик SVCall (или светодиодиком мигнуть). Скорее всего, у вас обработчик SVCall не готов к асинхронному вызову, т.к. в стеке будет будет далеко не контекст инструкции svc (swi).

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


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

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

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

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

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

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

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

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

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

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