jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба Только что, adnega сказал: asm("cpsid f"); SCB->SHCSR = (1 << 15); ...и ничего не вызывается! как и следовало ожидать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба Это не приведет к блокировке, а после окончания текущего прерывания вызовется обработчик SVCall. Разумеется, до окончания данного прерывания обработчик SVCall вызван не будет, т.к. у него приоритет ниже -1 (HF). 1 минуту назад, jcxz сказал: ...и ничего не вызывается! как и следовало ожидать Происходит асинхронный вызов SVCall когда-то в будущем. Лог посмотрите и увидите, что SVCall срабатывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 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: А вот если закомментировать asm("cpsid f"), то попадаю в обработчик SVC. И вижу это в логе. PS: Вывод: поведение при программной записи в SHCSR в любом случае как для синхронных fault-ов - как указано в мануале на ядро. При записи через отладчик - есть какие-то несоответствия, почему - можно поискать но не вижу надобности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 9 минут назад, adnega сказал: Что в DelayMcs ? Задержка на количество мкс из 1-го аргумента (на 100мкс). Да неважно что там, так как при комментировании asm("cpsid f") я получаю SVC-fault (мой обработчик fault-ов при этом говорит "произошло SVC с неизвестным номером функции). А если раскомментировать - получаю повисон (это если отключен отладчик, если подключен - останов CPU внутри этой функции). Разница в одной инструкции. Цитата У меня такой код морозит систему на ~7 секунд, а затем все оживает - но именно это поведение в коде и описано. Да, после оживления приходит сообщение от обработчика SVCall. Может у Вас не Cortex-M? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба Цитата Есть ограничение вызова SVC от обычных функций: обычные можно вызывать при запрещённых fault-ах, но если так попытаться сделать с SVC, то очень поплохеет. Соглашаетесь уже, что при запрещенных fault`ах от попытки вызова обработчика SVCаll (через SVCALLPENDED) никому не плохеет. Разумеется, выполнение инструкции svc (swi) в приоритете -1 (и любом выше или равном приоритету SVCall) невозможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 2 минуты назад, adnega сказал: Соглашаетесь уже, что при запрещенных fault`ах от попытки вызова обработчика SVCаll (через SVCALLPENDED) никому не плохеет. В смысле не поплохеет??? Вы мой результат прочитали? "Зависон" - это не поплохеет? И у меня - всё согласно доке на ядро. Почему у вас не так - ищите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 2 минуты назад, jcxz сказал: Да неважно что там Если там что-то связанное с прерываниями, то разумеется работать не должно. Если там цикл на nop`ах или на регистрах таймера, то все Ок. 2 минуты назад, jcxz сказал: Может у Вас не Cortex-M? Cortex-M4. 1 минуту назад, jcxz сказал: В смысле не поплохеет??? Вы мой результат прочитали? "Зависон" - это не поплохеет? Значит сейчас вы замените DelayMcs на asm("nop") и ему также будет плохо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 5 минут назад, adnega сказал: Если там что-то связанное с прерываниями, то разумеется работать не должно. Вы меня за кого держите? Цитата Если там цикл на 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 - текстовая склейка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 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; } Ничего не изменилось. Ищите у себя баг! У меня всё работает согласно мануалу на ядро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 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 У меня не зависает. Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 4 часа назад, adnega сказал: Что насчет такого обрубка: Всё то же самое. И вообще без NOP - то же самое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 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? Туда-ли вообще пишется? И пишется-ли вообще? И запрещаются ли реально фаулт-ы? Сделайте обратное чтение из SHCSR сразу после записи. И из FAULTMASK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 16 июня, 2019 Опубликовано 16 июня, 2019 · Жалоба 10 минут назад, jcxz сказал: Всё то же самое. И вообще без NOP - то же самое. Попробуйте сделать пустой обработчик SVCall (или светодиодиком мигнуть). Скорее всего, у вас обработчик SVCall не готов к асинхронному вызову, т.к. в стеке будет будет далеко не контекст инструкции svc (swi). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться