Jump to content
    

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

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

Вы это о чём?

Об этом:

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

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

 

Share this post


Link to post
Share on other sites

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

Об этом:

И...???

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

ГДЕ???

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

Share this post


Link to post
Share on other sites

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

ГДЕ???

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...