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

Камень в огород ненавистников inline-ассемблера ;) Или превратности си-оптимизации.

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

Вы это о чём?

Об этом:

15 часов назад, jcxz сказал:

функция IntCpuEna() - внутри себя разрешает прерывания (написана на ассемблере). До её вызова по коду прерывания запрещены.

 

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


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

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

Об этом:

И...???

PS: Ещё раз - прочитайте исходный пост! Если не умеете понимать си-код, лучше вообще не писать.

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


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

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

PS: Ещё раз - прочитайте исходный пост! Если не умеете понимать си-код, лучше вообще не писать.

Я ваш текст комментирую, а не код (выдранный из контекста).

Запрещаете прерывания в одной процедуре, разрешаете - в другой.

 

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


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

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

Запрещаете прерывания в одной процедуре, разрешаете - в другой.

ГДЕ???

Процитируйте пожалуйста конкретные строки исходного кода!

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


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

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

ГДЕ???

Процитируйте пожалуйста конкретные строки исходного кода!

Еще раз. Вы в тексте написали, что так делаете. Что там у вас программе - мне неизвестно. Вы привели только ее "обрывок".

 

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


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

4 минуты назад, quark сказал:

Что там у вас программе - мне неизвестно.

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

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


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

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

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

Вам - про текст, а Вы - про код.  И так - три раза подряд. Да, пожалуй, это не для меня...

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


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

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 функцию. Но это будет крайне некрасиво (с точки зрения оптимизации такого кода)...

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


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

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 в префиксе.

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


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

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) ::)

 

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


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

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

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

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

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

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

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

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

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

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