quark 49 March 21, 2023 Posted March 21, 2023 · Report post 1 минуту назад, jcxz сказал: Вы это о чём? Об этом: 15 часов назад, jcxz сказал: функция IntCpuEna() - внутри себя разрешает прерывания (написана на ассемблере). До её вызова по коду прерывания запрещены. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 21, 2023 Posted March 21, 2023 · Report post 1 минуту назад, quark сказал: Об этом: И...??? PS: Ещё раз - прочитайте исходный пост! Если не умеете понимать си-код, лучше вообще не писать. Quote Share this post Link to post Share on other sites More sharing options...
quark 49 March 21, 2023 Posted March 21, 2023 · Report post 3 минуты назад, jcxz сказал: PS: Ещё раз - прочитайте исходный пост! Если не умеете понимать си-код, лучше вообще не писать. Я ваш текст комментирую, а не код (выдранный из контекста). Запрещаете прерывания в одной процедуре, разрешаете - в другой. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 21, 2023 Posted March 21, 2023 · Report post Только что, quark сказал: Запрещаете прерывания в одной процедуре, разрешаете - в другой. ГДЕ??? Процитируйте пожалуйста конкретные строки исходного кода! Quote Share this post Link to post Share on other sites More sharing options...
quark 49 March 21, 2023 Posted March 21, 2023 · Report post 5 минут назад, jcxz сказал: ГДЕ??? Процитируйте пожалуйста конкретные строки исходного кода! Еще раз. Вы в тексте написали, что так делаете. Что там у вас программе - мне неизвестно. Вы привели только ее "обрывок". 1 Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 21, 2023 Posted March 21, 2023 · Report post 4 минуты назад, quark сказал: Что там у вас программе - мне неизвестно. Если не умеете читать и понимать сишный код - проходите мимо, пожалуйста. Очевидно тема не для вас. Quote Share this post Link to post Share on other sites More sharing options...
quark 49 March 21, 2023 Posted March 21, 2023 · Report post 8 минут назад, jcxz сказал: Если не умеете читать и понимать сишный код - проходите мимо, пожалуйста. Очевидно тема не для вас. Вам - про текст, а Вы - про код. И так - три раза подряд. Да, пожалуй, это не для меня... 1 Quote Share this post Link to post Share on other sites More sharing options...
haker_fox 122 March 21, 2023 Posted March 21, 2023 · Report post Модератор: перебранку заканчиваем! Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 321 March 21, 2023 Posted March 21, 2023 · Report post 12 часов назад, jcxz сказал: Возможно. Возможно не хватает спецификатора volatile при их объявлении. Ради интереса открыл сейчас свой крайний проект, в нем файл cmsis_armclang.h имеет определение /** \brief Get Priority Mask \details Returns the current state of the priority mask bit from the Priority Mask Register. \return Priority Mask value */ __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) { uint32_t result; __ASM volatile ("MRS %0, primask" : "=r" (result) ); return(result); } Не совсем понял, что Вы имели в виду под Цитата Или весь макрос ENTR_CRT_SECTION() преобразовать в inline volatile функцию. Но это будет крайне некрасиво (с точки зрения оптимизации такого кода)... Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 21, 2023 Posted March 21, 2023 · Report post 15 минут назад, Arlleex сказал: Ради интереса открыл сейчас свой крайний проект, в нем файл cmsis_armclang.h имеет определение Я из стандартных инклудов IAR использую только intrinsics.h. Там нечто непрозрачное: __IEFF_HS __ATTRIBUTES unsigned long __get_PRIMASK( void ); Хотя в дочерних директориях IAR есть и "cmsis_armcc_V6.h" и "cmsis_gcc.h", в которых присутствует примерно такое же определение, как вы привели. 15 минут назад, Arlleex сказал: Не совсем понял, что Вы имели в виду под Вместо макроса ENTR_CRT_SECTION() написать точно такую же функцию. С inline volatile в префиксе. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 350 March 21, 2023 Posted March 21, 2023 · Report post PS: Если подменить стандартное определение из intrinsics.h определением: __attribute__((always_inline)) static inline u32 get_PRIMASK(void) { u32 result; asm volatile ("MRS %0, PRIMASK" : "=r"(result)); return result; } то проблемные участки кода начинают компилиться адекватно. Хотя отрывать команду MRS Rx, PRIMASK от последующей CPSID I компилятор продолжает. Но не криминально: ... MRS R5, PRIMASK B.N ?Subroutine0 ... ?Subroutine0: (+1) 0xB672 CPSID I ... Но всё же лучше останусь на: #define ENTR_CRT_SECTION() asm volatile(" MRS %0, PRIMASK\n" " CPSID I" : "=&r"(cpu_sr) ::) Quote Share this post Link to post Share on other sites More sharing options...