У себя в проекте использовал __SWP внутреннюю функцию IAR
В букварях нашел, что в кортексах инструкция SWP заменена на LDREX и STREX. IAR вроде как о них не знает. Покрайней мере из под Си напрямую не нашел как к ним достучатся.
Как быть?
esaulenka
Feb 17 2011, 09:08
В CMSIS есть функции extern uint8_t __LDREXB(uint8_t *addr); extern uint16_t __LDREXH(uint16_t *addr); extern uint32_t __LDREXW(uint32_t *addr);
Подробности - в core_cm3.h
Как оно в IAR'е реализовано, не понял, возможно, что-то подключить надо. В кейле встроенные интрисинки переопределяются.
Alechek
Mar 28 2011, 13:42
Вопрос возникает дальше.... Можно ли все таки заменить SWP инструкцию на пару LDREX - STREX?
Букварь говорит, что мониторится ячейка памяти на экслюзивный доступ. Сразу возникают вопросы 1. Мониторится только одна пара LDREX/STREX? Выполнится ли корректно вложенный доступ, типа
AHTOXA, спасибо, доходчиво разъяснено. Но вот по п.2 правда, остался вопрос. В общем стоит задача, не останавливая таймер (счетчик), прочитать значение и обнулить. Ранее делал с помощью SWP, полагая, что раз операция атомарная, то значение не может изменится во время операции чтения-записи.
scifi
Mar 29 2011, 07:12
Цитата(Alechek @ Mar 29 2011, 09:17)
В общем стоит задача, не останавливая таймер (счетчик), прочитать значение и обнулить. Ранее делал с помощью SWP, полагая, что раз операция атомарная, то значение не может изменится во время операции чтения-записи.
Сомнительный способ. "Операция атомарная" - то есть никто другой не влезет в данную ячейку памяти во время операции. Но вот входит ли аппаратный таймер в категорию "никто другой" - сильно сомневаюсь на этот счёт. Регистр счётчика может быть реализован самыми разными способами, и на SWP я бы не рассчитывал. Добавление: Смотря чего Вы хотите добиться, конечно. Если прочитать значение счётчика, обнулить его и быть уверенным, что между чтением и обнулением счётчик не получал приращения, то, боюсь, SWP не сможет этого гарантировать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.